RomanL před 6 roky
rodič
revize
432eda2a4f
59 změnil soubory, kde provedl 3427 přidání a 0 odebrání
  1. 20 0
      modules/boonex/tasks/classes/BxTasksAlertsResponse.php
  2. 23 0
      modules/boonex/tasks/classes/BxTasksCmtsSearchResult.php
  3. 223 0
      modules/boonex/tasks/classes/BxTasksConfig.php
  4. 35 0
      modules/boonex/tasks/classes/BxTasksCronPublishing.php
  5. 117 0
      modules/boonex/tasks/classes/BxTasksDb.php
  6. 237 0
      modules/boonex/tasks/classes/BxTasksFormEntry.php
  7. 23 0
      modules/boonex/tasks/classes/BxTasksFormListEntry.php
  8. 22 0
      modules/boonex/tasks/classes/BxTasksFormsEntryHelper.php
  9. 20 0
      modules/boonex/tasks/classes/BxTasksGridAdministration.php
  10. 24 0
      modules/boonex/tasks/classes/BxTasksMenuAttachments.php
  11. 23 0
      modules/boonex/tasks/classes/BxTasksMenuView.php
  12. 34 0
      modules/boonex/tasks/classes/BxTasksMenuViewActions.php
  13. 384 0
      modules/boonex/tasks/classes/BxTasksModule.php
  14. 23 0
      modules/boonex/tasks/classes/BxTasksPageAuthor.php
  15. 23 0
      modules/boonex/tasks/classes/BxTasksPageBrowse.php
  16. 31 0
      modules/boonex/tasks/classes/BxTasksPageEntry.php
  17. 128 0
      modules/boonex/tasks/classes/BxTasksSearchResult.php
  18. 25 0
      modules/boonex/tasks/classes/BxTasksStudioPage.php
  19. 34 0
      modules/boonex/tasks/classes/BxTasksTemplate.php
  20. 26 0
      modules/boonex/tasks/classes/BxTasksUploaderHTML5.php
  21. 26 0
      modules/boonex/tasks/classes/BxTasksUploaderHTML5Attach.php
  22. 26 0
      modules/boonex/tasks/classes/BxTasksUploaderSimple.php
  23. 26 0
      modules/boonex/tasks/classes/BxTasksUploaderSimpleAttach.php
  24. 149 0
      modules/boonex/tasks/install/config.php
  25. 19 0
      modules/boonex/tasks/install/installer.php
  26. 325 0
      modules/boonex/tasks/install/langs/en.xml
  27. 57 0
      modules/boonex/tasks/install/sql/disable.sql
  28. 321 0
      modules/boonex/tasks/install/sql/enable.sql
  29. 530 0
      modules/boonex/tasks/install/sql/install.sql
  30. 61 0
      modules/boonex/tasks/install/sql/uninstall.sql
  31. 55 0
      modules/boonex/tasks/js/manage_tools.js
  32. 73 0
      modules/boonex/tasks/js/tasks.js
  33. 17 0
      modules/boonex/tasks/request.php
  34. 3 0
      modules/boonex/tasks/template/attachments.html
  35. 1 0
      modules/boonex/tasks/template/author.html
  36. 1 0
      modules/boonex/tasks/template/author_link.html
  37. 1 0
      modules/boonex/tasks/template/badges.html
  38. 37 0
      modules/boonex/tasks/template/browse_tasks.html
  39. 1 0
      modules/boonex/tasks/template/category_list_inline.html
  40. 1 0
      modules/boonex/tasks/template/context.html
  41. 1 0
      modules/boonex/tasks/template/css/categories.css
  42. 1 0
      modules/boonex/tasks/template/css/forms.css
  43. 68 0
      modules/boonex/tasks/template/css/main.css
  44. 1 0
      modules/boonex/tasks/template/css/manage_tools.css
  45. 3 0
      modules/boonex/tasks/template/entry-all-actions.html
  46. 1 0
      modules/boonex/tasks/template/entry-share.html
  47. 1 0
      modules/boonex/tasks/template/entry-text.html
  48. 1 0
      modules/boonex/tasks/template/form_categories.html
  49. 22 0
      modules/boonex/tasks/template/form_ghost_template.html
  50. 16 0
      modules/boonex/tasks/template/form_ghost_template_cover.html
  51. 19 0
      modules/boonex/tasks/template/form_ghost_template_file.html
  52. 22 0
      modules/boonex/tasks/template/form_ghost_template_video.html
  53. 1 0
      modules/boonex/tasks/template/images/check-circle.svg
  54. 1 0
      modules/boonex/tasks/template/images/check-circle1.svg
  55. 43 0
      modules/boonex/tasks/template/images/icons/std-icon.svg
  56. 18 0
      modules/boonex/tasks/template/popup_form.html
  57. 1 0
      modules/boonex/tasks/template/title_link.html
  58. 1 0
      modules/boonex/tasks/template/uploader_button_html5_attach.html
  59. 1 0
      modules/boonex/tasks/template/uploader_button_simple_attach.html

+ 20 - 0
modules/boonex/tasks/classes/BxTasksAlertsResponse.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksAlertsResponse extends BxBaseModTextAlertsResponse
+{
+    public function __construct()
+    {
+        $this->MODULE = 'bx_tasks';
+        parent::__construct();
+    }
+}
+
+/** @} */

+ 23 - 0
modules/boonex/tasks/classes/BxTasksCmtsSearchResult.php

@@ -0,0 +1,23 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksCmtsSearchResult extends BxBaseModGeneralCmtsSearchResult
+{
+    function __construct($sMode = '', $aParams = array())
+    {
+    	$this->sModule = 'bx_tasks';
+
+        parent::__construct($sMode, $aParams);
+
+        $this->aCurrent['title'] = _t('_bx_tasks_page_block_title_browse_cmts');
+    }
+}
+
+/** @} */

+ 223 - 0
modules/boonex/tasks/classes/BxTasksConfig.php

@@ -0,0 +1,223 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import('BxDolInformer');
+
+class BxTasksConfig extends BxBaseModTextConfig
+{
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $aMenuItems2Methods = array (
+            'edit-task' => 'checkAllowedEdit',
+            'delete-task' => 'checkAllowedDelete',
+        );
+
+        $this->CNF = array_merge($this->CNF, array (
+
+            // module icon
+            'ICON' => 'tasks col-red3',
+
+            // database tables
+            'TABLE_ENTRIES' => $aModule['db_prefix'] . 'tasks',
+		    'TABLE_LISTS' => $aModule['db_prefix'] . 'lists',
+            'TABLE_ENTRIES_FULLTEXT' => 'title_text',
+
+            // database fields
+            'FIELD_ID' => 'id',
+            'FIELD_AUTHOR' => 'author',
+            'FIELD_ADDED' => 'added',
+            'FIELD_CHANGED' => 'changed',
+            'FIELD_PUBLISHED' => 'published',
+            'FIELD_TITLE' => 'title',
+            'FIELD_TEXT' => 'text',
+            'FIELD_TEXT_ID' => 'task-text',
+            'FIELD_CATEGORY' => 'cat',
+            'FIELD_MULTICAT' => 'multicat',
+            'FIELD_ALLOW_VIEW_TO' => 'allow_view_to',
+            'FIELD_COVER' => 'covers',
+            'FIELD_PHOTO' => 'pictures',
+            'FIELD_VIDEO' => 'videos',
+            'FIELD_FILE' => 'files',
+            'FIELD_THUMB' => 'thumb',
+            'FIELD_ATTACHMENTS' => 'attachments',
+            'FIELD_VIEWS' => 'views',
+            'FIELD_COMMENTS' => 'comments',
+            'FIELD_STATUS' => 'status',
+            'FIELD_STATUS_ADMIN' => 'status_admin',
+            'FIELD_LABELS' => 'labels',
+			'FIELD_TASKLIST' => 'tasks_list',
+			'FIELD_DUEDATE' => 'due_date',
+			'FIELD_COMPLETED' => 'completed',
+            'FIELD_ANONYMOUS' => 'anonymous',
+            'FIELD_DISABLE_COMMENTS' => 'disable_comments',
+            'FIELDS_WITH_KEYWORDS' => 'auto', // can be 'auto', array of fields or comma separated string of field names, works only when OBJECT_METATAGS is specified
+            'FIELDS_DELAYED_PROCESSING' => 'videos', // can be array of fields or comma separated string of field names
+
+             // some params
+            'PARAM_MULTICAT_ENABLED' => true,
+            'PARAM_MULTICAT_AUTO_ACTIVATION_FOR_CATEGORIES' => 'bx_tasks_auto_activation_for_categories',
+			'PARAM_POLL_ENABLED' => false,
+            
+            // page URIs
+            'URI_VIEW_ENTRY' => 'view-task',
+            'URI_AUTHOR_ENTRIES' => 'tasks-author',
+            'URI_ENTRIES_BY_CONTEXT' => 'tasks-context',
+            'URI_ADD_ENTRY' => 'create-task',
+            'URI_EDIT_ENTRY' => 'edit-task',
+            'URI_MANAGE_COMMON' => 'tasks-manage',
+
+            'URL_HOME' => 'page.php?i=tasks-home',
+            'URL_POPULAR' => 'page.php?i=tasks-popular',
+            'URL_TOP' => 'page.php?i=tasks-top',
+            'URL_UPDATED' => 'page.php?i=tasks-updated',
+            'URL_MANAGE_COMMON' => 'page.php?i=tasks-manage',
+            'URL_MANAGE_ADMINISTRATION' => 'page.php?i=tasks-administration',
+
+            // some params
+            'PARAM_CHARS_SUMMARY' => 'bx_tasks_summary_chars',
+            'PARAM_CHARS_SUMMARY_PLAIN' => 'bx_tasks_plain_summary_chars',
+            'PARAM_NUM_RSS' => 'bx_tasks_rss_num',
+            'PARAM_SEARCHABLE_FIELDS' => 'bx_tasks_searchable_fields',
+            'PARAM_PER_PAGE_BROWSE_SHOWCASE' => 'bx_tasks_per_page_browse_showcase',
+
+            // objects
+            'OBJECT_STORAGE' => 'bx_tasks_covers',
+            'OBJECT_STORAGE_FILES' => 'bx_tasks_files',
+            'OBJECT_STORAGE_PHOTOS' => 'bx_tasks_photos',
+            'OBJECT_STORAGE_VIDEOS' => 'bx_tasks_videos',
+            'OBJECT_IMAGES_TRANSCODER_PREVIEW' => 'bx_tasks_preview',
+            'OBJECT_IMAGES_TRANSCODER_GALLERY' => 'bx_tasks_gallery',
+            'OBJECT_IMAGES_TRANSCODER_COVER' => 'bx_tasks_cover',
+            'OBJECT_IMAGES_TRANSCODER_PREVIEW_FILES' => 'bx_tasks_preview_files',
+            'OBJECT_IMAGES_TRANSCODER_GALLERY_FILES' => 'bx_tasks_gallery_files',
+            'OBJECT_IMAGES_TRANSCODER_PREVIEW_PHOTOS' => 'bx_tasks_preview_photos',
+            'OBJECT_IMAGES_TRANSCODER_GALLERY_PHOTOS' => 'bx_tasks_gallery_photos',
+            'OBJECT_VIDEOS_TRANSCODERS' => array(
+                'poster' => 'bx_tasks_videos_poster', 
+            	'poster_preview' => 'bx_tasks_videos_poster_preview',
+            	'mp4' => 'bx_tasks_videos_mp4', 
+            	'mp4_hd' => 'bx_tasks_videos_mp4_hd'
+            ),
+            'OBJECT_VIDEO_TRANSCODER_HEIGHT' => '480px',
+            'OBJECT_REPORTS' => 'bx_tasks',
+            'OBJECT_VIEWS' => 'bx_tasks',
+            'OBJECT_VOTES' => 'bx_tasks',
+            'OBJECT_REACTIONS' => 'bx_tasks_reactions',
+            'OBJECT_SCORES' => 'bx_tasks',
+            'OBJECT_FAVORITES' => 'bx_tasks',
+            'OBJECT_FEATURED' => 'bx_tasks',
+            'OBJECT_COMMENTS' => 'bx_tasks',
+            'OBJECT_NOTES' => 'bx_tasks_notes',
+            'OBJECT_CATEGORY' => 'bx_tasks_cats',
+			'OBJECT_CONNECTION' => 'bx_tasks_assignments',
+            'OBJECT_PRIVACY_VIEW' => 'bx_tasks_allow_view_to',
+            'OBJECT_FORM_ENTRY' => 'bx_tasks',
+            'OBJECT_FORM_ENTRY_DISPLAY_VIEW' => 'bx_tasks_entry_view',
+            'OBJECT_FORM_ENTRY_DISPLAY_ADD' => 'bx_tasks_entry_add',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT' => 'bx_tasks_entry_edit',
+            'OBJECT_FORM_ENTRY_DISPLAY_DELETE' => 'bx_tasks_entry_delete',
+			
+			'OBJECT_FORM_LIST_ENTRY' => 'bx_tasks_list',
+            'OBJECT_FORM_LIST_ENTRY_DISPLAY_ADD' => 'bx_tasks_list_entry_add',
+            'OBJECT_FORM_LIST_ENTRY_DISPLAY_EDIT' => 'bx_tasks_list_entry_edit',
+			
+            'OBJECT_MENU_ENTRY_ATTACHMENTS' => 'bx_tasks_entry_attachments', // attachments menu in create/edit forms
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY' => 'bx_tasks_view', // actions menu on view entry page
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL' => 'bx_tasks_view_actions', // all actions menu on view entry page
+            'OBJECT_MENU_ACTIONS_MY_ENTRIES' => 'bx_tasks_my', // actions menu on my entries page
+            'OBJECT_MENU_SUBMENU' => 'bx_tasks_submenu', // main module submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY' => 'bx_tasks_view_submenu', // view entry submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_MAIN_SELECTION' => 'tasks-home', // first item in view entry submenu from main module submenu
+            'OBJECT_MENU_SNIPPET_META' => 'bx_tasks_snippet_meta', // menu for snippet meta info
+            'OBJECT_MENU_MANAGE_TOOLS' => 'bx_tasks_menu_manage_tools', //manage menu in content administration tools
+            'OBJECT_GRID_ADMINISTRATION' => 'bx_tasks_administration',
+            'OBJECT_GRID_COMMON' => 'bx_tasks_common',
+            'OBJECT_GRID_CATEGORIES' => 'bx_tasks_categories',
+            'OBJECT_UPLOADERS' => array('bx_tasks_simple', 'bx_tasks_html5'),
+            'OBJECT_CONTENT_INFO' => 'bx_tasks',
+            'OBJECT_CMTS_CONTENT_INFO' => 'bx_tasks_cmts',
+            
+            'BADGES_AVALIABLE' => true,
+			'COOKIE_SETTING_KEY' => 'bx_tasks_filters',
+
+            // menu items which visibility depends on custom visibility checking
+            'MENU_ITEM_TO_METHOD' => array (
+                'bx_tasks_my' => array (
+                    'create-task' => 'checkAllowedAdd',
+                ),
+                'bx_tasks_view' => $aMenuItems2Methods,
+            ),
+
+            // informer messages
+            'INFORMERS' => array (
+                'processing' => array (
+                    'name' => 'bx-tasks-processing',
+                    'map' => array (
+                        'awaiting' => array('msg' => '_bx_tasks_txt_processing_awaiting', 'type' => BX_INFORMER_ALERT),
+                        'failed' => array('msg' => '_bx_tasks_txt_processing_failed', 'type' => BX_INFORMER_ERROR)
+                    ),
+                ),
+                'scheduled' => array (
+                    'name' => 'bx-tasks-scheduled',
+                    'map' => array (
+                        'awaiting' => array('msg' => '_bx_tasks_txt_scheduled_awaiting', 'type' => BX_INFORMER_ALERT),
+                    ),
+                ),
+            ),
+
+            // some language keys
+            'T' => array (
+                'txt_sample_single' => '_bx_tasks_txt_sample_single',
+            	'txt_sample_single_with_article' => '_bx_tasks_txt_sample_single_with_article',
+            	'txt_sample_comment_single' => '_bx_tasks_txt_sample_comment_single',
+            	'txt_sample_vote_single' => '_bx_tasks_txt_sample_vote_single',
+                'txt_sample_reaction_single' => '_bx_tasks_txt_sample_reaction_single',
+                'txt_sample_score_up_single' => '_bx_tasks_txt_sample_score_up_single',
+                'txt_sample_score_down_single' => '_bx_tasks_txt_sample_score_down_single',
+                'form_field_author' => '_bx_tasks_form_entry_input_author',
+            	'grid_action_err_delete' => '_bx_tasks_grid_action_err_delete',
+            	'grid_txt_account_manager' => '_bx_tasks_grid_txt_account_manager',
+                'filter_item_active' => '_bx_tasks_grid_filter_item_title_adm_active',
+            	'filter_item_hidden' => '_bx_tasks_grid_filter_item_title_adm_hidden',
+            	'filter_item_select_one_filter1' => '_bx_tasks_grid_filter_item_title_adm_select_one_filter1',
+            	'menu_item_manage_my' => '_bx_tasks_menu_item_title_manage_my',
+            	'menu_item_manage_all' => '_bx_tasks_menu_item_title_manage_all',
+                'txt_all_entries_by' => '_bx_tasks_txt_all_entries_by',
+                'txt_all_entries_in' => '_bx_tasks_txt_all_entries_in',
+                'txt_all_entries_by_author' => '_bx_tasks_page_title_browse_by_author',
+                'txt_all_entries_by_context' => '_bx_tasks_page_title_browse_by_context',
+                'txt_err_cannot_perform_action' => '_bx_tasks_txt_err_cannot_perform_action',
+            ),
+        ));
+        
+        $this->_aJsClasses = array_merge($this->_aJsClasses, array(
+            'manage_tools' => 'BxTasksManageTools',
+            'categories' => 'BxDolCategories',
+			'tasks' => 'BxTasksView'
+        ));
+
+        $this->_aJsObjects = array_merge($this->_aJsObjects, array(
+            'manage_tools' => 'oBxTasksManageTools',
+            'categories' => 'oBxDolCategories',
+			'tasks' => 'oBxTasksView'
+        ));
+
+        $this->_aGridObjects = array(
+            'common' => $this->CNF['OBJECT_GRID_COMMON'],
+            'administration' => $this->CNF['OBJECT_GRID_ADMINISTRATION'],
+        );
+
+        $this->_bAttachmentsInTimeline = true;
+    }
+}
+
+/** @} */

+ 35 - 0
modules/boonex/tasks/classes/BxTasksCronPublishing.php

@@ -0,0 +1,35 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksCronPublishing extends BxDolCron
+{
+    protected $_sModule;
+    protected $_oModule;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+    	$this->_sModule = 'bx_tasks';
+    	$this->_oModule = BxDolModule::getInstance($this->_sModule);
+    }
+
+    function processing()
+    {
+        $mixedIds = $this->_oModule->_oDb->publishEntries();
+        if($mixedIds === false)
+            return;
+
+        foreach($mixedIds as $iId)
+            $this->_oModule->onPublished($iId);
+    }
+}
+
+/** @} */

+ 117 - 0
modules/boonex/tasks/classes/BxTasksDb.php

@@ -0,0 +1,117 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/*
+ * Module database queries
+ */
+class BxTasksDb extends BxBaseModTextDb
+{
+    function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+	
+	public function getLists ($iContextId = 0)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $sQuery = $this->prepare ("SELECT * FROM `" . $CNF['TABLE_LISTS'] . "` WHERE `context_id` = ?", $iContextId);
+        return $this->getAll($sQuery);
+    }
+	
+	public function getList ($iId = 0)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $sQuery = $this->prepare ("SELECT * FROM `" . $CNF['TABLE_LISTS'] . "` WHERE `id` = ?", $iId);
+        return $this->getRow($sQuery);
+    }
+	
+	public function getTasks ($iContextId = 0, $iListId = 0)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $sQuery = $this->prepare ("SELECT * FROM `" . $CNF['TABLE_ENTRIES'] . "` WHERE  `" . $CNF['FIELD_ALLOW_VIEW_TO'] . "` = ? AND `" . $CNF['FIELD_TASKLIST'] . "` = ?", $iContextId, $iListId);
+        return $this->getAll($sQuery);
+    }
+	
+	public function getEntriesByDate($sDateFrom, $sDateTo, $aSQLPart = array())
+    {
+        // validate input data
+        if (false === ($oDateFrom = date_create($sDateFrom, new DateTimeZone('UTC'))))
+            return array();
+        if (false === ($oDateTo = date_create($sDateTo, new DateTimeZone('UTC'))))
+            return array();
+        if ($oDateFrom > $oDateTo)
+            return array();
+
+        // increase start and end date to cover timezones
+        $oDateFrom = $oDateFrom->sub(new DateInterval("P1D"));
+        $oDateTo = $oDateTo->add(new DateInterval("P1D"));
+
+        // look throught all days in the interval
+        $oDateIter = clone($oDateFrom);
+        $aEntries = array();
+        while ($oDateIter->format('Y-m-d') != $oDateTo->format('Y-m-d')) {
+
+            $oDateMin = date_create($oDateIter->format('Y-m-d') . '00:00:00', new DateTimeZone('UTC'));
+            $oDateMax = date_create($oDateIter->format('Y-m-d') . '23:59:59', new DateTimeZone('UTC'));
+                
+            // get all events for the specific day            
+            $oDateMonthBegin = date_create($oDateIter->format('Y-m-01'), new DateTimeZone('UTC'));
+            $iWeekOfMonth = $oDateIter->format('W') - $oDateMonthBegin->format('W') + 1;
+            $aBindings = array(
+                'timestamp_min' => $oDateMin->getTimestamp(),
+                'timestamp_max' => $oDateMax->getTimestamp(),
+              
+            );
+
+            $sWhere = isset($aSQLPart['where']) ? $aSQLPart['where'] : '';
+            $a = $this->getAll("SELECT DISTINCT `bx_tasks_tasks`.`id`, `bx_tasks_tasks`.`title` AS `title`, `bx_tasks_tasks`.`due_date`
+				FROM `bx_tasks_tasks`
+                WHERE (`bx_tasks_tasks`.`due_date` >= :timestamp_min AND `bx_tasks_tasks`.`due_date` <= :timestamp_max ) $sWhere
+            ", $aBindings);
+
+            // prepare variables for each event
+            $sCurrentDay = $oDateIter->format('Y-m-d');
+            foreach ($a as $k => $r) {
+                $oDateStart = new DateTime();
+                $oDateStart->setTimestamp($r['due_date']);
+                $oDateStart->setTimezone(new DateTimeZone('UTC'));
+                $oDateEnd = new DateTime();
+                $oDateEnd->setTimestamp($r['due_date']);
+                $oDateEnd->setTimezone(new DateTimeZone('UTC'));
+                $oDuration = $oDateStart->diff($oDateEnd);
+
+                $sHoursStart = $oDateStart->format('H:i:s');
+
+                $oStart = date_create($sCurrentDay . ' ' . $sHoursStart, new DateTimeZone('UTC'));
+                $oEnd = $oStart ? clone($oStart) : null;
+                $oEnd = $oEnd ? $oEnd->add($oDuration) : null;
+
+                $a[$k]['start'] = $oStart ? $oStart->format('c') : 0;
+                $a[$k]['end'] = $oEnd ? $oEnd->format('c') : 0;
+                $a[$k]['start_utc'] = $oStart ? $oStart->getTimestamp() : 0;
+                $a[$k]['end_utc'] = $oEnd ? $oEnd->getTimestamp() : 0;
+                $a[$k]['url'] = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oConfig->CNF['URI_VIEW_ENTRY'] . '&id=' . $r['id']);
+            }
+
+            // merge with all other events
+            $aEntries = array_merge($aEntries, $a);
+
+            // go to the next day
+            $oDateIter = $oDateIter->add(new DateInterval("P1D"));
+        }
+
+        return $aEntries;
+    }
+}
+
+/** @} */

+ 237 - 0
modules/boonex/tasks/classes/BxTasksFormEntry.php

@@ -0,0 +1,237 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Create/Edit entry form
+ */
+class BxTasksFormEntry extends BxBaseModTextFormEntry
+{
+    protected $_sGhostTemplateCover = 'form_ghost_template_cover.html';
+	
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_tasks';
+        parent::__construct($aInfo, $oTemplate);
+
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+    	if(isset($CNF['FIELD_COVER']) && isset($this->aInputs[$CNF['FIELD_COVER']])) {
+            if($this->_oModule->checkAllowedSetThumb() === CHECK_ACTION_RESULT_ALLOWED) {
+                $this->aInputs[$CNF['FIELD_COVER']]['storage_object'] = $CNF['OBJECT_STORAGE'];
+                $this->aInputs[$CNF['FIELD_COVER']]['uploaders'] = !empty($this->aInputs[$CNF['FIELD_COVER']]['value']) ? unserialize($this->aInputs[$CNF['FIELD_COVER']]['value']) : $CNF['OBJECT_UPLOADERS'];
+                $this->aInputs[$CNF['FIELD_COVER']]['upload_buttons_titles'] = array(
+                    'Simple' => _t('_bx_tasks_form_entry_input_covers_uploader_simple_title'), 
+                    'HTML5' => _t('_bx_tasks_form_entry_input_covers_uploader_html5_title')
+                );
+                $this->aInputs[$CNF['FIELD_COVER']]['images_transcoder'] = $CNF['OBJECT_IMAGES_TRANSCODER_PREVIEW'];
+                $this->aInputs[$CNF['FIELD_COVER']]['storage_private'] = 0;
+                $this->aInputs[$CNF['FIELD_COVER']]['multiple'] = false;
+                $this->aInputs[$CNF['FIELD_COVER']]['content_id'] = 0;
+                $this->aInputs[$CNF['FIELD_COVER']]['ghost_template'] = '';
+            }
+            else
+                unset($this->aInputs[$CNF['FIELD_COVER']]);
+        }
+
+        if(isset($CNF['FIELD_PHOTO']) && isset($this->aInputs[$CNF['FIELD_PHOTO']])) {
+            $this->aInputs[$CNF['FIELD_PHOTO']]['storage_object'] = $CNF['OBJECT_STORAGE_PHOTOS'];
+            $this->aInputs[$CNF['FIELD_PHOTO']]['uploaders'] = !empty($this->aInputs[$CNF['FIELD_PHOTO']]['value']) ? unserialize($this->aInputs[$CNF['FIELD_PHOTO']]['value']) : $CNF['OBJECT_UPLOADERS'];
+            $this->aInputs[$CNF['FIELD_PHOTO']]['images_transcoder'] = $CNF['OBJECT_IMAGES_TRANSCODER_PREVIEW_PHOTOS'];
+            $this->aInputs[$CNF['FIELD_PHOTO']]['storage_private'] = 0;
+            $this->aInputs[$CNF['FIELD_PHOTO']]['multiple'] = true;
+            $this->aInputs[$CNF['FIELD_PHOTO']]['content_id'] = 0;
+            $this->aInputs[$CNF['FIELD_PHOTO']]['ghost_template'] = '';
+            $this->aInputs[$CNF['FIELD_PHOTO']]['tr_attrs'] = array('class'=> 'bx-base-text-attachment-item');
+        }
+
+        if(isset($this->aInputs[$CNF['FIELD_VIDEO']])) {
+            $this->aInputs[$CNF['FIELD_VIDEO']]['storage_object'] = $CNF['OBJECT_STORAGE_VIDEOS'];
+            $this->aInputs[$CNF['FIELD_VIDEO']]['uploaders'] = !empty($this->aInputs[$CNF['FIELD_VIDEO']]['value']) ? unserialize($this->aInputs[$CNF['FIELD_VIDEO']]['value']) : $CNF['OBJECT_UPLOADERS'];
+            $this->aInputs[$CNF['FIELD_VIDEO']]['images_transcoder'] = $CNF['OBJECT_VIDEOS_TRANSCODERS']['poster_preview'];
+            $this->aInputs[$CNF['FIELD_VIDEO']]['storage_private'] = 0;
+            $this->aInputs[$CNF['FIELD_VIDEO']]['multiple'] = true;
+            $this->aInputs[$CNF['FIELD_VIDEO']]['content_id'] = 0;
+            $this->aInputs[$CNF['FIELD_VIDEO']]['ghost_template'] = '';
+            $this->aInputs[$CNF['FIELD_VIDEO']]['tr_attrs'] = array('class'=> 'bx-base-text-attachment-item');
+        }
+
+        if (isset($CNF['FIELD_FILE']) && isset($this->aInputs[$CNF['FIELD_FILE']])) {
+            $this->aInputs[$CNF['FIELD_FILE']]['storage_object'] = $CNF['OBJECT_STORAGE_FILES'];
+            $this->aInputs[$CNF['FIELD_FILE']]['uploaders'] = !empty($this->aInputs[$CNF['FIELD_FILE']]['value']) ? unserialize($this->aInputs[$CNF['FIELD_FILE']]['value']) : $CNF['OBJECT_UPLOADERS'];
+            $this->aInputs[$CNF['FIELD_FILE']]['images_transcoder'] = $CNF['OBJECT_IMAGES_TRANSCODER_PREVIEW_FILES'];
+            $this->aInputs[$CNF['FIELD_FILE']]['storage_private'] = 0;
+            $this->aInputs[$CNF['FIELD_FILE']]['multiple'] = true;
+            $this->aInputs[$CNF['FIELD_FILE']]['content_id'] = 0;
+            $this->aInputs[$CNF['FIELD_FILE']]['ghost_template'] = '';
+            $this->aInputs[$CNF['FIELD_FILE']]['tr_attrs'] = array('class'=> 'bx-base-text-attachment-item');
+        }
+		
+		if (isset($this->aInputs['initial_members']) && !isset($this->aInputs['initial_members']['value'])) {
+			if (bx_get('id')){
+				$oConn = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTION']);
+				$this->aInputs['initial_members']['value'] = $oConn->getConnectedContent(bx_get('id'));
+			}
+			else{
+				$this->aInputs['initial_members']['value'] = array(bx_get_logged_profile_id());
+			}
+			
+        }
+    }
+
+	function getCode($bDynamicMode = false)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $sResult = parent::getCode($bDynamicMode);
+		$sInclude = $this->_oModule->_oTemplate->addJs(array('tasks.js'), $bDynamicMode);
+		$sResult .= ($bDynamicMode ? $sInclude : '') . $this->_oModule->_oTemplate->getJsCode('tasks');
+    	return $sResult;
+    }
+	
+    function initChecker ($aValues = array (), $aSpecificValues = array())
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $bValues = $aValues && !empty($aValues['id']);
+        $aContentInfo = $bValues ? $this->_oModule->_oDb->getContentInfoById($aValues['id']) : false;
+
+        if($this->aParams['display'] == $CNF['OBJECT_FORM_ENTRY_DISPLAY_EDIT'] && isset($CNF['FIELD_PUBLISHED']) && isset($this->aInputs[$CNF['FIELD_PUBLISHED']]))
+            if($bValues && in_array($aValues[$CNF['FIELD_STATUS']], array('active', 'hidden')))
+                unset($this->aInputs[$CNF['FIELD_PUBLISHED']]);
+
+        if (isset($CNF['FIELD_COVER']) && isset($this->aInputs[$CNF['FIELD_COVER']])) {
+            if($bValues)
+                $this->aInputs[$CNF['FIELD_COVER']]['content_id'] = $aValues['id'];
+
+            $this->aInputs[$CNF['FIELD_COVER']]['ghost_template'] = $this->_oModule->_oTemplate->parseHtmlByName($this->_sGhostTemplateCover, $this->_getCoverGhostTmplVars($aContentInfo));
+        }
+
+        parent::initChecker ($aValues, $aSpecificValues);
+    }
+
+    public function insert ($aValsToAdd = array(), $isIgnore = false)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(isset($CNF['FIELD_ADDED']) && empty($aValsToAdd[$CNF['FIELD_ADDED']])) {
+            $iAdded = 0;
+            if(isset($this->aInputs[$CNF['FIELD_ADDED']]))
+                $iAdded = $this->getCleanValue($CNF['FIELD_ADDED']);
+            
+            if(empty($iAdded))
+                 $iAdded = time();
+
+            $aValsToAdd[$CNF['FIELD_ADDED']] = $iAdded;
+        }
+
+        if(empty($aValsToAdd[$CNF['FIELD_PUBLISHED']])) {
+            $iPublished = 0;
+            if(isset($this->aInputs[$CNF['FIELD_PUBLISHED']]))
+                $iPublished = $this->getCleanValue($CNF['FIELD_PUBLISHED']);
+                
+             if(empty($iPublished))
+                 $iPublished = time();
+
+             $aValsToAdd[$CNF['FIELD_PUBLISHED']] = $iPublished;
+        }
+
+        $aValsToAdd[$CNF['FIELD_STATUS']] = $aValsToAdd[$CNF['FIELD_PUBLISHED']] > $aValsToAdd[$CNF['FIELD_ADDED']] ? 'awaiting' : 'active';
+
+        $iContentId = parent::insert ($aValsToAdd, $isIgnore);
+        if(!empty($iContentId)){
+            $this->processFiles($CNF['FIELD_COVER'], $iContentId, true);
+			
+			if(isset($this->aInputs['initial_members'])) {
+				$this->_setAssignments($iContentId, $this->aInputs['initial_members']['value']);
+			}
+        }
+        return $iContentId;
+    }
+
+    function update ($iContentId, $aValsToAdd = array(), &$aTrackTextFieldsChanges = null)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(empty($aValsToAdd[$CNF['FIELD_PUBLISHED']]) && isset($this->aInputs[$CNF['FIELD_PUBLISHED']])) {
+            $iPublished = $this->getCleanValue($CNF['FIELD_PUBLISHED']);
+            if(empty($iPublished))
+                $iPublished = time();
+
+            $aValsToAdd[$CNF['FIELD_PUBLISHED']] = $iPublished;
+        }
+		
+		if(isset($this->aInputs['initial_members'])) {
+			$this->_setAssignments($iContentId, $this->aInputs['initial_members']['value']);
+		}
+		
+		$aContentInfo = $this->_oModule->_oDb->getContentInfoById($iContentId);
+		$aValsToAdd[$CNF['FIELD_ALLOW_VIEW_TO']] = $aContentInfo[$CNF['FIELD_ALLOW_VIEW_TO']];
+	
+        $iResult = parent::update ($iContentId, $aValsToAdd, $aTrackTextFieldsChanges);
+        $this->processFiles($CNF['FIELD_COVER'], $iContentId, false);   
+        return $iResult;
+    }
+
+    protected function _getCoverGhostTmplVars($aContentInfo = array())
+    {
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+    	return array (
+            'name' => $this->aInputs[$CNF['FIELD_COVER']]['name'],
+            'content_id' => $this->aInputs[$CNF['FIELD_COVER']]['content_id'],
+            'editor_id' => isset($CNF['FIELD_TEXT_ID']) ? $CNF['FIELD_TEXT_ID'] : '',
+            'thumb_id' => isset($CNF['FIELD_THUMB']) && isset($aContentInfo[$CNF['FIELD_THUMB']]) ? $aContentInfo[$CNF['FIELD_THUMB']] : 0,
+            'name_thumb' => isset($CNF['FIELD_THUMB']) ? $CNF['FIELD_THUMB'] : ''
+        );
+    }
+
+    protected function _getPhotoGhostTmplVars($aContentInfo = array())
+    {
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+    	return array (
+            'name' => $this->aInputs[$CNF['FIELD_PHOTO']]['name'],
+            'content_id' => (int)$this->aInputs[$CNF['FIELD_PHOTO']]['content_id'],
+            'editor_id' => isset($CNF['FIELD_TEXT_ID']) ? $CNF['FIELD_TEXT_ID'] : ''
+    	);
+    }
+	
+	protected function _setAssignments($iContentId, $aMembers)
+    {
+		$CNF = &$this->_oModule->_oConfig->CNF;
+		$oConn = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTION']);
+		
+		$aMembers2 = $oConn->getConnectedContent($iContentId);
+		
+		$aToAdd = array_diff($aMembers, $aMembers2);
+		$aToRemove = array_diff($aMembers2, $aMembers);
+		
+		foreach($aToAdd as $iProfileId){
+			$oConn->actionAdd($iProfileId, $iContentId);
+		}
+		
+		foreach($aToRemove as $iProfileId){
+			$oConn->actionRemove($iProfileId, $iContentId);
+		}
+	}
+	
+	protected function genCustomInputInitialMembers ($aInput)
+    {
+        $aInput['ajax_get_suggestions'] = BX_DOL_URL_ROOT . "modules/?r=" . $this->_oModule->_oConfig->getUri() . "/ajax_get_initial_members";
+        return $this->genCustomInputUsernamesSuggestions($aInput);
+    }
+	
+	protected function genCustomInputTasksList(&$aInput)
+    {
+        return $this->genInputStandard($aInput);
+    }
+}
+
+/** @} */

+ 23 - 0
modules/boonex/tasks/classes/BxTasksFormListEntry.php

@@ -0,0 +1,23 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Create/Edit list entry form
+ */
+class BxTasksFormListEntry extends BxTemplFormView
+{	
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_tasks';
+        parent::__construct($aInfo, $oTemplate);
+	}
+}
+
+/** @} */

+ 22 - 0
modules/boonex/tasks/classes/BxTasksFormsEntryHelper.php

@@ -0,0 +1,22 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Entry forms helper functions
+ */
+class BxTasksFormsEntryHelper extends BxBaseModTextFormsEntryHelper
+{
+    public function __construct($oModule)
+    {
+        parent::__construct($oModule);
+    }
+}
+
+/** @} */

+ 20 - 0
modules/boonex/tasks/classes/BxTasksGridAdministration.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ * 
+ * @{
+ */
+
+class BxTasksGridAdministration extends BxBaseModTextGridAdministration
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+    	$this->MODULE = 'bx_tasks';
+        parent::__construct ($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/tasks/classes/BxTasksMenuAttachments.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * View entry menu
+ */
+class BxTasksMenuAttachments extends BxBaseModTextMenuAttachments
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->_sModule = 'bx_tasks';
+
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 23 - 0
modules/boonex/tasks/classes/BxTasksMenuView.php

@@ -0,0 +1,23 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * View entry menu
+ */
+class BxTasksMenuView extends BxBaseModTextMenuView
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_tasks';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 34 - 0
modules/boonex/tasks/classes/BxTasksMenuViewActions.php

@@ -0,0 +1,34 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * View entry social actions menu
+ */
+class BxTasksMenuViewActions extends BxBaseModTextMenuViewActions
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->_sModule = 'bx_tasks';
+        parent::__construct($aObject, $oTemplate);
+		$this->addMarkers(array('js_object' => $this->_oModule->_oConfig->getJsObject('tasks')));
+    }
+
+    protected function _getMenuItemEditTask($aItem)
+    {
+        return $this->_getMenuItemByNameActions($aItem);
+    }
+
+    protected function _getMenuItemDeleteTask($aItem)
+    {
+        return $this->_getMenuItemByNameActions($aItem);
+    }
+}
+
+/** @} */

+ 384 - 0
modules/boonex/tasks/classes/BxTasksModule.php

@@ -0,0 +1,384 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Tasks module
+ */
+class BxTasksModule extends BxBaseModTextModule implements iBxDolCalendarService 
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+
+        $CNF = &$this->_oConfig->CNF;
+        $this->_aSearchableNamesExcept = array_merge($this->_aSearchableNamesExcept, array(
+            $CNF['FIELD_PUBLISHED'],
+            $CNF['FIELD_DISABLE_COMMENTS']
+        ));
+    }
+	
+	/**
+    * Action methods
+    */
+	
+	
+    /**
+     * Get possible recipients for start conversation form
+     */
+    public function actionAjaxGetInitialMembers ()
+    {
+        $sTerm = bx_get('term');
+
+        $a = BxDolService::call('system', 'profiles_search', array($sTerm), 'TemplServiceProfiles');
+
+        header('Content-Type:text/javascript; charset=utf-8');
+        echo(json_encode($a));
+    }
+          
+    public function actionSetCompleted($iTaskId, $iValue)
+    {
+		$CNF = &$this->_oConfig->CNF;
+		$this->_oDb->updateEntriesBy(array($CNF['FIELD_COMPLETED'] => $iValue), array($CNF['FIELD_ID'] => (int)$iTaskId));
+		echo 'ok';
+	}
+	
+	public function actionSetFilterValue($iListId, $sValue)
+	{
+		$CNF = &$this->_oConfig->CNF;
+		$aTmp = array();
+		if (isset($_COOKIE[$CNF['COOKIE_SETTING_KEY']]))
+			$aTmp =	json_decode($_COOKIE[$CNF['COOKIE_SETTING_KEY']], true);
+			
+		$aUrl = parse_url(BX_DOL_URL_ROOT);
+		$sPath = isset($aUrl['path']) && !empty($aUrl['path']) ? $aUrl['path'] : '/';
+		if ($sValue != '')
+			$aTmp[$iListId] = $sValue;
+		else
+			unset($aTmp[$iListId]);
+        setcookie($CNF['COOKIE_SETTING_KEY'], json_encode($aTmp), time() + 60*60*24*365, $sPath);
+	}
+	
+	public function actionProcessTaskListForm($iContextId, $iId)
+    {
+		$CNF = &$this->_oConfig->CNF;
+		$oForm = null;
+		$sPopupTitle = "";
+		$aContentInfo = array();
+		if ($iId == 0){
+			$oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_LIST_ENTRY'], $CNF['OBJECT_FORM_LIST_ENTRY_DISPLAY_ADD']);
+			$sPopupTitle = _t('_bx_tasks_form_list_entry_display_add');
+		}
+		else{
+			$oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_LIST_ENTRY'], $CNF['OBJECT_FORM_LIST_ENTRY_DISPLAY_EDIT']);
+			$aContentInfo = $this->_oDb->getList($iId);
+			$sPopupTitle = _t('_bx_tasks_form_list_entry_display_edit');
+		}
+		
+		$oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'process_task_list_form/' . $iContextId . '/' . $iId . '/';
+		if (!$oForm)
+            return '';
+		
+		$oForm->initChecker($aContentInfo, array());
+		
+        if($oForm->isSubmittedAndValid()) {
+			if ($iId == 0){
+				$aValsToAdd['context_id'] = $iContextId;
+				$iId = $oForm->insert($aValsToAdd);
+			}
+			else{
+				$iId = $oForm->update($iId);
+			}
+
+			return echoJson(array(
+				 'eval' => $this->_oConfig->getJsObject('tasks') . '.reloadData(oData)',
+			));
+        }
+        else {	
+			$sContent = $this->_oTemplate->parseHtmlByName('popup_form.html', array(
+				'form_id' => $oForm->getId(),
+				'form' => $oForm->getCode(true)
+			));
+																	 
+			if (!$oForm->isSubmitted()){
+				echo $sContent;
+				return;
+			}
+			
+            return echoJson(array('form' => $sContent, 'form_id' => $oForm->getId()));;
+        }
+	}
+	
+	public function actionProcessTaskForm($iContextId, $iListId)
+    {
+		$CNF = &$this->_oConfig->CNF;
+		$oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_ENTRY'], $CNF['OBJECT_FORM_ENTRY_DISPLAY_ADD']);
+		
+		$oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'process_task_form/' . $iContextId . '/' . $iListId . '/';
+		if (!$oForm)
+            return '';
+		
+		$oForm->initChecker();
+		
+        if($oForm->isSubmittedAndValid()) {
+			$aValsToAdd[$CNF['FIELD_ALLOW_VIEW_TO']] = $iContextId;
+			$aValsToAdd[$CNF['FIELD_TASKLIST']] = $iListId;
+			$iId = $oForm->insert($aValsToAdd);
+			return echoJson(array(
+				 'eval' => $this->_oConfig->getJsObject('tasks') . '.reloadData(oData)',
+			));
+        }
+        else {	
+			$sContent = $this->_oTemplate->parseHtmlByName('popup_form.html', array(
+				'form_id' => $oForm->getId(),
+				'form' => $oForm->getCode(true)
+			));
+																	 
+			if (!$oForm->isSubmitted()){
+				echo $sContent;
+				return;
+			}
+            return echoJson(array('form' => $sContent, 'form_id' => $oForm->getId()));;
+        }
+	}
+	
+	public function actionCalendarData()
+    {
+        // check permissions
+        $aSQLPart = array();
+        $iContextId = (int)bx_get('context_id');
+		
+		$oPrivacy = BxDolPrivacy::getObjectInstance($this->_oConfig->CNF['OBJECT_PRIVACY_VIEW']);
+		
+		if($iContextId){
+			$aSQLPart = $oPrivacy ? $oPrivacy->getContentByGroupAsSQLPart(- $iContextId) : array();
+		}
+        // get entries
+        $aEntries = $this->_oDb->getEntriesByDate(bx_get('start'), bx_get('end'), bx_get('event'), $aSQLPart);
+        
+        header('Content-Type: application/json; charset=utf-8');
+        echo json_encode($aEntries);
+    }
+	
+    /**
+     * Entry task for Timeline module
+     */
+    public function serviceGetTimelinePost($aEvent, $aBrowseParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aResult = parent::serviceGetTimelinePost($aEvent, $aBrowseParams);
+        if(empty($aResult) || !is_array($aResult) || empty($aResult['date']))
+            return $aResult;
+
+        $aContentInfo = $this->_oDb->getContentInfoById($aEvent['object_id']);
+        if($aContentInfo[$CNF['FIELD_PUBLISHED']] > $aResult['date'])
+            $aResult['date'] = $aContentInfo[$CNF['FIELD_PUBLISHED']];
+
+        return $aResult;
+    }
+
+	public function serviceIsCompleted($iContentId)
+	{
+		$CNF = &$this->_oConfig->CNF;
+		$aContentInfo = $this->_oDb->getContentInfoById($iContentId);
+        return $aContentInfo[$CNF['FIELD_COMPLETED']] ? false: true;
+    }
+	
+	
+	public function serviceEntityAssignments($iContentId = 0, $bAsArray = false)
+	{
+		if (!$iContentId)
+            $iContentId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        if (!$iContentId)
+            return false;
+
+		$mixedResult = BxDolConnection::getObjectInstance($this->_oConfig->CNF['OBJECT_CONNECTION'])->getConnectedContent($iContentId);
+        if(!$bAsArray) {
+			$s = '';
+            foreach ($mixedResult as $mixedProfile) {
+				$bProfile = is_array($mixedProfile);
+
+				$oProfile = BxDolProfile::getInstance($bProfile ? (int)$mixedProfile['id'] : (int)$mixedProfile);
+				if(!$oProfile)
+					continue;
+
+				$aUnitParams = array('template' => array('name' => 'unit', 'size' => 'thumb'));
+
+				if($bProfile && is_array($mixedProfile['info']))
+					$aUnitParams['template']['vars'] = $mixedProfile['info'];
+
+				$s .= $oProfile->getUnit(0, $aUnitParams);
+			}
+			$mixedResult = $s;
+			
+            if (!$mixedResult)
+                return MsgBox(_t('_sys_txt_empty'));
+        }
+
+        return $mixedResult;
+    }
+	
+	public function serviceIsUncompleted($iContentId)
+    {
+		$CNF = &$this->_oConfig->CNF;
+		$aContentInfo = $this->_oDb->getContentInfoById($iContentId);
+        return $aContentInfo[$CNF['FIELD_COMPLETED']] ? true : false;
+    }
+
+	
+    public function serviceCheckAllowedCommentsTask($iContentId, $sObjectComments) 
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aContentInfo = $this->_oDb->getContentInfoById($iContentId);
+        if ($aContentInfo[$CNF['FIELD_DISABLE_COMMENTS']] == 1)
+            return false;
+
+        return parent::serviceCheckAllowedCommentsTask($iContentId, $sObjectComments);
+    }
+	
+	public function serviceCheckAllowedCommentsView($iContentId, $sObjectComments) 
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aContentInfo = $this->_oDb->getContentInfoById($iContentId);
+        if ($aContentInfo[$CNF['FIELD_DISABLE_COMMENTS']] == 1)
+            return false;
+
+        return parent::serviceCheckAllowedCommentsView($iContentId, $sObjectComments);
+    }
+	
+	/**
+     * @page service Service Calls
+     * @section bx_tasks Tasks
+     * @subsection bx_tasks-page_blocks Page Blocks
+     * @subsubsection bx_tasks-calendar calendar
+     * 
+     * @code bx_srv('bx_tasks', 'calendar', [...]); @endcode
+     * 
+     * Shows tasks calendar baced on die date
+     * 
+     * @param $aData additional data to point which events to show, leave empty to show all events, specify event's ID in 'event' array key to show calendar for one event only, specify context's ID in 'context_id' array key to show calendar for one context events only. If only one event is specified then it will show calendar only if it's repeating event.
+     * @param $sTemplate template to use to show calendar, or leave empty for default template, possible options: calendar.html, calendar_compact.html
+     * @return HTML string with calendar to display on the site, all necessary CSS and JS files are automatically added to the HEAD section of the site HTML. On error empty string is returned.
+     *
+     * @see BxTasksModule::serviceCalendar
+     */
+    /** 
+     * @ref bx_tasks-calendar "calendar"
+     */
+    public function serviceCalendar($aData = array(), $sTemplate = 'calendar.html')
+    {
+        $o = new BxTemplCalendar(array(
+            'eventSources' => array (
+                bx_append_url_params(BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'calendar_data', $aData),
+            ),
+        ), $this->_oTemplate);
+        return $o->display($sTemplate);
+    }
+	
+	public function serviceGetCalendarEntries($iProfileId)
+    {
+		$CNF = &$this->_oConfig->CNF;
+        $oConn = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTION']);
+        $aData = $oConn->getConnectedInitiators($iProfileId);
+		$aData2 = array(0);
+        foreach($aData as $iProfileId2){
+            $oProfile = BxDolProfile::getInstance($iProfileId2);
+            array_push($aData2, $oProfile->getContentId());
+        }
+        $aSQLPart['where'] = " AND " . $CNF['TABLE_ENTRIES'] . ".`" . $CNF['FIELD_ID'] . "` IN(" . implode(',', $aData2) . ")";
+        return $this->_oDb->getEntriesByDate(bx_get('start'), bx_get('end'), null, $aSQLPart);
+	}
+	
+	public function serviceBrowseContext ($iProfileId = 0, $aParams = array())
+    {
+		if(!$iProfileId)
+            $iProfileId = bx_process_input(bx_get('profile_id'), BX_DATA_INT);
+        if(!$iProfileId)
+            return '';
+        return $this->serviceBrowseTasks (-$iProfileId, $aParams);
+    }
+	
+	public function serviceBrowseTasks ($iContextId = 0, $aParams = array())
+    {
+		$CNF = &$this->_oConfig->CNF;
+		
+		$this->_oTemplate->addCssJs();
+		$aVars = array();
+		$aLists = $this->_oDb->getLists($iContextId);
+		$aListsVars = array();
+		
+		$oConn = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTION']);
+		
+		$aFilterValues = array();
+		if (isset($_COOKIE[$CNF['COOKIE_SETTING_KEY']]))
+			$aFilterValues =	json_decode($_COOKIE[$CNF['COOKIE_SETTING_KEY']], true);
+		
+		foreach($aLists as $aList) {
+			$aTasks = $this->_oDb->getTasks($iContextId, $aList['id']);
+			$aTasksVars = array();
+			foreach($aTasks as $aTask) {
+				$aMembers = $oConn->getConnectedContent($aTask[$CNF['FIELD_ID']]);
+				$aMembersVars = array();
+				foreach($aMembers as $iMember) {
+					$oProfile = BxDolProfile::getInstance($iMember);
+					$aMembersVars[] = array('info' => $oProfile->getUnit(0, array('template' => 'unit_wo_info')));
+				}
+				$aTasksVars[] = array(
+					'id' => $aTask[$CNF['FIELD_ID']],
+					'title' => $aTask[$CNF['FIELD_TITLE']],
+					'created' => bx_time_js($aTask[$CNF['FIELD_ADDED']]),
+					'checked' => $aTask[$CNF['FIELD_COMPLETED']] == 1 ? 'checked' : '',
+					'class' => $aTask[$CNF['FIELD_COMPLETED']] == 1 ? 'completed' : 'uncompleted',
+					'due' => $aTask[$CNF['FIELD_DUEDATE']] > 0 ? bx_time_js($aTask[$CNF['FIELD_DUEDATE']]) : '',
+					'bx_repeat:members' => $aMembersVars,
+					'badges' => $this->serviceGetBadges($aTask[$CNF['FIELD_ID']], true),
+					'url' => BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $aTask[$CNF['FIELD_ID']]),
+					'object' => $this->_oConfig->getJsObject('tasks')
+				);
+			}
+			$sClass = $sCompleted = $sUncompleted = "";
+			if (isset($aFilterValues[$aList[$CNF['FIELD_ID']]])){
+				$sClass = $aFilterValues[$aList[$CNF['FIELD_ID']]];
+				if ($sClass == 'completed')
+					$sCompleted= 'selected';
+				if ($sClass == 'uncompleted')
+					$sUncompleted= 'selected';
+			}
+			$aListsVars[] = array(
+				'title' => $aList[$CNF['FIELD_TITLE']],
+				'id' => $aList['id'],
+				'bx_repeat:tasks' =>  $aTasksVars,
+				'context_id' => $iContextId,
+				'list_id' => $aList[$CNF['FIELD_ID']],
+				'object' => $this->_oConfig->getJsObject('tasks'),
+				'class' => $sClass,
+				'completed' => $sCompleted,
+				'uncompleted' => $sUncompleted,
+			);
+		}
+		
+		$aVars = array(
+			'bx_repeat:task_lists' => $aListsVars,
+			'context_id' => $iContextId,
+			'object' => $this->_oConfig->getJsObject('tasks')
+		);
+		
+		$this->_oTemplate->addJs(array(
+			'jquery-ui/jquery.ui.widget.min.js',
+    		'jquery-ui/jquery.ui.menu.min.js', 
+    		'jquery-ui/jquery.ui.autocomplete.min.js',
+			'jquery-ui/jquery.ui.core.min.js',
+			'tasks.js',
+    	));
+		return $this->_oTemplate->getJsCode('tasks') . $this->_oTemplate->parseHtmlByName('browse_tasks.html', $aVars);
+    }
+}
+
+/** @} */

+ 23 - 0
modules/boonex/tasks/classes/BxTasksPageAuthor.php

@@ -0,0 +1,23 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Profile's entries page.
+ */
+class BxTasksPageAuthor extends BxBaseModTextPageAuthor
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        parent::__construct($aObject, $oTemplate);
+    }
+
+}
+
+/** @} */

+ 23 - 0
modules/boonex/tasks/classes/BxTasksPageBrowse.php

@@ -0,0 +1,23 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Browse entries pages.
+ */
+class BxTasksPageBrowse extends BxBaseModTextPageBrowse
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_tasks';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 31 - 0
modules/boonex/tasks/classes/BxTasksPageEntry.php

@@ -0,0 +1,31 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Entry create/edit pages
+ */
+class BxTasksPageEntry extends BxBaseModTextPageEntry
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_tasks';
+        parent::__construct($aObject, $oTemplate);
+    }
+
+    protected function _setSubmenu($aParams)
+    {
+    	parent::_setSubmenu(array_merge($aParams, array(
+    		'title' => '',
+    		'icon' => ''
+    	)));
+    }
+}
+
+/** @} */

+ 128 - 0
modules/boonex/tasks/classes/BxTasksSearchResult.php

@@ -0,0 +1,128 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksSearchResult extends BxBaseModTextSearchResult
+{
+    function __construct($sMode = '', $aParams = array())
+    {
+        parent::__construct($sMode, $aParams);
+
+        $this->aCurrent = array(
+            'name' => 'bx_tasks',
+            'module_name' => 'bx_tasks',
+            'object_metatags' => 'bx_tasks',
+            'title' => _t('_bx_tasks_page_title_browse'),
+            'table' => 'bx_tasks_tasks',
+            'ownFields' => array('id', 'title', 'text', 'thumb', 'author', 'added'),
+            'searchFields' => array(),
+            'restriction' => array(
+                'author' => array('value' => '', 'field' => 'author', 'operator' => '='),
+        		'featured' => array('value' => '', 'field' => 'featured', 'operator' => '<>'),
+        		'status' => array('value' => 'active', 'field' => 'status', 'operator' => '='),
+        		'statusAdmin' => array('value' => 'active', 'field' => 'status_admin', 'operator' => '='),
+            ),
+            'paginate' => array('perPage' => getParam('bx_tasks_per_page_browse'), 'start' => 0),
+            'sorting' => 'last',
+            'rss' => array(
+                'title' => '',
+                'link' => '',
+                'image' => '',
+                'profile' => 0,
+                'fields' => array (
+                    'Guid' => 'link',
+                    'Link' => 'link',
+                    'Title' => 'title',
+                    'DateTimeUTS' => 'added',
+                    'Desc' => 'text',
+                    'Image' => 'thumb'
+                ),
+            ),
+            'ident' => 'id',
+        );
+
+        $this->sFilterName = 'bx_tasks_filter';
+        $this->oModule = $this->getMain();
+
+        $CNF = &$this->oModule->_oConfig->CNF;
+
+        $sSearchFields = getParam($CNF['PARAM_SEARCHABLE_FIELDS']);
+        $this->aCurrent['searchFields'] = !empty($sSearchFields) ? explode(',', $sSearchFields) : '';
+
+        $oProfileAuthor = null;
+
+        switch ($sMode) {
+            case 'author':
+                if(!$this->_updateCurrentForAuthor($sMode, $aParams, $oProfileAuthor))
+                    $this->isError = true;
+                break;
+
+            case 'context':
+                if(!$this->_updateCurrentForContext($sMode, $aParams, $oProfileAuthor))
+                    $this->isError = true;
+                break;
+                
+            case 'favorite':
+                if(!$this->_updateCurrentForFavorite($sMode, $aParams, $oProfileAuthor))
+                    $this->isError = true;
+                break;
+
+            case 'public':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_HOME']);
+                $this->aCurrent['title'] = _t('_bx_tasks_page_title_browse_recent');
+                $this->aCurrent['rss']['link'] = 'modules/?r=tasks/rss/' . $sMode;
+                break;
+
+            case 'featured':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_HOME']);
+                $this->aCurrent['title'] = _t('_bx_tasks_page_title_browse_featured');
+                $this->aCurrent['restriction']['featured']['value'] = '0';
+                $this->aCurrent['rss']['link'] = 'modules/?r=tasks/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'featured';
+                break;
+
+            case 'popular':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_TOP']);
+                $this->aCurrent['title'] = _t('_bx_tasks_page_title_browse_popular');
+                $this->aCurrent['rss']['link'] = 'modules/?r=tasks/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'popular';
+                break;
+
+            case 'top':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_POPULAR']);
+                $this->aCurrent['title'] = _t('_bx_tasks_page_title_browse_top');
+                $this->aCurrent['rss']['link'] = 'modules/?r=tasks/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'top';
+                break;
+
+            case 'updated':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_UPDATED']);
+                $this->aCurrent['title'] = _t('_bx_tasks_page_title_browse_updated');
+                $this->aCurrent['rss']['link'] = 'modules/?r=tasks/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'updated';
+                break;
+
+            case '': // search results
+                $this->sBrowseUrl = BX_DOL_SEARCH_KEYWORD_PAGE;
+                $this->aCurrent['title'] = _t('_bx_tasks');
+                unset($this->aCurrent['paginate']['perPage'], $this->aCurrent['rss']);
+                break;
+
+            default:
+                $sMode = '';
+                $this->isError = true;
+        }
+
+        $this->processReplaceableMarkers($oProfileAuthor);
+
+        $this->addConditionsForPrivateContent($CNF, $oProfileAuthor);
+    }
+}
+
+/** @} */

+ 25 - 0
modules/boonex/tasks/classes/BxTasksStudioPage.php

@@ -0,0 +1,25 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksStudioPage extends BxTemplStudioModule
+{
+    protected $_sModule;
+	protected $_oModule;
+    
+    function __construct($sModule = "", $sPage = "")
+    {
+    	$this->_sModule = 'bx_tasks';
+    	$this->_oModule = BxDolModule::getInstance($this->_sModule);
+
+        parent::__construct($sModule, $sPage);
+    }
+}
+
+/** @} */

+ 34 - 0
modules/boonex/tasks/classes/BxTasksTemplate.php

@@ -0,0 +1,34 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/*
+ * Module representation.
+ */
+class BxTasksTemplate extends BxBaseModTextTemplate
+{
+    function __construct(&$oConfig, &$oDb)
+    {
+        $this->MODULE = 'bx_tasks';
+
+        parent::__construct($oConfig, $oDb);
+    }
+
+    /**
+     * Use Gallery image for both because currently there is no Unit types with small thumbnails.
+     */
+    protected function getUnitThumbAndGallery ($aData)
+    {
+        list($sPhotoThumb, $sPhotoGallery) = parent::getUnitThumbAndGallery($aData);
+
+        return array($sPhotoGallery, $sPhotoGallery);
+    }
+}
+
+/** @} */

+ 26 - 0
modules/boonex/tasks/classes/BxTasksUploaderHTML5.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksUploaderHTML5 extends BxBaseModTextUploaderHTML5
+{
+    public function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        $this->_sModule = 'bx_tasks';
+
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+
+    protected function isAdmin ($iContentId = 0)
+    {
+        return $this->_oModule->_isModerator (false);
+    }
+}
+
+/** @} */

+ 26 - 0
modules/boonex/tasks/classes/BxTasksUploaderHTML5Attach.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksUploaderHTML5Attach extends BxBaseModTextUploaderHTML5Attach
+{
+    public function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        $this->_sModule = 'bx_tasks';
+
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+
+    protected function isAdmin ($iContentId = 0)
+    {
+        return $this->_oModule->_isModerator (false);
+    }
+}
+
+/** @} */

+ 26 - 0
modules/boonex/tasks/classes/BxTasksUploaderSimple.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksUploaderSimple extends BxBaseModTextUploaderSimple
+{
+    public function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        $this->_sModule = 'bx_tasks';
+        
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+
+    protected function isAdmin ($iContentId = 0)
+    {
+        return $this->_oModule->_isModerator (false);
+    }
+}
+
+/** @} */

+ 26 - 0
modules/boonex/tasks/classes/BxTasksUploaderSimpleAttach.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksUploaderSimpleAttach extends BxBaseModTextUploaderSimpleAttach
+{
+    public function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        $this->_sModule = 'bx_tasks';
+
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+
+    protected function isAdmin ($iContentId = 0)
+    {
+        return $this->_oModule->_isModerator (false);
+    }
+}
+
+/** @} */

+ 149 - 0
modules/boonex/tasks/install/config.php

@@ -0,0 +1,149 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_tasks',
+    'title' => 'Tasks',
+    'note' => 'Tasks module.',
+    'version' => '11.0.2.DEV',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.x'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/tasks/',
+    'home_uri' => 'tasks',
+
+    'db_prefix' => 'bx_tasks_',
+    'class_prefix' => 'BxTasks',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Tasks',
+
+    /**
+     * List of page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_profile_view_entry',
+    ),
+    
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+        'trigger_profile_view_submenu',
+        'trigger_group_view_submenu',
+    ),
+
+    /**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+        'bx_tasks_covers',
+    	'bx_tasks_photos',
+        'bx_tasks_videos',
+        'bx_tasks_files'
+    ),
+
+    /**
+     * Transcoders.
+     */
+    'transcoders' => array(
+        'bx_tasks_preview',
+        'bx_tasks_gallery',
+        'bx_tasks_cover',
+
+        'bx_tasks_preview_photos',
+        'bx_tasks_gallery_photos', 
+
+        'bx_tasks_videos_poster',
+        'bx_tasks_videos_poster_preview',
+        'bx_tasks_videos_mp4',
+        'bx_tasks_videos_mp4_hd',
+
+        'bx_tasks_preview_files',
+        'bx_tasks_gallery_files'
+    ),
+
+    /**
+     * Extended Search Forms.
+     */
+    'esearches' => array(
+        'bx_tasks',
+    	'bx_tasks_cmts'
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_esearches' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'process_menu_triggers' => 1,
+        'process_page_triggers' => 1,
+    	'process_esearches' => 1,
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+        'update_relations' => 1,
+        'unregister_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Relations Section
+     */
+    'relations' => array(
+    	'bx_timeline',
+    	'bx_notifications'
+    ),
+
+);
+
+/** @} */

+ 19 - 0
modules/boonex/tasks/install/installer.php

@@ -0,0 +1,19 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksInstaller extends BxBaseModTextInstaller
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}
+
+/** @} */

+ 325 - 0
modules/boonex/tasks/install/langs/en.xml

@@ -0,0 +1,325 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+
+    <string name="_bx_tasks"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_cmts"><![CDATA[Tasks' Comments]]></string>
+    <string name="_bx_tasks_reactions"><![CDATA[Tasks' Reactions]]></string>
+
+    <string name="_bx_tasks_option_summary_chars"><![CDATA[Number of characters in auto-cropped task summary]]></string>
+    <string name="_bx_tasks_option_plain_summary_chars"><![CDATA[Number of characters in plain task description when task hasn't thumb]]></string>
+    <string name="_bx_tasks_option_per_page_browse"><![CDATA[Number of items per page]]></string>
+    <string name="_bx_tasks_option_per_page_profile"><![CDATA[Number of items on profile/group page]]></string>
+    <string name="_bx_tasks_option_rss_num"><![CDATA[Number of items in RSS feed]]></string>
+    <string name="_bx_tasks_option_searchable_fields"><![CDATA[Searchable fields for keyword search]]></string>
+    <string name="_bx_tasks_option_auto_activation_for_categories"><![CDATA[Auto-Activation For Categories]]></string>
+  
+    <string name="_bx_tasks_form_entry"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_form_entry_display_add"><![CDATA[Add Task]]></string>
+    <string name="_bx_tasks_form_entry_display_edit"><![CDATA[Edit Task]]></string>
+    <string name="_bx_tasks_form_entry_display_delete"><![CDATA[Delete Task]]></string>
+    <string name="_bx_tasks_form_entry_display_view"><![CDATA[View Task]]></string>
+    <string name="_bx_tasks_form_entry_input_author"><![CDATA[Author]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_do_submit"><![CDATA[Submit]]></string>
+    <string name="_bx_tasks_form_entry_input_do_submit"><![CDATA[Submit]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_do_publish"><![CDATA[Publish]]></string>
+    <string name="_bx_tasks_form_entry_input_do_publish"><![CDATA[Publish]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_title"><![CDATA[Title]]></string>
+    <string name="_bx_tasks_form_entry_input_title"><![CDATA[Title]]></string>
+    <string name="_bx_tasks_form_entry_input_title_err"><![CDATA[Title is essential. Please, fill in this field]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_cat"><![CDATA[Category]]></string>
+    <string name="_bx_tasks_form_entry_input_cat"><![CDATA[Category]]></string>
+    <string name="_bx_tasks_form_entry_input_cat_err"><![CDATA[Please select category]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_multicat"><![CDATA[Categories]]></string>
+    <string name="_bx_tasks_form_entry_input_multicat"><![CDATA[Categories]]></string>
+    <string name="_bx_tasks_form_entry_input_multicat_err"><![CDATA[Please select category]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_text"><![CDATA[Text]]></string>
+    <string name="_bx_tasks_form_entry_input_text"><![CDATA[Text]]></string>
+    <string name="_bx_tasks_form_entry_input_text_err"><![CDATA[Text field can't be empty]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_delete_confirm"><![CDATA[Delete confirmation]]></string>
+    <string name="_bx_tasks_form_entry_input_delete_confirm"><![CDATA[I am sure I want to delete this task]]></string>
+    <string name="_bx_tasks_form_entry_input_delete_confirm_info"><![CDATA[This action can not be undone]]></string>
+    <string name="_bx_tasks_form_entry_input_delete_confirm_error"><![CDATA[Please check this checkbox if you really want to delete the task]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_covers"><![CDATA[Header Image]]></string>
+    <string name="_bx_tasks_form_entry_input_covers"><![CDATA[Header Image]]></string>
+    <string name="_bx_tasks_form_entry_input_covers_uploader_simple_title"><![CDATA[Upload]]></string>
+    <string name="_bx_tasks_form_entry_input_covers_uploader_html5_title"><![CDATA[Upload]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_pictures"><![CDATA[Images]]></string>
+    <string name="_bx_tasks_form_entry_input_pictures"><![CDATA[]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_videos"><![CDATA[Videos]]></string>
+    <string name="_bx_tasks_form_entry_input_videos"><![CDATA[]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_files"><![CDATA[Files]]></string>
+    <string name="_bx_tasks_form_entry_input_files"><![CDATA[]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_allow_view_to"><![CDATA[Visibility]]></string>
+    <string name="_bx_tasks_form_entry_input_allow_view_to"><![CDATA[Visibility]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_date_added"><![CDATA[Created]]></string>
+    <string name="_bx_tasks_form_entry_input_date_added"><![CDATA[Created]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_date_changed"><![CDATA[Updated]]></string>
+    <string name="_bx_tasks_form_entry_input_date_changed"><![CDATA[Updated]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_date_published"><![CDATA[Publishing time]]></string>
+    <string name="_bx_tasks_form_entry_input_date_published"><![CDATA[Publishing time]]></string>
+    <string name="_bx_tasks_form_entry_input_date_published_info"><![CDATA[Leave empty to publish immediately.]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_attachments"><![CDATA[Attachments]]></string>
+    <string name="_bx_tasks_form_entry_input_sys_disable_comments"><![CDATA[Disable comments]]></string>
+    <string name="_bx_tasks_form_entry_input_disable_comments"><![CDATA[Disable comments]]></string>
+	
+	<string name="_bx_tasks_form_entry_input_sys_tasks_list"><![CDATA[Task list]]></string>
+	<string name="_bx_tasks_form_entry_input_tasks_list"><![CDATA[Task list]]></string>
+	<string name="_bx_tasks_form_profile_input_sys_initial_members"><![CDATA[Assignment]]></string>
+	<string name="_bx_tasks_form_profile_input_initial_members"><![CDATA[Assignment]]></string>
+	<string name="_bx_tasks_form_entry_input_sys_date_due_date"><![CDATA[Due date]]></string>
+	<string name="_bx_tasks_form_entry_input_date_due_date"><![CDATA[Due date]]></string>
+	
+	<string name="_bx_tasks_form_list_entry"><![CDATA[Tasklists]]></string>
+	<string name="_bx_tasks_form_list_entry_display_add"><![CDATA[Add Tasklist]]></string>
+	<string name="_bx_tasks_form_list_entry_display_edit"><![CDATA[Edit Tasklist]]></string>
+	<string name="_bx_tasks_form_list_entry_input_do_submit"><![CDATA[Submit]]></string>
+	<string name="_bx_tasks_form_list_entry_input_sys_do_submit"><![CDATA[Submit]]></string>
+	<string name="_bx_tasks_form_list_entry_input_sys_title"><![CDATA[Title]]></string>
+	<string name="_bx_tasks_form_list_entry_input_title"><![CDATA[Title]]></string>
+	<string name="_bx_tasks_form_list_entry_input_title_err"><![CDATA[Title is essential. Please, fill in this field]]></string>
+
+    <string name="_bx_tasks_category_form_entry"><![CDATA[Categories Form]]></string>
+    <string name="_bx_tasks_category_display_add"><![CDATA[Add category]]></string>
+    <string name="_bx_tasks_category_display_edit"><![CDATA[Edit category]]></string>
+    <string name="_bx_tasks_category_form_entry_input_sys_value"><![CDATA[Value]]></string>
+    <string name="_bx_tasks_category_form_entry_input_value"><![CDATA[Value]]></string>>
+    <string name="_bx_tasks_category_form_entry_input_value_err"><![CDATA[Value is essential. Please, fill in this field]]></string>
+    <string name="_bx_tasks_lmi_cpt_categories"><![CDATA[Categories]]></string>
+
+  <string name="_bx_tasks_acl_action_create_entry"><![CDATA[Create Task]]></string>
+    <string name="_bx_tasks_acl_action_delete_entry"><![CDATA[Delete Task]]></string>
+    <string name="_bx_tasks_acl_action_view_entry"><![CDATA[View Task]]></string>
+    <string name="_bx_tasks_acl_action_set_thumb"><![CDATA[Set Task Header Image]]></string>
+    <string name="_bx_tasks_acl_action_edit_any_entry"><![CDATA[Edit Any Task]]></string>
+
+    <string name="_bx_tasks_page_title_sys_create_entry"><![CDATA[New Task]]></string>
+    <string name="_bx_tasks_page_title_create_entry"><![CDATA[New Task]]></string>
+    <string name="_bx_tasks_page_block_title_create_entry"><![CDATA[New Task]]></string>
+    <string name="_bx_tasks_page_title_sys_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_tasks_page_title_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_tasks_page_block_title_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_tasks_page_title_sys_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_tasks_page_title_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_tasks_page_block_title_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_tasks_page_title_sys_view_entry"><![CDATA[View Task]]></string>
+    <string name="_bx_tasks_page_title_view_entry"><![CDATA[{title}]]></string>
+    <string name="_bx_tasks_page_block_title_entry_text"><![CDATA[Task Text]]></string>
+    <string name="_bx_tasks_page_title_browse"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_page_title_search_results"><![CDATA[Tasks matching "{0}"]]></string>
+    <string name="_bx_tasks_page_title_browse_by_author"><![CDATA[Tasks of {display_name}]]></string>
+    <string name="_bx_tasks_page_title_browse_by_context"><![CDATA[Tasks in {display_name}]]></string>
+    <string name="_bx_tasks_page_title_browse_featured"><![CDATA[Featured Tasks]]></string>
+    <string name="_bx_tasks_page_title_browse_recent"><![CDATA[Latest Tasks]]></string>
+    <string name="_bx_tasks_page_title_browse_popular"><![CDATA[Popular Tasks]]></string>
+    <string name="_bx_tasks_page_title_browse_top"><![CDATA[Top Tasks]]></string>
+    <string name="_bx_tasks_page_title_browse_updated"><![CDATA[Updated Tasks]]></string>
+    <string name="_bx_tasks_page_title_sys_home"><![CDATA[Tasks Home]]></string>
+    <string name="_bx_tasks_page_title_home"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_featured_entries_view_extended"><![CDATA[Featured Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_recent_entries"><![CDATA[Latest Tasks (Gallery View)]]></string>
+    <string name="_bx_tasks_page_block_title_recent_entries_view_extended"><![CDATA[Latest Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_recent_entries_view_full"><![CDATA[Latest Tasks (Full View)]]></string>
+    <string name="_bx_tasks_page_block_title_entry_social_sharing"><![CDATA[Share]]></string>
+    <string name="_bx_tasks_page_block_title_entry_author"><![CDATA[Author]]></string>
+	<string name="_bx_tasks_page_block_title_entry_assignments"><![CDATA[Assignments]]></string>
+    <string name="_bx_tasks_page_block_title_entry_actions"><![CDATA[Actions]]></string>
+    <string name="_bx_tasks_page_block_title_entry_comments"><![CDATA[Comments]]></string>
+    <string name="_bx_tasks_page_block_title_entry_comments_link"><![CDATA[Comments to <a href="{entry_link}">{title}</a>]]></string>
+    <string name="_bx_tasks_page_block_title_entry_attachments"><![CDATA[Attachments]]></string>
+    <string name="_bx_tasks_page_block_title_entry_all_actions"><![CDATA[All Actions]]></string>
+    <string name="_bx_tasks_page_title_sys_entries_popular"><![CDATA[Popular Tasks]]></string>
+    <string name="_bx_tasks_page_title_entries_popular"><![CDATA[Popular Tasks]]></string>
+    <string name="_bx_tasks_page_title_sys_entries_top"><![CDATA[Top Tasks]]></string>
+    <string name="_bx_tasks_page_title_entries_top"><![CDATA[Top Tasks]]></string>
+    <string name="_bx_tasks_page_title_sys_entries_updated"><![CDATA[Updated Tasks]]></string>
+    <string name="_bx_tasks_page_title_entries_updated"><![CDATA[Updated Tasks]]></string>
+    <string name="_bx_tasks_page_title_sys_entries_search"><![CDATA[Search]]></string>
+    <string name="_bx_tasks_page_title_entries_search"><![CDATA[Search]]></string>
+    <string name="_bx_tasks_page_block_title_search_form"><![CDATA[Search Form]]></string>
+    <string name="_bx_tasks_page_block_title_search_results"><![CDATA[Search Results]]></string>
+    <string name="_bx_tasks_page_block_title_search_form_cmts"><![CDATA[Comments Search Form]]></string>
+    <string name="_bx_tasks_page_block_title_search_results_cmts"><![CDATA[Comments Search Results]]></string>
+    <string name="_bx_tasks_page_block_title_popular_entries"><![CDATA[Popular Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_popular_entries_view_extended"><![CDATA[Popular Tasks (Extended View)]]></string>
+    <string name="_bx_tasks_page_block_title_popular_entries_view_full"><![CDATA[Popular Tasks (Full View)]]></string>
+    <string name="_bx_tasks_page_block_title_top_entries"><![CDATA[Top Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_updated_entries"><![CDATA[Updated Tasks]]></string>
+    <string name="_bx_tasks_page_title_sys_view_entry_comments"><![CDATA[Task Comments]]></string>
+    <string name="_bx_tasks_page_title_view_entry_comments"><![CDATA[Comments to {title}]]></string>
+    <string name="_bx_tasks_page_title_sys_entries_of_author"><![CDATA[Tasks of author]]></string>
+    <string name="_bx_tasks_page_title_entries_of_author"><![CDATA[Tasks by {display_name}]]></string>
+    <string name="_bx_tasks_page_title_sys_entries_in_context"><![CDATA[Tasks in context]]></string>
+    <string name="_bx_tasks_page_title_entries_in_context"><![CDATA[Tasks in {display_name}]]></string>
+    <string name="_bx_tasks_page_block_title_favorites_of_author"><![CDATA[Favorites by <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_tasks_page_block_title_sys_favorites_of_author"><![CDATA[Favorites of author]]></string>
+    <string name="_bx_tasks_page_block_title_entries_of_author"><![CDATA[Tasks by <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_tasks_page_block_title_sys_entries_of_author"><![CDATA[Tasks of author]]></string>
+    <string name="_bx_tasks_page_block_title_entries_in_context"><![CDATA[Tasks in <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_tasks_page_block_title_sys_entries_in_context"><![CDATA[Tasks in context]]></string>
+    <string name="_bx_tasks_page_block_title_entries_actions"><![CDATA[Tasks actions]]></string>
+    <string name="_bx_tasks_page_block_title_browse_cmts"><![CDATA[Tasks' Comments]]></string>
+    <string name="_bx_tasks_page_title_sys_manage"><![CDATA[Manage Own]]></string>
+    <string name="_bx_tasks_page_title_sys_manage_administration"><![CDATA[Manage All]]></string>
+    <string name="_bx_tasks_page_title_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_tasks_page_block_title_system_manage"><![CDATA[Manage Own]]></string>
+    <string name="_bx_tasks_page_block_title_system_manage_administration"><![CDATA[Manage All]]></string>
+    <string name="_bx_tasks_page_block_title_manage"><![CDATA[Manage]]></string>    
+    <string name="_bx_tasks_page_block_title_popular_keywords"><![CDATA[Popular Hashtags]]></string>
+    <string name="_bx_tasks_page_block_title_cats"><![CDATA[Tasks Categories]]></string>
+    <string name="_bx_tasks_page_block_title_sys_multicats"><![CDATA[Tasks Categories(Multi)]]></string>
+    <string name="_bx_tasks_page_block_title_multicats"><![CDATA[Tasks Categories]]></string>
+    <string name="_bx_tasks_page_block_title_entry_info"><![CDATA[Info]]></string>
+    <string name="_bx_tasks_page_block_title_my_entries"><![CDATA[My Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_sys_recent_entries_view_showcase"><![CDATA[Latest Tasks (Showcase View)]]></string>
+    <string name="_bx_tasks_page_block_title_recent_entries_view_showcase"><![CDATA[Latest Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_sys_popular_entries_view_showcase"><![CDATA[Popular Tasks (Showcase View)]]></string>
+    <string name="_bx_tasks_page_block_title_popular_entries_view_showcase"><![CDATA[Popular Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_sys_featured_entries_view_showcase"><![CDATA[Featured Tasks (Showcase View)]]></string>
+    <string name="_bx_tasks_page_block_title_featured_entries_view_showcase"><![CDATA[Featured Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_sys_entry_context"><![CDATA[Posted in]]></string>
+    <string name="_bx_tasks_page_block_title_entry_context"><![CDATA[Posted in]]></string>
+	<string name="_bx_tasks_page_block_title_sys_calendar_in_context"><![CDATA[Calendar]]></string>
+	<string name="_bx_tasks_page_block_title_calendar_in_context"><![CDATA[Calendar]]></string>
+	<string name="_bx_tasks_page_block_title_sys_calendar_of_author"><![CDATA[Calendar]]></string>
+	<string name="_bx_tasks_page_block_title_calendar_of_author"><![CDATA[Calendar]]></string>
+
+    <string name="_bx_tasks_menu_title_entry_attachments"><![CDATA[Form Attachments]]></string>
+    <string name="_bx_tasks_menu_set_title_entry_attachments"><![CDATA[Form Attachments]]></string>
+    <string name="_bx_tasks_menu_item_title_system_cpa_photo_simple"><![CDATA[Add Photo (simple)]]></string>
+    <string name="_bx_tasks_menu_item_title_cpa_photo_simple"><![CDATA[Add Photo]]></string>
+    <string name="_bx_tasks_menu_item_title_system_cpa_photo_html5"><![CDATA[Add Photo (html5)]]></string>
+    <string name="_bx_tasks_menu_item_title_cpa_photo_html5"><![CDATA[Add Photos]]></string>
+    <string name="_bx_tasks_menu_item_title_system_cpa_video_simple"><![CDATA[Add Video (simple)]]></string>
+    <string name="_bx_tasks_menu_item_title_cpa_video_simple"><![CDATA[Add Video]]></string>
+    <string name="_bx_tasks_menu_item_title_system_cpa_video_html5"><![CDATA[Add Video (html5)]]></string>
+    <string name="_bx_tasks_menu_item_title_cpa_video_html5"><![CDATA[Add Videos]]></string>
+    <string name="_bx_tasks_menu_item_title_system_cpa_file_simple"><![CDATA[Add File (simple)]]></string>
+    <string name="_bx_tasks_menu_item_title_cpa_file_simple"><![CDATA[Add File]]></string>
+    <string name="_bx_tasks_menu_item_title_system_cpa_file_html5"><![CDATA[Add File (html5)]]></string>
+    <string name="_bx_tasks_menu_item_title_cpa_file_html5"><![CDATA[Add Files]]></string>
+
+    <string name="_bx_tasks_menu_set_title_view_entry"><![CDATA[Task Actions]]></string>
+    <string name="_bx_tasks_menu_title_view_entry"><![CDATA[Task Actions]]></string>
+    <string name="_bx_tasks_menu_title_submenu"><![CDATA[Tasks Submenu]]></string>
+    <string name="_bx_tasks_menu_set_title_submenu"><![CDATA[Tasks Submenu]]></string>
+    <string name="_bx_tasks_menu_item_title_system_create_entry"><![CDATA[Task]]></string>
+    <string name="_bx_tasks_menu_item_title_create_entry"><![CDATA[Task]]></string>
+    <string name="_bx_tasks_menu_item_title_system_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_tasks_menu_item_title_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_tasks_menu_item_title_system_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_tasks_menu_item_title_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_tasks_menu_item_title_system_view_entry"><![CDATA[View Task]]></string>
+    <string name="_bx_tasks_menu_item_title_system_entries_home"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_menu_item_title_entries_home"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_menu_item_title_system_entries_public"><![CDATA[Latest]]></string>
+    <string name="_bx_tasks_menu_item_title_entries_public"><![CDATA[Latest]]></string>
+    <string name="_bx_tasks_menu_item_title_system_entries_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_tasks_menu_item_title_entries_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_tasks_menu_item_title_system_entries_popular"><![CDATA[Popular]]></string>
+    <string name="_bx_tasks_menu_item_title_entries_popular"><![CDATA[Popular]]></string>
+    <string name="_bx_tasks_menu_item_title_system_entries_top"><![CDATA[Top]]></string>
+    <string name="_bx_tasks_menu_item_title_entries_top"><![CDATA[Top]]></string>
+    <string name="_bx_tasks_menu_item_title_system_entries_search"><![CDATA[Search]]></string>
+    <string name="_bx_tasks_menu_item_title_entries_search"><![CDATA[Search]]></string>
+    <string name="_bx_tasks_menu_title_view_entry_submenu"><![CDATA[View Task Submenu]]></string>
+    <string name="_bx_tasks_menu_set_title_view_entry_submenu"><![CDATA[View Task Submenu]]></string>
+    <string name="_bx_tasks_menu_item_title_view_entry_submenu_entry"><![CDATA[Task]]></string>
+    <string name="_bx_tasks_menu_item_title_view_entry_submenu_comments"><![CDATA[Comments]]></string>
+    <string name="_bx_tasks_menu_item_title_system_view_entry_comments"><![CDATA[Task Comments]]></string>
+    <string name="_bx_tasks_menu_item_title_system_view_entries_author"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_menu_item_title_view_entries_author"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_menu_item_title_system_view_entries_in_context"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_menu_item_title_view_entries_in_context"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_menu_title_entries_my"><![CDATA[My Tasks Action Menu]]></string>
+    <string name="_bx_tasks_menu_set_title_entries_my"><![CDATA[My Tasks Menu]]></string>
+	<string name="_bx_tasks_menu_item_title_system_manage_my_tasks"><![CDATA[My tasks]]></string>
+    <string name="_bx_tasks_menu_item_title_manage_my_tasks"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_menu_set_title_manage_tools"><![CDATA[Manage Tools Submenu]]></string>
+    <string name="_bx_tasks_menu_title_manage_tools"><![CDATA[Manage Tools Submenu]]></string>
+    <string name="_bx_tasks_menu_item_title_system_manage_account"><![CDATA[Manage account]]></string>
+    <string name="_bx_tasks_menu_item_title_manage_account"><![CDATA[Manage account]]></string>
+	<string name="_bx_tasks_menu_item_title_system_admt_tasks"><![CDATA[Tasks]]></string>
+	<string name="_bx_tasks_menu_item_title_admt_tasks"><![CDATA[Tasks]]></string>
+	<string name="_bx_tasks_menu_item_title_manage_my"><![CDATA[My Tasks]]></string>
+	<string name="_bx_tasks_menu_item_title_manage_all"><![CDATA[All Tasks]]></string>
+	
+	<string name="_bx_tasks_menu_item_title_system_set_completed"><![CDATA[Complete]]></string>
+	<string name="_bx_tasks_menu_item_title_set_completed"><![CDATA[Complete]]></string>
+	<string name="_bx_tasks_menu_item_title_system_set_uncompleted"><![CDATA[Re-open]]></string>
+	<string name="_bx_tasks_menu_item_title_set_uncompleted"><![CDATA[Re-open]]></string>
+
+	<string name="_bx_tasks_grid_filter_item_title_adm_select_one_filter1"><![CDATA[All Statuses]]></string>
+	<string name="_bx_tasks_grid_filter_item_title_adm_active"><![CDATA[Active]]></string>
+	<string name="_bx_tasks_grid_filter_item_title_adm_hidden"><![CDATA[Hidden]]></string>
+	<string name="_bx_tasks_grid_column_title_adm_active"><![CDATA[Active]]></string>
+    <string name="_bx_tasks_grid_column_title_adm_title"><![CDATA[Title]]></string>
+    <string name="_bx_tasks_grid_action_title_adm_audit_content"><![CDATA[Audit actions]]></string>
+    <string name="_bx_tasks_grid_column_title_adm_added"><![CDATA[Added]]></string>
+    <string name="_bx_tasks_grid_column_title_adm_author"><![CDATA[Author]]></string>>
+    <string name="_bx_tasks_grid_action_title_adm_add"><![CDATA[Add]]></string>
+    <string name="_bx_tasks_grid_action_title_adm_edit"><![CDATA[Edit]]></string>
+    <string name="_bx_tasks_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_tasks_grid_action_title_adm_more_actions"><![CDATA[More Actions]]></string>
+    <string name="_bx_tasks_grid_action_err_delete"><![CDATA[Cannot delete the selected task(s).]]></string>
+    <string name="_bx_tasks_grid_txt_account_manager"><![CDATA[Redirect to manage account.]]></string>
+
+    <string name="_bx_tasks_chart_growth"><![CDATA[Tasks: Growth]]></string>
+    <string name="_bx_tasks_chart_growth_speed"><![CDATA[Tasks: Growth Speed]]></string>
+
+    <string name="_bx_tasks_search_extended"><![CDATA[Tasks Search]]></string>
+    <string name="_bx_tasks_search_extended_cmts"><![CDATA[Tasks Comments Search]]></string>
+
+    <string name="_bx_tasks_pre_lists_cats"><![CDATA[Task categories]]></string>
+    <string name="_bx_tasks_cat_Animals_Pets"><![CDATA[Animals & Pets]]></string>
+    <string name="_bx_tasks_cat_Architecture"><![CDATA[Architecture]]></string>
+    <string name="_bx_tasks_cat_Art"><![CDATA[Art]]></string>
+    <string name="_bx_tasks_cat_Cars_Motorcycles"><![CDATA[Cars & Motorcycles]]></string>
+    <string name="_bx_tasks_cat_Celebrities"><![CDATA[Celebrities]]></string>
+    <string name="_bx_tasks_cat_Design"><![CDATA[Design]]></string>
+    <string name="_bx_tasks_cat_DIY_Crafts"><![CDATA[DIY & Crafts]]></string>
+    <string name="_bx_tasks_cat_Education"><![CDATA[Education]]></string>
+    <string name="_bx_tasks_cat_Film_Music_Books"><![CDATA[Film, Music & Books]]></string>
+    <string name="_bx_tasks_cat_Food_Drink"><![CDATA[Food & Drink]]></string>
+    <string name="_bx_tasks_cat_Gardening"><![CDATA[Gardening]]></string>
+    <string name="_bx_tasks_cat_Geek"><![CDATA[Geek]]></string>
+    <string name="_bx_tasks_cat_Hair_Beauty"><![CDATA[Hair & Beauty]]></string>
+    <string name="_bx_tasks_cat_Health_Fitness"><![CDATA[Health & Fitness]]></string>
+    <string name="_bx_tasks_cat_History"><![CDATA[History]]></string>
+    <string name="_bx_tasks_cat_Holidays_Events"><![CDATA[Holidays & Events]]></string>
+    <string name="_bx_tasks_cat_Home_Decor"><![CDATA[Home Decor]]></string>
+    <string name="_bx_tasks_cat_Humor"><![CDATA[Humor]]></string>
+    <string name="_bx_tasks_cat_Illustrations_Posters"><![CDATA[Illustrations & Posters]]></string>
+    <string name="_bx_tasks_cat_Kids_Parenting"><![CDATA[Kids & Parenting]]></string>
+    <string name="_bx_tasks_cat_Mens_Fashion"><![CDATA[Men's Fashion]]></string>
+    <string name="_bx_tasks_cat_Outdoors"><![CDATA[Outdoors]]></string>
+    <string name="_bx_tasks_cat_Photography"><![CDATA[Photography]]></string>
+    <string name="_bx_tasks_cat_Products"><![CDATA[Products]]></string>
+    <string name="_bx_tasks_cat_Quotes"><![CDATA[Quotes]]></string>
+    <string name="_bx_tasks_cat_Science_Nature"><![CDATA[Science & Nature]]></string>
+    <string name="_bx_tasks_cat_Sports"><![CDATA[Sports]]></string>
+    <string name="_bx_tasks_cat_Tattoos"><![CDATA[Tattoos]]></string>
+    <string name="_bx_tasks_cat_Technology"><![CDATA[Technology]]></string>
+    <string name="_bx_tasks_cat_Travel"><![CDATA[Travel]]></string>
+    <string name="_bx_tasks_cat_Weddings"><![CDATA[Weddings]]></string>
+    <string name="_bx_tasks_cat_Womens_Fashion"><![CDATA[Women's Fashion]]></string>
+
+    <string name="_bx_tasks_txt_all_entries_in"><![CDATA[<a href="{0}">All Tasks in {1} ({2})</a>]]></string>
+    <string name="_bx_tasks_txt_all_entries_by"><![CDATA[{0} tasks]]></string>
+    <string name="_bx_tasks_txt_sample_single"><![CDATA[task]]></string>
+    <string name="_bx_tasks_txt_sample_single_with_article"><![CDATA[a task]]></string>
+    <string name="_bx_tasks_txt_sample_comment_single"><![CDATA[comment to task]]></string>
+    <string name="_bx_tasks_txt_sample_vote_single"><![CDATA[vote to task]]></string>
+    <string name="_bx_tasks_txt_sample_reaction_single"><![CDATA['{0}' reaction to task]]></string>
+    <string name="_bx_tasks_txt_sample_score_up_single"><![CDATA[score up vote to task]]></string>
+    <string name="_bx_tasks_txt_sample_score_down_single"><![CDATA[score down vote to task]]></string>
+    <string name="_bx_tasks_txt_processing_awaiting"><![CDATA[Scheduled for publishing as soon as video conversion is complete.]]></string>
+    <string name="_bx_tasks_txt_processing_failed"><![CDATA[Task isn't published because video conversion failed, edit video to fix the issue.]]></string>
+    <string name="_bx_tasks_txt_scheduled_awaiting"><![CDATA[Task publishing date is {date_publish_uf}]]></string>
+	
+	<string name="_bx_tasks_txt_new_task_list"><![CDATA[New TaskList]]></string>
+	<string name="_bx_tasks_txt_new_task"><![CDATA[New Task]]></string>
+	<string name="_bx_tasks_txt_filter_all"><![CDATA[All Tasks]]></string>
+	<string name="_bx_tasks_txt_filter_completed"><![CDATA[Completed Tasks]]></string>
+	<string name="_bx_tasks_txt_filter_uncompleted"><![CDATA[Uncompleted Tasks]]></string>
+    <string name="_bx_tasks_txt_err_cannot_perform_action"><![CDATA[Cannot perform action. Please report.]]></string>
+</resources>

+ 57 - 0
modules/boonex/tasks/install/sql/disable.sql

@@ -0,0 +1,57 @@
+
+-- SETTINGS
+SET @iTypeId = (SELECT `ID` FROM `sys_options_types` WHERE `name` = 'bx_tasks' 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_tasks';
+DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_tasks' OR `object` IN('bx_tasks_create_entry', 'bx_tasks_edit_entry', 'bx_tasks_delete_entry', 'bx_tasks_view_entry', 'bx_tasks_view_entry_comments', 'bx_tasks_home', 'bx_tasks_popular', 'bx_tasks_top', 'bx_tasks_updated', 'bx_tasks_author', 'bx_tasks_context', 'bx_tasks_search', 'bx_tasks_manage');
+
+-- MENU
+DELETE FROM `sys_objects_menu` WHERE `module` = 'bx_tasks';
+DELETE FROM `sys_menu_sets` WHERE `module` = 'bx_tasks';
+DELETE FROM `sys_menu_items` WHERE `module` = 'bx_tasks' OR `set_name` IN('bx_tasks_create_task_attachments', 'bx_tasks_view', 'bx_tasks_view_actions', 'bx_tasks_submenu', 'bx_tasks_view_submenu', 'bx_tasks_snippet_meta', 'bx_tasks_my', 'bx_tasks_menu_manage_tools');
+
+-- PRIVACY 
+DELETE FROM `sys_objects_privacy` WHERE `object` = 'bx_tasks_allow_view_to';
+
+-- 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_tasks';
+DELETE FROM `sys_acl_actions` WHERE `Module` = 'bx_tasks';
+
+-- SEARCH
+DELETE FROM `sys_objects_search` WHERE `ObjectName` IN ('bx_tasks', 'bx_tasks_cmts');
+
+-- CONNECTIONS
+DELETE FROM `sys_objects_connection` WHERE `object` = 'bx_tasks_assignments';
+
+-- METATAGS
+DELETE FROM `sys_objects_metatags` WHERE `object` = 'bx_tasks';
+
+-- CATEGORY
+DELETE FROM `sys_objects_category` WHERE `object` = 'bx_tasks_cats';
+
+-- STATS
+DELETE FROM `sys_statistics` WHERE `name` LIKE 'bx_tasks%';
+
+-- CHARTS
+DELETE FROM `sys_objects_chart` WHERE `object` LIKE 'bx_tasks%';
+
+-- GRIDS
+DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_tasks_administration', 'bx_tasks_common');
+DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_tasks_administration', 'bx_tasks_common');
+DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_tasks_administration', 'bx_tasks_common');
+
+-- UPLOADERS
+DELETE FROM `sys_objects_uploader` WHERE `object` LIKE 'bx_tasks_%';
+
+-- ALERTS
+SET @iHandler := (SELECT `id` FROM `sys_alerts_handlers` WHERE `name` = 'bx_tasks' LIMIT 1);
+DELETE FROM `sys_alerts` WHERE `handler_id` = @iHandler;
+DELETE FROM `sys_alerts_handlers` WHERE `id` = @iHandler;
+
+-- CRON
+DELETE FROM `sys_cron_jobs` WHERE `name` LIKE 'bx_tasks%';

+ 321 - 0
modules/boonex/tasks/install/sql/enable.sql

@@ -0,0 +1,321 @@
+
+-- 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_tasks', '_bx_tasks', 'bx_tasks@modules/boonex/tasks/|std-icon.svg', IF(ISNULL(@iTypeOrder), 1, @iTypeOrder + 1));
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order`)
+VALUES (@iTypeId, 'bx_tasks', '_bx_tasks', 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `check`, `check_error`, `extra`, `order`) VALUES
+('bx_tasks_summary_chars', '700', @iCategId, '_bx_tasks_option_summary_chars', 'digit', '', '', '', 1),
+('bx_tasks_plain_summary_chars', '240', @iCategId, '_bx_tasks_option_plain_summary_chars', 'digit', '', '', '', 2),
+('bx_tasks_per_page_browse', '12', @iCategId, '_bx_tasks_option_per_page_browse', 'digit', '', '', '', 10),
+('bx_tasks_per_page_profile', '6', @iCategId, '_bx_tasks_option_per_page_profile', 'digit', '', '', '', 12),
+('bx_tasks_per_page_browse_showcase', '32', @iCategId, '_sys_option_per_page_browse_showcase', 'digit', '', '', '', 15),
+('bx_tasks_rss_num', '10', @iCategId, '_bx_tasks_option_rss_num', 'digit', '', '', '', 20),
+('bx_tasks_searchable_fields', 'title,text', @iCategId, '_bx_tasks_option_searchable_fields', 'list', '', '', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:21:"get_searchable_fields";}', 30),
+('bx_tasks_auto_activation_for_categories', 'on', @iCategId, '_bx_tasks_option_auto_activation_for_categories', 'checkbox', '', '', '', 35);
+
+-- PAGE: create entry
+
+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_tasks_create_entry', '_bx_tasks_page_title_sys_create_entry', '_bx_tasks_page_title_create_entry', 'bx_tasks', 5, 2147483647, 1, 'create-task', 'page.php?i=create-task', '', '', '', 0, 1, 0, 'BxTasksPageBrowse', 'modules/boonex/tasks/classes/BxTasksPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_tasks_create_entry', 1, 'bx_tasks', '_bx_tasks_page_block_title_create_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:13:"entity_create";}', 0, 1, 1);
+
+
+-- PAGE: edit entry
+
+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_tasks_edit_entry', '_bx_tasks_page_title_sys_edit_entry', '_bx_tasks_page_title_edit_entry', 'bx_tasks', 5, 2147483647, 1, 'edit-task', '', '', '', '', 0, 1, 0, 'BxTasksPageEntry', 'modules/boonex/tasks/classes/BxTasksPageEntry.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_tasks_edit_entry', 1, 'bx_tasks', '_bx_tasks_page_block_title_edit_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:11:"entity_edit";}', 0, 0, 0);
+
+
+-- PAGE: delete entry
+
+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_tasks_delete_entry', '_bx_tasks_page_title_sys_delete_entry', '_bx_tasks_page_title_delete_entry', 'bx_tasks', 5, 2147483647, 1, 'delete-task', '', '', '', '', 0, 1, 0, 'BxTasksPageEntry', 'modules/boonex/tasks/classes/BxTasksPageEntry.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_tasks_delete_entry', 1, 'bx_tasks', '_bx_tasks_page_block_title_delete_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:13:"entity_delete";}', 0, 0, 0);
+
+
+-- PAGE: view entry
+
+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_tasks_view_entry', '_bx_tasks_page_title_sys_view_entry', '_bx_tasks_page_title_view_entry', 'bx_tasks', 12, 2147483647, 1, 'view-task', '', '', '', '', 0, 1, 0, 'BxTasksPageEntry', 'modules/boonex/tasks/classes/BxTasksPageEntry.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_tasks_view_entry', 2, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_text', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 2),
+('bx_tasks_view_entry', 2, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_author', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:13:\"entity_author\";}', 0, 0, 1, 1),
+('bx_tasks_view_entry', 2, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_assignments', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:18:\"entity_assignments\";}', 0, 0, 1, 2),
+('bx_tasks_view_entry', 3, 'bx_tasks', '_bx_tasks_page_block_title_sys_entry_context', '_bx_tasks_page_block_title_entry_context', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:14:\"entity_context\";}', 0, 0, 1, 1),
+('bx_tasks_view_entry', 3, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_info', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:11:\"entity_info\";}', 0, 0, 1, 2),
+('bx_tasks_view_entry', 2, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_all_actions', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:18:\"entity_all_actions\";}', 0, 0, 1, 3),
+('bx_tasks_view_entry', 4, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_actions', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:14:\"entity_actions\";}', 0, 0, 0, 0),
+('bx_tasks_view_entry', 4, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_social_sharing', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:21:\"entity_social_sharing\";}', 0, 0, 0, 0),
+('bx_tasks_view_entry', 2, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_attachments', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:18:\"entity_attachments\";}', 0, 0, 1, 4),
+('bx_tasks_view_entry', 2, 'bx_tasks', '', '_bx_tasks_page_block_title_entry_comments', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:15:\"entity_comments\";}', 0, 0, 1, 6),
+('bx_tasks_view_entry', 3, 'bx_tasks', '', '_bx_tasks_page_block_title_featured_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:15:"browse_featured";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 0, 1, 5);
+
+
+-- PAGE: view entry comments
+
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_view_entry_comments', '_bx_tasks_page_title_sys_view_entry_comments', '_bx_tasks_page_title_view_entry_comments', 'bx_tasks', 5, 2147483647, 1, 'view-task-comments', '', '', '', '', 0, 1, 0, 'BxTasksPageEntry', 'modules/boonex/tasks/classes/BxTasksPageEntry.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_tasks_view_entry_comments', 1, 'bx_tasks', '_bx_tasks_page_block_title_entry_comments', '_bx_tasks_page_block_title_entry_comments_link', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:15:\"entity_comments\";}', 0, 0, 1);
+
+-- PAGE: entries in context
+
+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_tasks_context', 'tasks-context', '_bx_tasks_page_title_sys_entries_in_context', '_bx_tasks_page_title_entries_in_context', 'bx_tasks', 5, 2147483647, 1, '', '', '', '', 0, 1, 0, 'BxTasksPageAuthor', 'modules/boonex/tasks/classes/BxTasksPageAuthor.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_tasks_context', 1, 'bx_tasks', '_bx_tasks_page_block_title_sys_entries_in_context', '_bx_tasks_page_block_title_entries_in_context', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:14:\"browse_context\";}', 0, 0, 1, 1),
+('bx_tasks_context', 1, 'bx_tasks', '_bx_tasks_page_block_title_sys_calendar_in_context', '_bx_tasks_page_block_title_calendar_in_context', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:8:"calendar";s:12:"ignore_cache";b:1;s:6:"params";a:1:{i:0;a:1:{s:10:"context_id";s:12:"{profile_id}";}}}', 0, 0, 1, 2);
+
+-- 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_tasks_administration', '_bx_tasks_page_title_sys_manage_administration', '_bx_tasks_page_title_manage', 'bx_tasks', 5, 192, 1, 'tasks-administration', 'page.php?i=tasks-administration', '', '', '', 0, 1, 0, 'BxTasksPageBrowse', 'modules/boonex/tasks/classes/BxTasksPageBrowse.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_tasks_administration', 1, 'bx_tasks', '_bx_tasks_page_block_title_system_manage_administration', '_bx_tasks_page_block_title_manage', 11, 192, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:12:\"manage_tools\";s:6:\"params\";a:1:{i:0;s:14:\"administration\";}}', 0, 1, 0);
+
+
+-- MENU: create task form attachments (link, photo, video, etc)
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_entry_attachments', '_bx_tasks_menu_title_entry_attachments', 'bx_tasks_entry_attachments', 'bx_tasks', 23, 0, 1, 'BxTasksMenuAttachments', 'modules/boonex/tasks/classes/BxTasksMenuAttachments.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_tasks_entry_attachments', 'bx_tasks', '_bx_tasks_menu_set_title_entry_attachments', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `editable`, `order`) VALUES 
+('bx_tasks_entry_attachments', 'bx_tasks', 'photo_simple', '_bx_tasks_menu_item_title_system_cpa_photo_simple', '_bx_tasks_menu_item_title_cpa_photo_simple', 'javascript:void(0)', 'javascript:{js_object_uploader_photos_simple}.showUploaderForm();', '_self', 'camera', '', '', 2147483647, '', 0, 0, 1, 1),
+('bx_tasks_entry_attachments', 'bx_tasks', 'photo_html5', '_bx_tasks_menu_item_title_system_cpa_photo_html5', '_bx_tasks_menu_item_title_cpa_photo_html5', 'javascript:void(0)', 'javascript:{js_object_uploader_photos_html5}.showUploaderForm();', '_self', 'camera', '', '', 2147483647, '', 1, 0, 1, 2),
+('bx_tasks_entry_attachments', 'bx_tasks', 'video_simple', '_bx_tasks_menu_item_title_system_cpa_video_simple', '_bx_tasks_menu_item_title_cpa_video_simple', 'javascript:void(0)', 'javascript:{js_object_uploader_videos_simple}.showUploaderForm();', '_self', 'video', '', '', 2147483647, '', 0, 0, 1, 3),
+('bx_tasks_entry_attachments', 'bx_tasks', 'video_html5', '_bx_tasks_menu_item_title_system_cpa_video_html5', '_bx_tasks_menu_item_title_cpa_video_html5', 'javascript:void(0)', 'javascript:{js_object_uploader_videos_html5}.showUploaderForm();', '_self', 'video', '', '', 2147483647, '', 1, 0, 1, 4),
+('bx_tasks_entry_attachments', 'bx_tasks', 'file_simple', '_bx_tasks_menu_item_title_system_cpa_file_simple', '_bx_tasks_menu_item_title_cpa_file_simple', 'javascript:void(0)', 'javascript:{js_object_uploader_files_simple}.showUploaderForm();', '_self', 'file', '', '', 2147483647, '', 0, 0, 1, 5),
+('bx_tasks_entry_attachments', 'bx_tasks', 'file_html5', '_bx_tasks_menu_item_title_system_cpa_file_html5', '_bx_tasks_menu_item_title_cpa_file_html5', 'javascript:void(0)', 'javascript:{js_object_uploader_files_html5}.showUploaderForm();', '_self', 'file', '', '', 2147483647, '', 1, 0, 1, 6);
+
+-- MENU: actions menu for view entry 
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_view', '_bx_tasks_menu_title_view_entry', 'bx_tasks_view', 'bx_tasks', 9, 0, 1, 'BxTasksMenuView', 'modules/boonex/tasks/classes/BxTasksMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_tasks_view', 'bx_tasks', '_bx_tasks_menu_set_title_view_entry', 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_tasks_view', 'bx_tasks', 'edit-task', '_bx_tasks_menu_item_title_system_edit_entry', '_bx_tasks_menu_item_title_edit_entry', 'page.php?i=edit-task&id={content_id}', '', '', 'pencil-alt', '', 2147483647, 1, 0, 1),
+('bx_tasks_view', 'bx_tasks', 'delete-task', '_bx_tasks_menu_item_title_system_delete_entry', '_bx_tasks_menu_item_title_delete_entry', 'page.php?i=delete-task&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 2);
+
+
+-- MENU: all actions menu for view entry 
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_view_actions', '_sys_menu_title_view_actions', 'bx_tasks_view_actions', 'bx_tasks', 15, 0, 1, 'BxTasksMenuViewActions', 'modules/boonex/tasks/classes/BxTasksMenuViewActions.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_tasks_view_actions', 'bx_tasks', '_sys_menu_set_title_view_actions', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `order`) VALUES 
+('bx_tasks_view_actions', 'bx_tasks', 'edit-task', '_bx_tasks_menu_item_title_system_edit_entry', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 10),
+('bx_tasks_view_actions', 'bx_tasks', 'delete-task', '_bx_tasks_menu_item_title_system_delete_entry', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 20),
+('bx_tasks_view_actions', 'bx_tasks', 'set-completed', '_bx_tasks_menu_item_title_system_set_completed', '_bx_tasks_menu_item_title_set_completed', 'javascript:void(0)', 'javascript:{js_object}.setCompletedByMenu({content_id}, 1, this);', '', 'check', '', '', 0, 2147483647, 'a:3:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:12:"is_completed";s:6:"params";a:1:{i:0;s:12:"{content_id}";}}', 1, 0, 30),
+('bx_tasks_view_actions', 'bx_tasks', 'set-uncompleted', '_bx_tasks_menu_item_title_system_set_uncompleted', '_bx_tasks_menu_item_title_set_uncompleted', 'javascript:void(0)', 'javascript:{js_object}.setCompletedByMenu({content_id}, 0, this);', '', 'circle', '', '', 0, 2147483647, 'a:3:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:14:"is_uncompleted";s:6:"params";a:1:{i:0;s:12:"{content_id}";}}', 1, 0, 35),
+('bx_tasks_view_actions', 'bx_tasks', 'set-badges', '_sys_menu_item_title_system_set_badges', '_sys_menu_item_title_set_badges', 'javascript:void(0)', 'bx_menu_popup(''sys_set_badges'', window, {}, {module: ''bx_tasks'', content_id: {content_id}});', '', 'check-circle', '', '', 0, 2147483647, 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 40),
+('bx_tasks_view_actions', 'bx_tasks', 'comment', '_sys_menu_item_title_system_va_comment', '', '', '', '', '', '', '', 0, 2147483647, '', 0, 0, 200),
+('bx_tasks_view_actions', 'bx_tasks', 'view', '_sys_menu_item_title_system_va_view', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 210),
+('bx_tasks_view_actions', 'bx_tasks', 'vote', '_sys_menu_item_title_system_va_vote', '', '', '', '', '', '', '', 0, 2147483647, '', 0, 0, 220),
+('bx_tasks_view_actions', 'bx_tasks', 'reaction', '_sys_menu_item_title_system_va_reaction', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 225),
+('bx_tasks_view_actions', 'bx_tasks', 'score', '_sys_menu_item_title_system_va_score', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 230),
+('bx_tasks_view_actions', 'bx_tasks', 'favorite', '_sys_menu_item_title_system_va_favorite', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 240),
+('bx_tasks_view_actions', 'bx_tasks', 'feature', '_sys_menu_item_title_system_va_feature', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 250),
+('bx_tasks_view_actions', 'bx_tasks', 'repost', '_sys_menu_item_title_system_va_repost', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 260),
+('bx_tasks_view_actions', 'bx_tasks', 'report', '_sys_menu_item_title_system_va_report', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 270),
+('bx_tasks_view_actions', 'bx_tasks', 'notes', '_sys_menu_item_title_system_va_notes', '_sys_menu_item_title_va_notes', 'javascript:void(0)', 'javascript:bx_get_notes(this,  ''{module_uri}'', {content_id});', '', 'exclamation-triangle', '', '', 0, 2147483647, '', 1, 0, 280),
+('bx_tasks_view_actions', 'bx_tasks', 'social-sharing-facebook', '_sys_menu_item_title_system_social_sharing_facebook', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 300),
+('bx_tasks_view_actions', 'bx_tasks', 'social-sharing-twitter', '_sys_menu_item_title_system_social_sharing_twitter', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 320),
+('bx_tasks_view_actions', 'bx_tasks', 'social-sharing-pinterest', '_sys_menu_item_title_system_social_sharing_pinterest', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 330),
+('bx_tasks_view_actions', 'bx_tasks', 'more-auto', '_sys_menu_item_title_system_va_more_auto', '_sys_menu_item_title_va_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, '', 1, 0, 9999);
+
+
+-- MENU: sub-menu for view entry
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_view_submenu', '_bx_tasks_menu_title_view_entry_submenu', 'bx_tasks_view_submenu', 'bx_tasks', 8, 0, 1, 'BxTasksMenuView', 'modules/boonex/tasks/classes/BxTasksMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_tasks_view_submenu', 'bx_tasks', '_bx_tasks_menu_set_title_view_entry_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_tasks_view_submenu', 'bx_tasks', 'view-task', '_bx_tasks_menu_item_title_system_view_entry', '_bx_tasks_menu_item_title_view_entry_submenu_entry', 'page.php?i=view-task&id={content_id}', '', '', '', '', 2147483647, 0, 0, 1),
+('bx_tasks_view_submenu', 'bx_tasks', 'view-task-comments', '_bx_tasks_menu_item_title_system_view_entry_comments', '_bx_tasks_menu_item_title_view_entry_submenu_comments', 'page.php?i=view-task-comments&id={content_id}', '', '', '', '', 2147483647, 0, 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_tasks', 'tasks-administration', '_bx_tasks_menu_item_title_system_admt_tasks', '_bx_tasks_menu_item_title_admt_tasks', 'page.php?i=tasks-administration', '', '_self', 'tasks', 'a:2:{s:6:"module";s:8:"bx_tasks";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_group_view_submenu', 'bx_tasks', 'tasks-context', '_bx_tasks_menu_item_title_system_view_entries_in_context', '_bx_tasks_menu_item_title_view_entries_in_context', 'page.php?i=tasks-context&profile_id={profile_id}', '', '', 'tasks col-red3', '', 2147483647, 1, 0, 0);
+
+
+-- 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_tasks_allow_view_to', 'bx_tasks', 'view', '_bx_tasks_form_entry_input_allow_view_to', '3', 'bx_tasks_tasks', 'id', 'author', '', '');
+
+
+-- ACL
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_tasks', 'create entry', NULL, '_bx_tasks_acl_action_create_entry', '', 1, 3);
+SET @iIdActionEntryCreate = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_tasks', 'delete entry', NULL, '_bx_tasks_acl_action_delete_entry', '', 1, 3);
+SET @iIdActionEntryDelete = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_tasks', 'view entry', NULL, '_bx_tasks_acl_action_view_entry', '', 1, 0);
+SET @iIdActionEntryView = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_tasks', 'set thumb', NULL, '_bx_tasks_acl_action_set_thumb', '', 1, 3);
+SET @iIdActionSetThumb = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_tasks', 'edit any entry', NULL, '_bx_tasks_acl_action_edit_any_entry', '', 1, 3);
+SET @iIdActionEntryEditAny = 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
+
+-- entry create
+(@iStandard, @iIdActionEntryCreate),
+(@iModerator, @iIdActionEntryCreate),
+(@iAdministrator, @iIdActionEntryCreate),
+(@iPremium, @iIdActionEntryCreate),
+
+-- entry delete
+(@iStandard, @iIdActionEntryDelete),
+(@iModerator, @iIdActionEntryDelete),
+(@iAdministrator, @iIdActionEntryDelete),
+(@iPremium, @iIdActionEntryDelete),
+
+-- entry view
+(@iUnauthenticated, @iIdActionEntryView),
+(@iAccount, @iIdActionEntryView),
+(@iStandard, @iIdActionEntryView),
+(@iUnconfirmed, @iIdActionEntryView),
+(@iPending, @iIdActionEntryView),
+(@iModerator, @iIdActionEntryView),
+(@iAdministrator, @iIdActionEntryView),
+(@iPremium, @iIdActionEntryView),
+
+-- set entry thumb
+(@iStandard, @iIdActionSetThumb),
+(@iModerator, @iIdActionSetThumb),
+(@iAdministrator, @iIdActionSetThumb),
+(@iPremium, @iIdActionSetThumb),
+
+-- edit any entry
+(@iModerator, @iIdActionEntryEditAny),
+(@iAdministrator, @iIdActionEntryEditAny);
+
+
+-- SEARCH
+SET @iSearchOrder = (SELECT IFNULL(MAX(`Order`), 0) FROM `sys_objects_search`);
+INSERT INTO `sys_objects_search` (`ObjectName`, `Title`, `Order`, `ClassName`, `ClassPath`) VALUES
+('bx_tasks', '_bx_tasks', @iSearchOrder + 1, 'BxTasksSearchResult', 'modules/boonex/tasks/classes/BxTasksSearchResult.php'),
+('bx_tasks_cmts', '_bx_tasks_cmts', @iSearchOrder + 2, 'BxTasksCmtsSearchResult', 'modules/boonex/tasks/classes/BxTasksCmtsSearchResult.php');
+
+-- CONNECTIONS
+INSERT INTO `sys_objects_connection` (`object`, `table`, `type`, `override_class_name`, `override_class_file`) VALUES
+('bx_tasks_assignments', 'bx_tasks_assignments', 'one-way', '', '');
+
+-- 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_tasks_cats', 'bx_tasks', 'bx_tasks', 'bx_tasks_cats', 'bx_tasks_tasks', 'cat', 'INNER JOIN `sys_profiles` ON (`sys_profiles`.`id` = ABS(`bx_tasks_tasks`.`author`))', 'AND `sys_profiles`.`status` = ''active''', '', '');
+
+-- STATS
+SET @iMaxOrderStats = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_statistics`);
+INSERT INTO `sys_statistics` (`module`, `name`, `title`, `link`, `icon`, `query`, `order`) VALUES 
+('bx_tasks', 'bx_tasks', '_bx_tasks', 'page.php?i=tasks-home', 'tasks col-red3', 'SELECT COUNT(*) FROM `bx_tasks_tasks` WHERE 1 AND `status` = ''active'' AND `status_admin` = ''active''', @iMaxOrderStats + 1);
+
+-- CHARTS
+SET @iMaxOrderCharts = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_objects_chart`);
+INSERT INTO `sys_objects_chart` (`object`, `title`, `table`, `field_date_ts`, `field_date_dt`, `field_status`, `query`, `active`, `order`, `class_name`, `class_file`) VALUES
+('bx_tasks_growth', '_bx_tasks_chart_growth', 'bx_tasks_tasks', 'added', '', 'status,status_admin', '', 1, @iMaxOrderCharts + 1, 'BxDolChartGrowth', ''),
+('bx_tasks_growth_speed', '_bx_tasks_chart_growth_speed', 'bx_tasks_tasks', 'added', '', 'status,status_admin', '', 1, @iMaxOrderCharts + 2, 'BxDolChartGrowthSpeed', '');
+
+-- GRIDS: moderation tools
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
+('bx_tasks_administration', 'Sql', 'SELECT * FROM `bx_tasks_tasks` WHERE 1 ', 'bx_tasks_tasks', 'id', 'added', 'status_admin', '', 20, NULL, 'start', '', 'title,text', '', 'like', 'reports', '', 192, 'BxTasksGridAdministration', 'modules/boonex/tasks/classes/BxTasksGridAdministration.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_tasks_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_tasks_administration', 'switcher', '_bx_tasks_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('bx_tasks_administration', 'reports', '_sys_txt_reports_title', '5%', 0, '', '', 3),
+('bx_tasks_administration', 'title', '_bx_tasks_grid_column_title_adm_title', '25%', 0, '25', '', 4),
+('bx_tasks_administration', 'added', '_bx_tasks_grid_column_title_adm_added', '20%', 1, '25', '', 5),
+('bx_tasks_administration', 'author', '_bx_tasks_grid_column_title_adm_author', '20%', 0, '25', '', 6),
+('bx_tasks_administration', 'actions', '', '20%', 0, '', '', 7);
+
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_tasks_administration', 'bulk', 'delete', '_bx_tasks_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_tasks_administration', 'single', 'edit', '_bx_tasks_grid_action_title_adm_edit', 'pencil-alt', 1, 0, 1),
+('bx_tasks_administration', 'single', 'delete', '_bx_tasks_grid_action_title_adm_delete', 'remove', 1, 1, 2),
+('bx_tasks_administration', 'single', 'settings', '_bx_tasks_grid_action_title_adm_more_actions', 'cog', 1, 0, 3),
+('bx_tasks_administration', 'single', 'audit_content', '_bx_tasks_grid_action_title_adm_audit_content', 'search', 1, 0, 4);
+
+-- UPLOADERS
+
+INSERT INTO `sys_objects_uploader` (`object`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_tasks_simple', 1, 'BxTasksUploaderSimple', 'modules/boonex/tasks/classes/BxTasksUploaderSimple.php'),
+('bx_tasks_html5', 1, 'BxTasksUploaderHTML5', 'modules/boonex/tasks/classes/BxTasksUploaderHTML5.php'),
+('bx_tasks_photos_simple', 1, 'BxTasksUploaderSimpleAttach', 'modules/boonex/tasks/classes/BxTasksUploaderSimpleAttach.php'),
+('bx_tasks_photos_html5', 1, 'BxTasksUploaderHTML5Attach', 'modules/boonex/tasks/classes/BxTasksUploaderHTML5Attach.php'),
+('bx_tasks_videos_simple', 1, 'BxTasksUploaderSimpleAttach', 'modules/boonex/tasks/classes/BxTasksUploaderSimpleAttach.php'),
+('bx_tasks_videos_html5', 1, 'BxTasksUploaderHTML5Attach', 'modules/boonex/tasks/classes/BxTasksUploaderHTML5Attach.php'),
+('bx_tasks_files_simple', 1, 'BxTasksUploaderSimpleAttach', 'modules/boonex/tasks/classes/BxTasksUploaderSimpleAttach.php'),
+('bx_tasks_files_html5', 1, 'BxTasksUploaderHTML5Attach', 'modules/boonex/tasks/classes/BxTasksUploaderHTML5Attach.php');
+
+-- ALERTS
+
+INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
+('bx_tasks', 'BxTasksAlertsResponse', 'modules/boonex/tasks/classes/BxTasksAlertsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('system', 'save_setting', @iHandler),
+('profile', 'delete', @iHandler),
+
+('bx_tasks_videos_mp4', 'transcoded', @iHandler);
+
+
+-- CRON
+INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
+('bx_tasks_publishing', '* * * * *', 'BxTasksCronPublishing', 'modules/boonex/tasks/classes/BxTasksCronPublishing.php', '');

+ 530 - 0
modules/boonex/tasks/install/sql/install.sql

@@ -0,0 +1,530 @@
+-- TABLE: entries
+CREATE TABLE IF NOT EXISTS `bx_tasks_tasks` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `author` int(11) NOT NULL,
+  `added` int(11) NOT NULL,
+  `changed` int(11) NOT NULL,
+  `published` int(11) NOT NULL,
+  `thumb` int(11) NOT NULL,
+  `title` varchar(255) NOT NULL,
+  `cat` int(11) NOT NULL,
+  `multicat` text NOT NULL,
+  `text` mediumtext NOT NULL,
+  `labels` text NOT NULL,
+  `views` int(11) NOT NULL default '0',
+  `rate` float NOT NULL default '0',
+  `votes` int(11) NOT NULL default '0',
+  `rrate` float NOT NULL default '0',
+  `rvotes` int(11) NOT NULL default '0',
+  `score` int(11) NOT NULL default '0',
+  `sc_up` int(11) NOT NULL default '0',
+  `sc_down` int(11) NOT NULL default '0',
+  `favorites` int(11) NOT NULL default '0',
+  `comments` int(11) NOT NULL default '0',
+  `reports` int(11) NOT NULL default '0',
+  `featured` int(11) NOT NULL default '0',
+  `due_date` int(11) NOT NULL,
+  `tasks_list` int(11) NOT NULL,	
+  `completed` tinyint(4) NOT NULL DEFAULT '0', 
+  `allow_view_to` varchar(16) NOT NULL DEFAULT '3',
+  `disable_comments` tinyint(4) NOT NULL DEFAULT '0',
+  `status` enum('active','awaiting','failed','hidden') NOT NULL DEFAULT 'active',
+  `status_admin` enum('active','hidden') NOT NULL DEFAULT 'active',
+  PRIMARY KEY (`id`),
+  FULLTEXT KEY `title_text` (`title`,`text`)
+);
+
+-- TABLE: task-lists
+CREATE TABLE IF NOT EXISTS `bx_tasks_lists` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `context_id` int(11) NOT NULL,
+  `title` varchar(255) NOT NULL,
+  PRIMARY KEY (`id`)
+);
+
+-- TABLE: assignment
+CREATE TABLE IF NOT EXISTS `bx_tasks_assignments` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `initiator` int(11) NOT NULL,
+  `content` int(11) NOT NULL,
+  `added` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `initiator` (`initiator`,`content`),
+  KEY `content` (`content`)
+);
+
+-- TABLE: storages & transcoders
+CREATE TABLE IF NOT EXISTS `bx_tasks_covers` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_files` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_photos` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_photos_resized` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_videos` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_videos_resized` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+-- TABLE: comments
+CREATE TABLE IF NOT EXISTS `bx_tasks_cmts` (
+  `cmt_id` int(11) NOT NULL AUTO_INCREMENT,
+  `cmt_parent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_vparent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_object_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_author_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_level` int(11) NOT NULL DEFAULT '0',
+  `cmt_text` text NOT NULL,
+  `cmt_mood` tinyint(4) NOT NULL DEFAULT '0',
+  `cmt_rate` int(11) NOT NULL DEFAULT '0',
+  `cmt_rate_count` int(11) NOT NULL DEFAULT '0',
+  `cmt_time` int(11) unsigned NOT NULL DEFAULT '0',
+  `cmt_replies` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`cmt_id`),
+  KEY `cmt_object_id` (`cmt_object_id`,`cmt_parent_id`),
+  FULLTEXT KEY `search_fields` (`cmt_text`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_cmts_notes` (
+  `cmt_id` int(11) NOT NULL AUTO_INCREMENT,
+  `cmt_parent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_vparent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_object_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_author_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_level` int(11) NOT NULL DEFAULT '0',
+  `cmt_text` text NOT NULL,
+  `cmt_mood` tinyint(4) NOT NULL DEFAULT '0',
+  `cmt_rate` int(11) NOT NULL DEFAULT '0',
+  `cmt_rate_count` int(11) NOT NULL DEFAULT '0',
+  `cmt_time` int(11) unsigned NOT NULL DEFAULT '0',
+  `cmt_replies` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`cmt_id`),
+  KEY `cmt_object_id` (`cmt_object_id`,`cmt_parent_id`),
+  FULLTEXT KEY `search_fields` (`cmt_text`)
+);
+
+-- TABLE: votes
+CREATE TABLE IF NOT EXISTS `bx_tasks_votes` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_votes_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_reactions` (
+  `object_id` int(11) NOT NULL default '0',
+  `reaction` varchar(32) NOT NULL default '',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `reaction` (`object_id`, `reaction`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_reactions_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `reaction` varchar(32) NOT NULL default '',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+-- TABLE: views
+CREATE TABLE `bx_tasks_views_track` (
+  `object_id` int(11) NOT NULL default '0',
+  `viewer_id` int(11) NOT NULL default '0',
+  `viewer_nip` int(11) unsigned NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  KEY `id` (`object_id`,`viewer_id`,`viewer_nip`)
+);
+
+-- TABLE: metas
+CREATE TABLE `bx_tasks_meta_keywords` (
+  `object_id` int(10) unsigned NOT NULL,
+  `keyword` varchar(255) NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `keyword` (`keyword`)
+);
+
+CREATE TABLE `bx_tasks_meta_mentions` (
+  `object_id` int(10) unsigned NOT NULL,
+  `profile_id` int(10) unsigned NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `profile_id` (`profile_id`)
+);
+
+-- TABLE: reports
+CREATE TABLE IF NOT EXISTS `bx_tasks_reports` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_reports_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `type` varchar(32) NOT NULL default '',
+  `text` text NOT NULL default '',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `report` (`object_id`, `author_nip`)
+);
+
+-- TABLE: favorites
+CREATE TABLE `bx_tasks_favorites_track` (
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  KEY `id` (`object_id`,`author_id`)
+);
+
+-- TABLE: scores
+CREATE TABLE IF NOT EXISTS `bx_tasks_scores` (
+  `object_id` int(11) NOT NULL default '0',
+  `count_up` int(11) NOT NULL default '0',
+  `count_down` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_tasks_scores_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `type` varchar(8) NOT NULL default '',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+
+-- STORAGES & TRANSCODERS
+SET @sStorageEngine = (SELECT `value` FROM `sys_options` WHERE `name` = 'sys_storage_default');
+
+INSERT INTO `sys_objects_storage` (`object`, `engine`, `params`, `token_life`, `cache_control`, `levels`, `table_files`, `ext_mode`, `ext_allow`, `ext_deny`, `quota_size`, `current_size`, `quota_number`, `current_number`, `max_file_size`, `ts`) VALUES
+('bx_tasks_covers', @sStorageEngine, '', 360, 2592000, 3, 'bx_tasks_covers', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+
+('bx_tasks_photos', @sStorageEngine, '', 360, 2592000, 3, 'bx_tasks_photos', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('bx_tasks_photos_resized', @sStorageEngine, '', 360, 2592000, 3, 'bx_tasks_photos_resized', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+
+('bx_tasks_videos', @sStorageEngine, '', 360, 2592000, 3, 'bx_tasks_videos', 'allow-deny', 'avi,flv,mpg,mpeg,wmv,mp4,m4v,mov,qt,divx,xvid,3gp,3g2,webm,mkv,ogv,ogg,rm,rmvb,asf,drc', '', 0, 0, 0, 0, 0, 0),
+('bx_tasks_videos_resized', @sStorageEngine, '', 360, 2592000, 3, 'bx_tasks_videos_resized', 'allow-deny', 'jpg,jpeg,jpe,gif,png,avi,flv,mpg,mpeg,wmv,mp4,m4v,mov,qt,divx,xvid,3gp,3g2,webm,mkv,ogv,ogg,rm,rmvb,asf,drc', '', 0, 0, 0, 0, 0, 0),
+
+('bx_tasks_files', @sStorageEngine, '', 360, 2592000, 3, 'bx_tasks_files', 'deny-allow', '', 'action,apk,app,bat,bin,cmd,com,command,cpl,csh,exe,gadget,inf,ins,inx,ipa,isu,job,jse,ksh,lnk,msc,msi,msp,mst,osx,out,paf,pif,prg,ps1,reg,rgs,run,sct,shb,shs,u3p,vb,vbe,vbs,vbscript,workflow,ws,wsf', 0, 0, 0, 0, 0, 0);
+
+INSERT INTO `sys_objects_transcoder` (`object`, `storage_object`, `source_type`, `source_params`, `private`, `atime_tracking`, `atime_pruning`, `ts`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_preview', 'bx_tasks_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_covers";}', 'no', '1', '2592000', '0', '', ''),
+('bx_tasks_gallery', 'bx_tasks_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_covers";}', 'no', '1', '2592000', '0', '', ''),
+('bx_tasks_cover', 'bx_tasks_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_covers";}', 'no', '1', '2592000', '0', '', ''),
+
+('bx_tasks_preview_photos', 'bx_tasks_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_photos";}', 'no', '1', '2592000', '0', '', ''),
+('bx_tasks_gallery_photos', 'bx_tasks_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_photos";}', 'no', '1', '2592000', '0', '', ''),
+
+('bx_tasks_videos_poster', 'bx_tasks_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_tasks_videos_poster_preview', 'bx_tasks_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_tasks_videos_mp4', 'bx_tasks_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_tasks_videos_mp4_hd', 'bx_tasks_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_tasks_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+
+('bx_tasks_preview_files', 'bx_tasks_photos_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_tasks_files";}', 'no', '1', '2592000', '0', '', ''),
+('bx_tasks_gallery_files', 'bx_tasks_photos_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_tasks_files";}', 'no', '1', '2592000', '0', '', '');
+
+INSERT INTO `sys_transcoder_filters` (`transcoder_object`, `filter`, `filter_params`, `order`) VALUES 
+('bx_tasks_preview', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:11:"crop_resize";s:1:"1";}', '0'),
+('bx_tasks_gallery', 'Resize', 'a:1:{s:1:"w";s:3:"500";}', '0'),
+('bx_tasks_cover', 'Resize', 'a:1:{s:1:"w";s:4:"2000";}', '0'),
+
+('bx_tasks_preview_photos', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:11:"crop_resize";s:1:"1";}', '0'),
+('bx_tasks_gallery_photos', 'Resize', 'a:1:{s:1:"w";s:4:"2000";}', '0'),
+
+('bx_tasks_videos_poster_preview', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:13:"square_resize";s:1:"1";}', 10),
+('bx_tasks_videos_poster_preview', 'Poster', 'a:2:{s:1:"h";s:3:"480";s:10:"force_type";s:3:"jpg";}', 0),
+('bx_tasks_videos_poster', 'Poster', 'a:2:{s:1:"h";s:3:"318";s:10:"force_type";s:3:"jpg";}', 0),
+('bx_tasks_videos_mp4', 'Mp4', 'a:2:{s:1:"h";s:3:"318";s:10:"force_type";s:3:"mp4";}', 0),
+('bx_tasks_videos_mp4_hd', 'Mp4', 'a:3:{s:1:"h";s:3:"720";s:13:"video_bitrate";s:4:"1536";s:10:"force_type";s:3:"mp4";}', 0),
+
+('bx_tasks_preview_files', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:11:"crop_resize";s:1:"1";}', '0'),
+('bx_tasks_gallery_files', 'Resize', 'a:1:{s:1:"w";s:3:"500";}', '0');
+
+
+-- FORMS: entry (task)
+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_tasks', 'bx_tasks', '_bx_tasks_form_entry', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', 'bx_tasks_tasks', 'id', '', '', 'a:2:{i:0;s:9:"do_submit";i:1;s:10:"do_publish";}', '', 0, 1, 'BxTasksFormEntry', 'modules/boonex/tasks/classes/BxTasksFormEntry.php');
+
+INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`, `title`) VALUES 
+('bx_tasks', 'bx_tasks_entry_add', 'bx_tasks', 0, '_bx_tasks_form_entry_display_add'),
+('bx_tasks', 'bx_tasks_entry_delete', 'bx_tasks', 0, '_bx_tasks_form_entry_display_delete'),
+('bx_tasks', 'bx_tasks_entry_edit', 'bx_tasks', 0, '_bx_tasks_form_entry_display_edit'),
+('bx_tasks', 'bx_tasks_entry_view', 'bx_tasks', 1, '_bx_tasks_form_entry_display_view');
+
+INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES 
+('bx_tasks', 'bx_tasks', 'allow_view_to', '', '', 0, 'custom', '_bx_tasks_form_entry_input_sys_allow_view_to', '_bx_tasks_form_entry_input_allow_view_to', '', 1, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'delete_confirm', 1, '', 0, 'checkbox', '_bx_tasks_form_entry_input_sys_delete_confirm', '_bx_tasks_form_entry_input_delete_confirm', '_bx_tasks_form_entry_input_delete_confirm_info', 1, 0, 0, '', '', '', 'Avail', '', '_bx_tasks_form_entry_input_delete_confirm_error', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'do_publish', '_bx_tasks_form_entry_input_do_publish', '', 0, 'submit', '_bx_tasks_form_entry_input_sys_do_publish', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'do_submit', '_bx_tasks_form_entry_input_do_submit', '', 0, 'submit', '_bx_tasks_form_entry_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'covers', 'a:1:{i:0;s:14:"bx_tasks_html5";}', 'a:2:{s:15:"bx_tasks_simple";s:26:"_sys_uploader_simple_title";s:14:"bx_tasks_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_tasks_form_entry_input_sys_covers', '_bx_tasks_form_entry_input_covers', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'pictures', 'a:1:{i:0;s:21:"bx_tasks_photos_html5";}', 'a:2:{s:22:"bx_tasks_photos_simple";s:26:"_sys_uploader_simple_title";s:21:"bx_tasks_photos_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_tasks_form_entry_input_sys_pictures', '_bx_tasks_form_entry_input_pictures', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'videos', 'a:1:{i:0;s:21:"bx_tasks_videos_html5";}', 'a:2:{s:22:"bx_tasks_videos_simple";s:26:"_sys_uploader_simple_title";s:21:"bx_tasks_videos_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_tasks_form_entry_input_sys_videos', '_bx_tasks_form_entry_input_videos', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'files', 'a:1:{i:0;s:20:"bx_tasks_files_html5";}', 'a:2:{s:21:"bx_tasks_files_simple";s:26:"_sys_uploader_simple_title";s:20:"bx_tasks_files_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_tasks_form_entry_input_sys_files', '_bx_tasks_form_entry_input_files', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'text', '', '', 0, 'textarea', '_bx_tasks_form_entry_input_sys_text', '_bx_tasks_form_entry_input_text', '', 0, 0, 2, '', '', '', '', '', '', 'XssHtml', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'title', '', '', 0, 'text', '_bx_tasks_form_entry_input_sys_title', '_bx_tasks_form_entry_input_title', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_tasks_form_entry_input_title_err', 'Xss', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'cat', '', '#!bx_tasks_cats', 0, 'select', '_bx_tasks_form_entry_input_sys_cat', '_bx_tasks_form_entry_input_cat', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_tasks_form_entry_input_cat_err', 'Xss', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'multicat', '', '', 0, 'custom', '_bx_tasks_form_entry_input_sys_multicat', '_bx_tasks_form_entry_input_multicat', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_tasks_form_entry_input_multicat_err', 'Xss', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'added', '', '', 0, 'datetime', '_bx_tasks_form_entry_input_sys_date_added', '_bx_tasks_form_entry_input_date_added', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'changed', '', '', 0, 'datetime', '_bx_tasks_form_entry_input_sys_date_changed', '_bx_tasks_form_entry_input_date_changed', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'published', '', '', 0, 'datetime', '_bx_tasks_form_entry_input_sys_date_published', '_bx_tasks_form_entry_input_date_published', '_bx_tasks_form_entry_input_date_published_info', 0, 0, 0, '', '', '', '', '', '', 'DateTimeTs', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'initial_members', '', '', 0, 'custom', '_bx_tasks_form_profile_input_sys_initial_members', '_bx_tasks_form_profile_input_initial_members', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 1),
+('bx_tasks', 'bx_tasks', 'due_date', '', '', 0, 'datetime', '_bx_tasks_form_entry_input_sys_date_due_date', '_bx_tasks_form_entry_input_date_due_date', '', 0, 0, 0, '', '', '', '', '', '', 'DateTimeTs', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'attachments', '', '', 0, 'custom', '_bx_tasks_form_entry_input_sys_attachments', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'labels', '', '', 0, 'custom', '_sys_form_input_sys_labels', '_sys_form_input_labels', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'anonymous', '', '', 0, 'switcher', '_sys_form_input_sys_anonymous', '_sys_form_input_anonymous', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'disable_comments', '1', '', 0, 'switcher', '_bx_tasks_form_entry_input_sys_disable_comments', '_bx_tasks_form_entry_input_disable_comments', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0);
+
+
+
+INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES 
+('bx_tasks_entry_add', 'delete_confirm', 2147483647, 0, 1),
+('bx_tasks_entry_add', 'title', 2147483647, 1, 2),
+('bx_tasks_entry_add', 'text', 2147483647, 1, 3),
+('bx_tasks_entry_add', 'initial_members', 192, 1, 4),
+('bx_tasks_entry_add', 'due_date', 192, 1, 5),
+('bx_tasks_entry_add', 'do_publish', 2147483647, 1, 6),
+
+('bx_tasks_entry_delete', 'delete_confirm', 2147483647, 1, 1),
+('bx_tasks_entry_delete', 'do_submit', 2147483647, 1, 2),
+
+('bx_tasks_entry_edit', 'do_publish', 2147483647, 0, 1),
+('bx_tasks_entry_edit', 'delete_confirm', 2147483647, 0, 2),
+('bx_tasks_entry_edit', 'title', 2147483647, 1, 3),
+('bx_tasks_entry_edit', 'text', 2147483647, 1, 4),
+('bx_tasks_entry_edit', 'attachments', 2147483647, 1, 5),
+('bx_tasks_entry_edit', 'pictures', 2147483647, 1, 6),
+('bx_tasks_entry_edit', 'videos', 2147483647, 1, 7),
+('bx_tasks_entry_edit', 'files', 2147483647, 1, 8),
+('bx_tasks_entry_edit', 'allow_view_to', 2147483647, 1, 9),
+('bx_tasks_entry_edit', 'tasks_list', 192, 1, 10),
+('bx_tasks_entry_edit', 'initial_members', 192, 1, 11),
+('bx_tasks_entry_edit', 'due_date', 192, 1, 12),
+('bx_tasks_entry_edit', 'do_submit', 2147483647, 1, 13),
+
+('bx_tasks_entry_view', 'cat', 2147483647, 1, 1),
+('bx_tasks_entry_view', 'added', 2147483647, 1, 2),
+('bx_tasks_entry_view', 'changed', 2147483647, 1, 3),
+('bx_tasks_entry_view', 'due_date', 192, 1, 4),
+('bx_tasks_entry_view', 'published', 192, 1, 5);
+
+
+-- FORMS: entry (tasklist)
+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_tasks_list', 'bx_tasks', '_bx_tasks_form_list_entry', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', 'bx_tasks_lists', 'id', '', '', 'do_submit', '', 0, 1, 'BxTasksFormListEntry', 'modules/boonex/tasks/classes/BxTasksFormListEntry.php');
+
+INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`, `title`) VALUES 
+('bx_tasks_list', 'bx_tasks_list_entry_add', 'bx_tasks', 0, '_bx_tasks_form_list_entry_display_add'),
+('bx_tasks_list', 'bx_tasks_list_entry_edit', 'bx_tasks', 0, '_bx_tasks_form_list_entry_display_edit');
+
+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_tasks_list', 'bx_tasks', 'do_submit', '_bx_tasks_form_list_entry_input_do_submit', '', 0, 'submit', '_bx_tasks_form_list_entry_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_tasks_list', 'bx_tasks', 'title', '', '', 0, 'text', '_bx_tasks_form_list_entry_input_sys_title', '_bx_tasks_form_list_entry_input_title', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_tasks_form_list_entry_input_title_err', 'Xss', '', 1, 0);
+
+
+INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES 
+('bx_tasks_list_entry_add', 'title', 2147483647, 1, 1),
+('bx_tasks_list_entry_add', 'do_submit', 2147483647, 1, 2),
+
+('bx_tasks_list_entry_edit', 'title', 2147483647, 1, 1),
+('bx_tasks_list_entry_edit', 'do_submit', 2147483647, 1, 2);
+
+
+-- PRE-VALUES
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_tasks_cats', '_bx_tasks_pre_lists_cats', 'bx_tasks', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_tasks_cats', '', 0, '_sys_please_select', ''),
+('bx_tasks_cats', '1', 1, '_bx_tasks_cat_Animals_Pets', ''),
+('bx_tasks_cats', '2', 2, '_bx_tasks_cat_Architecture', ''),
+('bx_tasks_cats', '3', 3, '_bx_tasks_cat_Art', ''),
+('bx_tasks_cats', '4', 4, '_bx_tasks_cat_Cars_Motorcycles', ''),
+('bx_tasks_cats', '5', 5, '_bx_tasks_cat_Celebrities', ''),
+('bx_tasks_cats', '6', 6, '_bx_tasks_cat_Design', ''),
+('bx_tasks_cats', '7', 7, '_bx_tasks_cat_DIY_Crafts', ''),
+('bx_tasks_cats', '8', 8, '_bx_tasks_cat_Education', ''),
+('bx_tasks_cats', '9', 9, '_bx_tasks_cat_Film_Music_Books', ''),
+('bx_tasks_cats', '10', 10, '_bx_tasks_cat_Food_Drink', ''),
+('bx_tasks_cats', '11', 11, '_bx_tasks_cat_Gardening', ''),
+('bx_tasks_cats', '12', 12, '_bx_tasks_cat_Geek', ''),
+('bx_tasks_cats', '13', 13, '_bx_tasks_cat_Hair_Beauty', ''),
+('bx_tasks_cats', '14', 14, '_bx_tasks_cat_Health_Fitness', ''),
+('bx_tasks_cats', '15', 15, '_bx_tasks_cat_History', ''),
+('bx_tasks_cats', '16', 16, '_bx_tasks_cat_Holidays_Events', ''),
+('bx_tasks_cats', '17', 17, '_bx_tasks_cat_Home_Decor', ''),
+('bx_tasks_cats', '18', 18, '_bx_tasks_cat_Humor', ''),
+('bx_tasks_cats', '19', 19, '_bx_tasks_cat_Illustrations_Posters', ''),
+('bx_tasks_cats', '20', 20, '_bx_tasks_cat_Kids_Parenting', ''),
+('bx_tasks_cats', '21', 21, '_bx_tasks_cat_Mens_Fashion', ''),
+('bx_tasks_cats', '22', 22, '_bx_tasks_cat_Outdoors', ''),
+('bx_tasks_cats', '23', 23, '_bx_tasks_cat_Photography', ''),
+('bx_tasks_cats', '24', 24, '_bx_tasks_cat_Products', ''),
+('bx_tasks_cats', '25', 25, '_bx_tasks_cat_Quotes', ''),
+('bx_tasks_cats', '26', 26, '_bx_tasks_cat_Science_Nature', ''),
+('bx_tasks_cats', '27', 27, '_bx_tasks_cat_Sports', ''),
+('bx_tasks_cats', '28', 28, '_bx_tasks_cat_Tattoos', ''),
+('bx_tasks_cats', '29', 29, '_bx_tasks_cat_Technology', ''),
+('bx_tasks_cats', '30', 30, '_bx_tasks_cat_Travel', ''),
+('bx_tasks_cats', '31', 31, '_bx_tasks_cat_Weddings', ''),
+('bx_tasks_cats', '32', 32, '_bx_tasks_cat_Womens_Fashion', '');
+
+-- COMMENTS
+INSERT INTO `sys_objects_cmts` (`Name`, `Module`, `Table`, `CharsPostMin`, `CharsPostMax`, `CharsDisplayMax`, `Html`, `PerView`, `PerViewReplies`, `BrowseType`, `IsBrowseSwitch`, `PostFormPosition`, `NumberOfLevels`, `IsDisplaySwitch`, `IsRatable`, `ViewingThreshold`, `IsOn`, `RootStylePrefix`, `BaseUrl`, `ObjectVote`, `TriggerTable`, `TriggerFieldId`, `TriggerFieldAuthor`, `TriggerFieldTitle`, `TriggerFieldComments`, `ClassName`, `ClassFile`) VALUES
+('bx_tasks', 'bx_tasks', 'bx_tasks_cmts', 1, 5000, 1000, 3, 5, 3, 'tail', 1, 'bottom', 1, 1, 1, -3, 1, 'cmt', 'page.php?i=view-task&id={object_id}', '', 'bx_tasks_tasks', 'id', 'author', 'title', 'comments', '', ''),
+('bx_tasks_notes', 'bx_tasks', 'bx_tasks_cmts_notes', 1, 5000, 1000, 3, 5, 3, 'tail', 1, 'bottom', 1, 1, 1, -3, 1, 'cmt', 'page.php?i=view-task&id={object_id}', '', 'bx_tasks_tasks', 'id', 'author', 'title', 'comments', '', '');
+
+-- VOTES
+INSERT INTO `sys_objects_vote` (`Name`, `TableMain`, `TableTrack`, `PostTimeout`, `MinValue`, `MaxValue`, `IsUndo`, `IsOn`, `TriggerTable`, `TriggerFieldId`, `TriggerFieldAuthor`, `TriggerFieldRate`, `TriggerFieldRateCount`, `ClassName`, `ClassFile`) VALUES 
+('bx_tasks', 'bx_tasks_votes', 'bx_tasks_votes_track', '604800', '1', '1', '0', '1', 'bx_tasks_tasks', 'id', 'author', 'rate', 'votes', '', ''),
+('bx_tasks_reactions', 'bx_tasks_reactions', 'bx_tasks_reactions_track', '604800', '1', '1', '1', '1', 'bx_tasks_tasks', 'id', 'author', 'rrate', 'rvotes', 'BxTemplVoteReactions', '');
+
+-- SCORES
+INSERT INTO `sys_objects_score` (`name`, `module`, `table_main`, `table_track`, `post_timeout`, `is_on`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_score`, `trigger_field_cup`, `trigger_field_cdown`, `class_name`, `class_file`) VALUES 
+('bx_tasks', 'bx_tasks', 'bx_tasks_scores', 'bx_tasks_scores_track', '604800', '0', 'bx_tasks_tasks', 'id', 'author', 'score', 'sc_up', 'sc_down', '', '');
+
+-- REPORTS
+INSERT INTO `sys_objects_report` (`name`, `table_main`, `table_track`, `is_on`, `base_url`, `object_comment`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_tasks', 'bx_tasks_reports', 'bx_tasks_reports_track', '1', 'page.php?i=view-task&id={object_id}', 'bx_tasks_notes', 'bx_tasks_tasks', 'id', 'author', 'reports', '', '');
+
+-- VIEWS
+INSERT INTO `sys_objects_view` (`name`, `table_track`, `period`, `is_on`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_tasks', 'bx_tasks_views_track', '86400', '1', 'bx_tasks_tasks', 'id', 'author', 'views', '', '');
+
+-- FAFORITES
+INSERT INTO `sys_objects_favorite` (`name`, `table_track`, `is_on`, `is_undo`, `is_public`, `base_url`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_tasks', 'bx_tasks_favorites_track', '1', '1', '1', 'page.php?i=view-task&id={object_id}', 'bx_tasks_tasks', 'id', 'author', 'favorites', '', '');
+
+-- FEATURED
+INSERT INTO `sys_objects_feature` (`name`, `is_on`, `is_undo`, `base_url`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_flag`, `class_name`, `class_file`) VALUES 
+('bx_tasks', '1', '1', 'page.php?i=view-task&id={object_id}', 'bx_tasks_tasks', 'id', 'author', 'featured', '', '');
+
+-- CONTENT INFO
+INSERT INTO `sys_objects_content_info` (`name`, `title`, `alert_unit`, `alert_action_add`, `alert_action_update`, `alert_action_delete`, `class_name`, `class_file`) VALUES
+('bx_tasks', '_bx_tasks', 'bx_tasks', 'added', 'edited', 'deleted', '', ''),
+('bx_tasks_cmts', '_bx_tasks_cmts', 'bx_tasks', 'commentPost', 'commentUpdated', 'commentRemoved', 'BxDolContentInfoCmts', '');
+
+INSERT INTO `sys_content_info_grids` (`object`, `grid_object`, `grid_field_id`, `condition`, `selection`) VALUES
+('bx_tasks', 'bx_tasks_administration', 'id', '', ''),
+('bx_tasks', 'bx_tasks_common', 'id', '', '');
+
+-- SEARCH EXTENDED
+INSERT INTO `sys_objects_search_extended` (`object`, `object_content_info`, `module`, `title`, `active`, `class_name`, `class_file`) VALUES
+('bx_tasks', 'bx_tasks', 'bx_tasks', '_bx_tasks_search_extended', 1, '', ''),
+('bx_tasks_cmts', 'bx_tasks_cmts', 'bx_tasks', '_bx_tasks_search_extended_cmts', 1, 'BxTemplSearchExtendedCmts', '');
+
+-- STUDIO: page & widget
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, 'bx_tasks', '_bx_tasks', '_bx_tasks', 'bx_tasks@modules/boonex/tasks/|std-icon.svg');
+SET @iPageId = LAST_INSERT_ID();
+
+SET @iParentPageId = (SELECT `id` FROM `sys_std_pages` WHERE `name` = 'home');
+SET @iParentPageOrder = (SELECT MAX(`order`) FROM `sys_std_pages_widgets` WHERE `page_id` = @iParentPageId);
+INSERT INTO `sys_std_widgets` (`page_id`, `module`, `url`, `click`, `icon`, `caption`, `cnt_notices`, `cnt_actions`) VALUES
+(@iPageId, 'bx_tasks', '{url_studio}module.php?name=bx_tasks', '', 'bx_tasks@modules/boonex/tasks/|std-icon.svg', '_bx_tasks', '', '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));
+

+ 61 - 0
modules/boonex/tasks/install/sql/uninstall.sql

@@ -0,0 +1,61 @@
+
+-- TABLES
+DROP TABLE IF EXISTS `bx_tasks_tasks`, `bx_tasks_lists`, `bx_tasks_assignments`, `bx_tasks_covers`, `bx_tasks_files`, `bx_tasks_photos`, `bx_tasks_photos_resized`, `bx_tasks_videos`, `bx_tasks_videos_resized`, `bx_tasks_cmts`, `bx_tasks_cmts_notes`, `bx_tasks_votes`, `bx_tasks_votes_track`, `bx_tasks_reactions`, `bx_tasks_reactions_track`, `bx_tasks_views_track`, `bx_tasks_meta_keywords`, `bx_tasks_meta_locations`, `bx_tasks_meta_mentions`, `bx_tasks_reports`, `bx_tasks_reports_track`, `bx_tasks_favorites_track`, `bx_tasks_scores`, `bx_tasks_scores_track`;
+
+-- STORAGES & TRANSCODERS
+DELETE FROM `sys_objects_storage` WHERE `object` LIKE 'bx_tasks_%';
+DELETE FROM `sys_storage_tokens` WHERE `object` LIKE 'bx_tasks_%';
+
+DELETE FROM `sys_objects_transcoder` WHERE `object` LIKE 'bx_tasks_%';
+DELETE FROM `sys_transcoder_filters` WHERE `transcoder_object` LIKE 'bx_tasks_%';
+DELETE FROM `sys_transcoder_images_files` WHERE `transcoder_object` LIKE 'bx_tasks_%';
+
+-- FORMS
+DELETE FROM `sys_objects_form` WHERE `module` = 'bx_tasks';
+DELETE FROM `sys_form_displays` WHERE `module` = 'bx_tasks';
+DELETE FROM `sys_form_inputs` WHERE `module` = 'bx_tasks';
+DELETE FROM `sys_form_display_inputs` WHERE `display_name` LIKE 'bx_tasks_%';
+
+-- PRE-VALUES
+DELETE FROM `sys_form_pre_lists` WHERE `module` = 'bx_tasks';
+
+DELETE FROM `sys_form_pre_values` WHERE `Key` IN('bx_tasks_cats');
+
+-- CATEGORIES
+DELETE FROM `sys_categories` WHERE `module` = 'bx_tasks';
+DELETE FROM `sys_categories2objects` WHERE `module` = 'bx_tasks';
+
+-- COMMENTS
+DELETE FROM `sys_objects_cmts` WHERE `Name` LIKE 'bx_tasks%';
+
+-- VOTES
+DELETE FROM `sys_objects_vote` WHERE `Name` IN ('bx_tasks', 'bx_tasks_reactions');
+
+-- SCORES
+DELETE FROM `sys_objects_score` WHERE `name` = 'bx_tasks';
+
+-- REPORTS
+DELETE FROM `sys_objects_report` WHERE `name` = 'bx_tasks';
+
+-- VIEWS
+DELETE FROM `sys_objects_view` WHERE `name` = 'bx_tasks';
+
+-- FAFORITES
+DELETE FROM `sys_objects_favorite` WHERE `name` = 'bx_tasks';
+
+-- FEATURED
+DELETE FROM `sys_objects_feature` WHERE `name` = 'bx_tasks';
+
+-- CONTENT INFO
+DELETE FROM `sys_objects_content_info` WHERE `name` IN ('bx_tasks', 'bx_tasks_cmts');
+
+DELETE FROM `sys_content_info_grids` WHERE `object` IN ('bx_tasks');
+
+-- SEARCH EXTENDED
+DELETE FROM `sys_objects_search_extended` WHERE `module` = 'bx_tasks';
+
+-- 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_tasks';
+

+ 55 - 0
modules/boonex/tasks/js/manage_tools.js

@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+function BxTasksManageTools(oOptions) {
+	this._iSearchTimeoutId = false;
+	this._sActionsUrl = oOptions.sActionUrl;
+	this._sObjNameGrid = oOptions.sObjNameGrid;
+    this._sObjName = oOptions.sObjName == undefined ? 'oBxTasksManageTools' : 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;
+}
+
+BxTasksManageTools.prototype.onChangeFilter = function(oFilter) {
+	var $this = this;
+	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 = '';
+
+	clearTimeout($this._iSearchTimeoutId);
+    $this._iSearchTimeoutId = setTimeout(function () {
+        glGrids[$this._sObjNameGrid].setFilter(sValueFilter1 + $this._sParamsDivider + sValueSearch, true);
+    }, 500);
+};
+
+BxTasksManageTools.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')
+	});
+};
+
+BxTasksManageTools.prototype.onClickDelete = function(iContentId) {
+	$('.bx-popup-applied:visible').dolPopupHide();
+
+	glGrids[this._sObjNameGrid].actionWithId(iContentId, 'delete', {}, '', false, 1);
+};
+
+/** @} */

+ 73 - 0
modules/boonex/tasks/js/tasks.js

@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+function BxTasksView(oOptions) {
+    this._sActionsUri = oOptions.sActionUri;
+    var $this = this;
+    $(document).ready(function () {
+        $this.init();
+    });
+}
+
+BxTasksView.prototype.init = function () {
+    var $this = this;
+}
+
+BxTasksView.prototype.setCompleted = function (iId, oObj) {
+    var $this = this;
+	var iVal = ($(oObj).attr('checked') != 'checked' ? 0 : 1);
+	$this._setCompleted(iId, iVal);
+}
+
+BxTasksView.prototype.setCompletedByMenu = function (iId, iValue, oObj) {
+    var $this = this;
+	$(oObj).addClass('bx-btn-disabled');
+	$this._setCompleted(iId, iValue)
+}
+
+BxTasksView.prototype._setCompleted = function (iId, iValue) {
+	var $this = this;
+	$.getJSON($this._sActionsUri + 'set_completed/' + iId + '/' + iValue + '/', {}, function () {});
+}
+	
+BxTasksView.prototype.processTaskList = function (iContextId, iId) {
+    var $this = this;
+	$(window).dolPopupAjax({
+        url: $this._sActionsUri + 'process_task_list_form/' + iContextId + '/' + iId + '/' ,
+        closeOnOuterClick: false
+    });   
+}
+	
+BxTasksView.prototype.processTask = function (iContextId, iListId) {
+    var $this = this;
+	$(window).dolPopupAjax({
+        url: $this._sActionsUri + 'process_task_form/' + iContextId + '/' + iListId + '/' ,
+        closeOnOuterClick: false
+    });   
+}
+
+BxTasksView.prototype.reloadData = function (iId, oObj) {
+	$(".bx-popup-applied:visible").dolPopupHide();
+	document.location.reload(true);
+}
+
+BxTasksView.prototype.setFilter = function (iListId, object) {
+	var $this = this;
+	var val = $(object).val();
+	
+	$('#bx-tasks-tasklist-' + iListId).removeClass (function (index, className) {
+    	return (className.match (/(^|\s)bx-tasks-tasklist-filter-\S+/g) || []).join(' ');
+	})
+	if (val)
+		$('#bx-tasks-tasklist-' + iListId).addClass('bx-tasks-tasklist-filter-' + val);
+  	
+	$.getJSON(this._sActionsUri + 'setFilterValue/' + iListId + '/' + val + '/' , function (oData) {
+	});
+}
+

+ 17 - 0
modules/boonex/tasks/request.php

@@ -0,0 +1,17 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
+
+check_logged();
+
+BxBaseModTextRequest::processAsAction($GLOBALS['aModule'], $GLOBALS['aRequest']);
+
+/** @} */

+ 3 - 0
modules/boonex/tasks/template/attachments.html

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

+ 1 - 0
modules/boonex/tasks/template/author.html

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

+ 1 - 0
modules/boonex/tasks/template/author_link.html

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

+ 1 - 0
modules/boonex/tasks/template/badges.html

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

+ 37 - 0
modules/boonex/tasks/template/browse_tasks.html

@@ -0,0 +1,37 @@
+<a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onClick="__object__.processTaskList(__context_id__, 0)"><bx_text:_bx_tasks_txt_new_task_list /></a>
+<div class="bx-def-padding-top" style="clear: both">
+	<bx_repeat:task_lists>
+		<div class="bx-def-margin-top bx-tasks-tasklist-filter-__class__" id="bx-tasks-tasklist-__list_id__">
+		<div class="bx-def-padding bx-def-color-bg-hl">
+			<span class="bx-tasks-tasklist-title"><a href="javascript:void(0);" onClick="__object__.processTaskList(__context_id__, __list_id__)">__title__</a></span>
+			<div class="bx-tasks-tasklist-actions">
+				<select class="bx-btn bx-btn-small bx-def-margin-sec-right" onChange="__object__.setFilter(__list_id__, this)">
+					<option value=""><bx_text:_bx_tasks_txt_filter_all /></option>
+					<option __completed__ value="completed"><bx_text:_bx_tasks_txt_filter_completed /></option>
+					<option __uncompleted__ value="uncompleted"><bx_text:_bx_tasks_txt_filter_uncompleted /></option>
+				</select>
+				<a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onClick="__object__.processTask(__context_id__, __list_id__)"><bx_text:_bx_tasks_txt_new_task /></a> 
+			</div>
+			</div>
+		<bx_repeat:tasks>
+			<div class="bx-def-padding bx-def-border-bottom bx-tasks-task bx-tasks-task-__class__">
+				<div class="bx-tasks-task-checkbox bx-def-padding-sec-right">
+					<input id="checkbox__id__" type="checkbox" __checked__ class="promoted-input-checkbox" onClick="__object__.setCompleted(__id__, this)"/>
+					<label for="checkbox__id__"></label>
+				</div>
+
+				<a href="__url__" class="bx-def-padding-sec-right">__title__</a>
+				
+				<span class="bx-def-font-grayed bx-def-padding-sec-right">__created__</span>
+				<span class="bx-task-due-date bx-def-padding-sec-right">__due__</span> 
+				__badges__
+				<div class="bx-tasks-members bx-def-padding-sec-right">
+					<bx_repeat:members>
+						__info__
+					</bx_repeat:members>
+				</div>
+			</div>
+		</bx_repeat:tasks>
+		</div>
+	</bx_repeat:task_lists>
+</div>

+ 1 - 0
modules/boonex/tasks/template/category_list_inline.html

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

+ 1 - 0
modules/boonex/tasks/template/context.html

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

+ 1 - 0
modules/boonex/tasks/template/css/categories.css

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

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

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

+ 68 - 0
modules/boonex/tasks/template/css/main.css

@@ -0,0 +1,68 @@
+@import url(../../../../base/text/template/css/main.css);
+
+.bx-tasks-tasklist-title {
+    font-weight: bold;
+}
+.bx-task-due-date {
+    color: red;
+}
+.bx-tasks-members .bx-base-pofile-unit-wo-info {
+    width: 2rem;
+    height: 2rem;
+	display: inline-block;   
+}
+.bx-tasks-members .bx-def-thumb-size{
+	width: 2rem;
+    height: 2rem;
+	 font-size: 1rem;
+}
+.bx-tasks-members div.bx-base-pofile-unit-wo-info {
+    margin-left: -1rem;
+}
+.bx-tasks-tasklist-actions{
+	float:right;
+}
+.bx-tasks-task-checkbox{
+    display: inline-block;
+	height: 24px;
+}
+.bx-tasks-task-checkbox input[type=checkbox] {
+        display:none;
+}
+.bx-tasks-task-checkbox  input[type=checkbox] + label{
+	background:url("/modules/boonex/tasks/template/images/check-circle1.svg") #FFFFFF;
+	height: 24px;
+	width: 24px;
+	display:inline-block;
+	padding: 0;
+	cursor: pointer;
+}
+
+.bx-tasks-task-checkbox input[type=checkbox]:checked + label{
+	background:url("/modules/boonex/tasks/template/images/check-circle.svg") #FFFFFF;
+	height: 24px;
+	width: 24px;
+	display:inline-block;
+	padding: 0;
+}
+.bx-tasks-task{
+	display: flex;
+	flex-grow: 1;
+	align-items: center;
+}
+.bx-tasks-members{
+	flex-grow: 2;
+	text-align: right;
+}
+.bx-tasks-task .bx-badge, .bx-tasks-task .bx-badges-list{
+	display: inline-block;
+}
+.bx-tasks-tasklist-filter-completed .bx-tasks-task-uncompleted{
+	display: none;
+}
+.bx-tasks-tasklist-filter-uncompleted .bx-tasks-task-completed{
+	display: none;
+}
+.ui-autocomplete{
+	z-index: 10000 !important;
+}

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

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

+ 3 - 0
modules/boonex/tasks/template/entry-all-actions.html

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

+ 1 - 0
modules/boonex/tasks/template/entry-share.html

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

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

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

+ 1 - 0
modules/boonex/tasks/template/form_categories.html

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

+ 22 - 0
modules/boonex/tasks/template/form_ghost_template.html

@@ -0,0 +1,22 @@
+<div id="bx-uploader-file-{storage_object}-{file_id}" class="bx-uploader-ghost bx-def-margin-sec-top bx-clearfix">
+    <input type="hidden" name="__name__[]" value="{file_id}" />
+    <div class="bx-base-general-icon-wrapper bx-def-margin-sec-right">
+        <img src="{file_icon}" class="bx-def-round-corners bx-base-general-icon bx-base-general-icon-{file_id}" />
+    </div>
+    <span class="bx-base-general-uploader-ghost">
+        <b><bx_text:_sys_txt_form_entry_input_picture_pic_url /></b><br />
+        <input class="bx-def-font-inputs bx-form-input-text bx-def-margin-sec-bottom" type="text" value="{file_url}" readonly="1" /> <br />
+        <span id="bx-base-general-intert-to-post-link-{file_id}" style="display:none;">
+            <a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onclick="bx_base_general_insert_to_post('{file_id}', '{file_url}', '__editor_id__');"><bx_text:_sys_txt_form_entry_input_picture_insert /></a>
+        </span>
+        <a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onclick="bx_base_general_delete_ghost('{file_id}', '{file_url}', '{file_icon}', ['__editor_id__'], {js_instance_name});"><bx_text:_sys_txt_form_entry_input_picture_delete /></a>
+    </span>
+</div>
+<script>
+    $('#bx-base-general-intert-to-post-link-{file_id}').show();
+
+    // disable images drag&drop, because resized images address can be reset after some time
+    $(".bx-base-general-icon-{file_id}").bind('dragstart', function(){
+        return false; 
+    });
+</script>

+ 16 - 0
modules/boonex/tasks/template/form_ghost_template_cover.html

@@ -0,0 +1,16 @@
+<div id="bx-uploader-file-{storage_object}-{file_id}" class="bx-uploader-ghost bx-def-margin-sec-top bx-clearfix">
+    <input type="hidden" name="__name__[]" value="{file_id}" />
+    <input type="hidden" name="__name_thumb__[]" value="{file_id}" onclick="bx_base_general_select_thumb(this)" id="__name_thumb__-{file_id}" />
+    <div class="bx-base-general-icon-wrapper bx-def-margin-sec-right">
+        <img src="{file_icon}" class="bx-def-round-corners bx-base-general-icon bx-base-general-icon-{file_id}" />
+    </div>
+    <span class="bx-base-general-uploader-ghost">
+        <a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onclick="bx_base_general_delete_ghost('{file_id}', '{file_url}', '{file_icon}', ['__editor_id__'], {js_instance_name});"><bx_text:_sys_txt_form_entry_input_picture_delete /></a>
+    </span>
+</div>
+<script>
+    // disable images drag&drop, because resized images address can be reset after some time
+    $(".bx-base-general-icon-{file_id}").bind('dragstart', function(){
+        return false; 
+    });
+</script>

+ 19 - 0
modules/boonex/tasks/template/form_ghost_template_file.html

@@ -0,0 +1,19 @@
+<div id="bx-uploader-file-{storage_object}-{file_id}" class="bx-uploader-ghost bx-def-margin-sec-top bx-clearfix">
+    <input type="hidden" name="__name__[]" value="{file_id}" />
+    <div class="bx-base-general-icon-wrapper bx-def-margin-sec-right">
+        <img src="{file_icon}" class="bx-def-round-corners bx-base-general-icon bx-base-general-icon-{file_id}" />
+    </div>
+    <span class="bx-base-general-uploader-ghost">
+        <b><bx_text:_sys_txt_form_entry_input_picture_pic_url /></b><br />
+        <input class="bx-def-font-inputs bx-form-input-text bx-def-margin-sec-bottom" type="text" value="{file_url}" readonly="1" /> <br />
+        <a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onclick="bx_base_general_delete_ghost('{file_id}', '{file_url}', '{file_icon}', ['__editor_id__'], {js_instance_name});"><bx_text:_sys_txt_form_entry_input_picture_delete /></a>
+    </span>
+</div>
+<script>
+    $('#bx-base-general-intert-to-post-link-{file_id}').show();
+
+    // disable images drag&drop, because resized images address can be reset after some time
+    $(".bx-base-general-icon-{file_id}").bind('dragstart', function(){
+        return false; 
+    });
+</script>

+ 22 - 0
modules/boonex/tasks/template/form_ghost_template_video.html

@@ -0,0 +1,22 @@
+<div id="bx-uploader-file-{storage_object}-{file_id}" class="bx-uploader-ghost bx-def-margin-sec-top bx-clearfix">
+    <input type="hidden" name="__name__[]" value="{file_id}" />
+    <div class="bx-base-general-icon-wrapper bx-def-margin-sec-right">
+        <img src="{file_icon}" class="bx-def-round-corners bx-base-general-icon bx-base-general-icon-{file_id}" />
+    </div>
+    <span class="bx-base-general-uploader-ghost">
+        <b><bx_text:_sys_txt_form_entry_input_picture_pic_url /></b><br />
+        <input class="bx-def-font-inputs bx-form-input-text bx-def-margin-sec-bottom" type="text" value="{file_url}" readonly="1" /> <br />
+        <span id="bx-base-general-intert-to-post-link-{file_id}" style="display:none;">
+            <a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onclick="bx_base_general_insert_to_post('{file_id}', '{file_url}', '__editor_id__', '{file_type}', '__embed_url__');"><bx_text:_sys_txt_form_entry_input_picture_insert /></a>
+        </span>
+        <a class="bx-btn bx-btn-small bx-def-margin-sec-right" href="javascript:void(0);" onclick="bx_base_general_delete_ghost('{file_id}', '{file_url}', '{file_icon}', ['__editor_id__'], {js_instance_name});"><bx_text:_sys_txt_form_entry_input_picture_delete /></a>
+    </span>
+</div>
+<script>
+    $('#bx-base-general-intert-to-post-link-{file_id}').show();
+
+    // disable images drag&drop, because resized images address can be reset after some time
+    $(".bx-base-general-icon-{file_id}").bind('dragstart', function(){
+        return false; 
+    });
+</script>

+ 1 - 0
modules/boonex/tasks/template/images/check-circle.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check-circle"><path d="M22 11.07V12a10 10 0 1 1-5.93-9.14"></path><polyline points="23 3 12 14 9 11"></polyline></svg>

+ 1 - 0
modules/boonex/tasks/template/images/check-circle1.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-pause-circle"><circle cx="12" cy="12" r="10"></circle></svg>

+ 43 - 0
modules/boonex/tasks/template/images/icons/std-icon.svg

@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
+ <title>posts</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+  <path id="path-1" d="m32,64c14.02222,0 21.81737,0 26.90869,-5.09131c5.09131,-5.09132 5.09131,-12.88647 5.09131,-26.90869c0,-14.02222 0,-21.81737 -5.09131,-26.90869c-5.09132,-5.09131 -12.88647,-5.09131 -26.90869,-5.09131c-14.02222,0 -21.81737,0 -26.90869,5.09131c-5.09131,5.09132 -5.09131,12.88647 -5.09131,26.90869c0,14.02222 0,21.81737 5.09131,26.90869c5.09132,5.09131 12.88647,5.09131 26.90869,5.09131z"/>
+  <linearGradient id="linearGradient-3" y2="100%" x2="50%" y1="0%" x1="50%">
+   <stop offset="0%" stop-color="#FDFEFF"/>
+   <stop offset="100%" stop-opacity="0.9" stop-color="#FBFCFD"/>
+  </linearGradient>
+  <path id="path-4" d="m17.77778,10.625l0,-10.625l-15.87302,0c-1.05555,0 -1.90476,0.83594 -1.90476,1.875l0,36.25c0,1.03906 0.84921,1.875 1.90476,1.875l26.66667,0c1.05555,0 1.90476,-0.83594 1.90476,-1.875l0,-25.625l-10.79365,0c-1.04762,0 -1.90476,-0.84375 -1.90476,-1.875zm5.07936,18.4375c0,0.51563 -0.42857,0.9375 -0.95238,0.9375l-13.33333,0c-0.52381,0 -0.95238,-0.42187 -0.95238,-0.9375l0,-0.625c0,-0.51562 0.42857,-0.9375 0.95238,-0.9375l13.33333,0c0.52381,0 0.95238,0.42188 0.95238,0.9375l0,0.625zm0,-5c0,0.51563 -0.42857,0.9375 -0.95238,0.9375l-13.33333,0c-0.52381,0 -0.95238,-0.42187 -0.95238,-0.9375l0,-0.625c0,-0.51562 0.42857,-0.9375 0.95238,-0.9375l13.33333,0c0.52381,0 0.95238,0.42188 0.95238,0.9375l0,0.625zm0,-5.625l0,0.625c0,0.51563 -0.42857,0.9375 -0.95238,0.9375l-13.33333,0c-0.52381,0 -0.95238,-0.42187 -0.95238,-0.9375l0,-0.625c0,-0.51562 0.42857,-0.9375 0.95238,-0.9375l13.33333,0c0.52381,0 0.95238,0.42188 0.95238,0.9375zm7.61905,-8.91406l0,0.47656l-10.15873,0l0,-10l0.48413,0c0.50793,0 0.99206,0.19531 1.3492,0.54688l7.76984,7.65625c0.35715,0.35156 0.55556,0.82812 0.55556,1.32031z"/>
+  <filter id="filter-5" filterUnits="objectBoundingBox" height="110.0%" width="113.1%" y="-2.5%" x="-6.6%">
+   <feGaussianBlur stdDeviation="0.5"/>
+  </filter>
+  <symbol id="svg_5" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
+   <path d="m139.61,35.5a12,12 0 0 0 -17,0l-63.68,63.31l-22.7,-22.12a12,12 0 0 0 -17,0l-15.7,15.72a12,12 0 0 0 0,17l47.59,47.4a12.78,12.78 0 0 0 17.61,0l15.59,-15.62l72.2,-72.19a12.09,12.09 0 0 0 0.09,-17l-17,-16.5zm17,175.69a12,12 0 0 0 -17,0l-63.68,63.72l-22.7,-22.1a12,12 0 0 0 -17,0l-32.7,-0.81a12,12 0 0 0 0,17l47.47,47.5a12.77,12.77 0 0 0 17.6,0l15.7,-15.69l72.2,-72.22a12,12 0 0 0 0.09,-16.9l0.02,-0.5zm-92.59,156.31c-26.49,0 -48.59,21.5 -48.59,48s22.1,48.5 48.57,48.5a48,48 0 0 0 0,-96l0.02,-0.5zm524.59,-140.31l-380.61,0a16,16 0 0 0 -16,16l0,32a16,16 0 0 0 16,16l288,0a16,16 0 0 0 16,-16l0,-32a16,16 0 0 0 -16,-16l92.61,0zm0,-320l-380.61,0a16,16 0 0 0 -16,16l0,32a16,16 0 0 0 16,16l288,0a16,16 0 0 0 16,-16l0,124.81a16,16 0 0 0 -16,-16l92.61,-156.81zm0,160l-380.61,0a16,16 0 0 0 -16,16l0,32a16,16 0 0 0 16,16l288,0a16,16 0 0 0 16,-16l0,-32a16,16 0 0 0 -16,-16l92.61,0z"/>
+  </symbol>
+ </defs>
+ <g class="layer">
+  <title>Layer 1</title>
+  <g fill-rule="evenodd" fill="none" id="Page-1">
+   <g id="Artboard">
+    <g id="posts">
+     <mask transform="translate(340,430) translate(-340,-430) " id="mask-2">
+      <use id="svg_1" xlink:href="#path-1"/>
+     </mask>
+     <use x="0" y="0" xlink:href="#path-1" fill="#00B356" id="Path"/>
+     <g fill-rule="nonzero" mask="url(#mask-2)" id="file-alt">
+      <g id="Shape">
+       <g id="svg_2">
+        <use id="svg_3" x="17" y="12" xlink:href="#path-4" filter="url(#filter-5)" fill="black"/>
+        <use id="svg_4" x="17" y="12" xlink:href="#path-4" fill="url(#linearGradient-3)"/>
+       </g>
+      </g>
+     </g>
+    </g>
+   </g>
+  </g>
+  <use fill="#ffffff" x="-3.374039" y="0" transform="matrix(0.5927614547638527,0,0,0.5688719521623433,13.226237438028988,18.769165400225347) " xlink:href="#svg_5" id="svg_6"/>
+  <g id="svg_7"/>
+ </g>
+</svg>

+ 18 - 0
modules/boonex/tasks/template/popup_form.html

@@ -0,0 +1,18 @@
+<div class="bx-tasks-form bx-def-color-bg-block">
+    <div class="bx-tasks-form-cnt">
+        __form__
+        <script type="text/javascript">
+            $(document).ready(function () {
+                $("#__form_id__").ajaxForm({ 
+                    dataType: "json",
+                    beforeSubmit: function (formData, jqForm, options) {
+                        bx_loading($("#__form_id__"), true);
+                    },
+                    success: function (data) {
+                        processJsonData(data);
+                    }
+                });
+            });
+        </script>
+    </div>
+</div>

+ 1 - 0
modules/boonex/tasks/template/title_link.html

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

+ 1 - 0
modules/boonex/tasks/template/uploader_button_html5_attach.html

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

+ 1 - 0
modules/boonex/tasks/template/uploader_button_simple_attach.html

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