Prechádzať zdrojové kódy

Ticket #637 - the module itself.

AntonLV 9 rokov pred
rodič
commit
fdaae415e4
50 zmenil súbory, kde vykonal 2386 pridanie a 0 odobranie
  1. 219 0
      modules/boonex/russian/data/langs/bx_snipcart/ru.xml
  2. 21 0
      modules/boonex/snipcart/classes/BxSnipcartAlertsResponse.php
  3. 24 0
      modules/boonex/snipcart/classes/BxSnipcartCmtsSearchResult.php
  4. 153 0
      modules/boonex/snipcart/classes/BxSnipcartConfig.php
  5. 59 0
      modules/boonex/snipcart/classes/BxSnipcartDb.php
  6. 24 0
      modules/boonex/snipcart/classes/BxSnipcartFormEntry.php
  7. 30 0
      modules/boonex/snipcart/classes/BxSnipcartFormSettings.php
  8. 23 0
      modules/boonex/snipcart/classes/BxSnipcartFormsEntryHelper.php
  9. 21 0
      modules/boonex/snipcart/classes/BxSnipcartGridAdministration.php
  10. 21 0
      modules/boonex/snipcart/classes/BxSnipcartGridCommon.php
  11. 24 0
      modules/boonex/snipcart/classes/BxSnipcartMenu.php
  12. 25 0
      modules/boonex/snipcart/classes/BxSnipcartMenuManageTools.php
  13. 37 0
      modules/boonex/snipcart/classes/BxSnipcartMenuView.php
  14. 93 0
      modules/boonex/snipcart/classes/BxSnipcartModule.php
  15. 24 0
      modules/boonex/snipcart/classes/BxSnipcartPageAuthor.php
  16. 24 0
      modules/boonex/snipcart/classes/BxSnipcartPageBrowse.php
  17. 46 0
      modules/boonex/snipcart/classes/BxSnipcartPageEntry.php
  18. 138 0
      modules/boonex/snipcart/classes/BxSnipcartSearchResult.php
  19. 56 0
      modules/boonex/snipcart/classes/BxSnipcartTemplate.php
  20. 124 0
      modules/boonex/snipcart/install/config.php
  21. 20 0
      modules/boonex/snipcart/install/installer.php
  22. 219 0
      modules/boonex/snipcart/install/langs/en.xml
  23. 51 0
      modules/boonex/snipcart/install/sql/disable.sql
  24. 350 0
      modules/boonex/snipcart/install/sql/enable.sql
  25. 324 0
      modules/boonex/snipcart/install/sql/install.sql
  26. 54 0
      modules/boonex/snipcart/install/sql/uninstall.sql
  27. 51 0
      modules/boonex/snipcart/js/manage_tools.js
  28. 18 0
      modules/boonex/snipcart/request.php
  29. 3 0
      modules/boonex/snipcart/template/attachments.html
  30. 3 0
      modules/boonex/snipcart/template/author.html
  31. 1 0
      modules/boonex/snipcart/template/author_link.html
  32. 3 0
      modules/boonex/snipcart/template/css/forms.css
  33. 9 0
      modules/boonex/snipcart/template/css/main.css
  34. 1 0
      modules/boonex/snipcart/template/css/manage_tools.css
  35. 3 0
      modules/boonex/snipcart/template/entry-all-actions.html
  36. 3 0
      modules/boonex/snipcart/template/entry-location.html
  37. 1 0
      modules/boonex/snipcart/template/entry-share.html
  38. 3 0
      modules/boonex/snipcart/template/entry-text.html
  39. 3 0
      modules/boonex/snipcart/template/form_ghost_template.html
  40. 57 0
      modules/boonex/snipcart/template/images/icons/std-icon.svg
  41. 3 0
      modules/boonex/snipcart/template/sct_button.html
  42. 2 0
      modules/boonex/snipcart/template/sct_include.html
  43. 1 0
      modules/boonex/snipcart/template/title_link.html
  44. 3 0
      modules/boonex/snipcart/template/unit.html
  45. 1 0
      modules/boonex/snipcart/template/unit_full.html
  46. 3 0
      modules/boonex/snipcart/template/unit_full_private.html
  47. 1 0
      modules/boonex/snipcart/template/unit_gallery.html
  48. 3 0
      modules/boonex/snipcart/template/unit_gallery_private.html
  49. 3 0
      modules/boonex/snipcart/template/unit_live_search.html
  50. 3 0
      modules/boonex/snipcart/template/unit_private.html

+ 219 - 0
modules/boonex/russian/data/langs/bx_snipcart/ru.xml

@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+
+	<string name="_bx_snipcart"><![CDATA[Snipcart]]></string>
+	<string name="_bx_snipcart_cmts"><![CDATA[Snipcart - Обзоры]]></string>
+
+	<string name="_bx_snipcart_option_summary_chars"><![CDATA[Количество символов в автогенерируемой сводке к товарам]]></string>
+	<string name="_bx_snipcart_option_plain_summary_chars"><![CDATA[Количество символов в описании товара при отсутствующей картинке товара]]></string>
+    <string name="_bx_snipcart_option_per_page_browse"><![CDATA[Количество элементов на странице]]></string>
+    <string name="_bx_snipcart_option_per_page_profile"><![CDATA[Количество элементов на странице профайла]]></string>
+	<string name="_bx_snipcart_option_rss_num"><![CDATA[Количество элементов в ленте RSS]]></string>
+	<string name="_bx_snipcart_option_searchable_fields"><![CDATA[Поля для поиска]]></string>
+
+	<string name="_bx_snipcart_form_entry"><![CDATA[Товары]]></string>
+	<string name="_bx_snipcart_form_entry_display_add"><![CDATA[Добавить товар]]></string>
+	<string name="_bx_snipcart_form_entry_display_edit"><![CDATA[Редактировать товар]]></string>
+	<string name="_bx_snipcart_form_entry_display_delete"><![CDATA[Удалить товар]]></string>
+	<string name="_bx_snipcart_form_entry_display_view"><![CDATA[Просмотреть товар]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_do_submit"><![CDATA[Выполнить]]></string>
+	<string name="_bx_snipcart_form_entry_input_do_submit"><![CDATA[Выполнить]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_do_publish"><![CDATA[Опубликовать]]></string>
+	<string name="_bx_snipcart_form_entry_input_do_publish"><![CDATA[Опубликовать]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_title"><![CDATA[Заголовок]]></string>
+	<string name="_bx_snipcart_form_entry_input_title"><![CDATA[Заголовок]]></string>
+	<string name="_bx_snipcart_form_entry_input_title_err"><![CDATA[Заголовок обязателен. Пожалуйста, заполните это поле]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_cat"><![CDATA[Категория]]></string>
+	<string name="_bx_snipcart_form_entry_input_cat"><![CDATA[Категория]]></string>
+	<string name="_bx_snipcart_form_entry_input_cat_err"><![CDATA[Нужно обязательно выбрать категорию]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_text"><![CDATA[Текст]]></string>
+	<string name="_bx_snipcart_form_entry_input_text"><![CDATA[Текст]]></string>
+	<string name="_bx_snipcart_form_entry_input_text_err"><![CDATA[Поле для Текста не может быть пустым]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_price"><![CDATA[Цена]]></string>
+    <string name="_bx_snipcart_form_entry_input_price"><![CDATA[Цена]]></string>
+    <string name="_bx_snipcart_form_entry_input_price_err"><![CDATA[Поле Цена не может быть пустым]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_weight"><![CDATA[Вес]]></string>
+    <string name="_bx_snipcart_form_entry_input_weight"><![CDATA[Вес]]></string>
+    <string name="_bx_snipcart_form_entry_input_weight_err"><![CDATA[Поле Вес не может быть пустым]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_delete_confirm"><![CDATA[Удалить подтверждение]]></string>
+	<string name="_bx_snipcart_form_entry_input_delete_confirm"><![CDATA[Я уверен(а), что хочу удалить этот товар]]></string>
+	<string name="_bx_snipcart_form_entry_input_delete_confirm_info"><![CDATA[Это действие не может быть отменено]]></string>
+	<string name="_bx_snipcart_form_entry_input_delete_confirm_error"><![CDATA[Пожалуйста, отметьте этот флажок, если действительно хотите удалить товар]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_pictures"><![CDATA[Картинки]]></string>
+	<string name="_bx_snipcart_form_entry_input_pictures"><![CDATA[Картинки]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_allow_view_to"><![CDATA[Видимость]]></string>
+    <string name="_bx_snipcart_form_entry_input_allow_view_to"><![CDATA[Видимость]]></string>
+    <string name="_bx_snipcart_form_entry_input_picture_use_as_thumb"><![CDATA[Изображение обложки]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_date_added"><![CDATA[Создано]]></string>
+    <string name="_bx_snipcart_form_entry_input_date_added"><![CDATA[Создано]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_date_changed"><![CDATA[Обновлено]]></string>
+    <string name="_bx_snipcart_form_entry_input_date_changed"><![CDATA[Обновлено]]></string>
+
+    <string name="_bx_snipcart_form_settings"><![CDATA[Настройки]]></string>
+    <string name="_bx_snipcart_form_settings_display_edit"><![CDATA[Редактировать настройки]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_mode"><![CDATA[Режим]]></string>
+    <string name="_bx_snipcart_form_settings_input_mode"><![CDATA[Режим]]></string>
+    <string name="_bx_snipcart_form_settings_input_mode_err"><![CDATA[Режим обязателен. Пожалуйста, заполните это поле]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_api_key_test"><![CDATA[API Ключ (тестовый)]]></string>
+    <string name="_bx_snipcart_form_settings_input_api_key_test"><![CDATA[API Ключ (тестовый)]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_api_key_live"><![CDATA[API Ключ (рабочий)]]></string>
+    <string name="_bx_snipcart_form_settings_input_api_key_live"><![CDATA[API Ключ (рабочий)]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_do_submit"><![CDATA[Выполнить]]></string>
+    <string name="_bx_snipcart_form_settings_input_do_submit"><![CDATA[Выполнить]]></string>
+
+	<string name="_bx_snipcart_acl_action_create_entry"><![CDATA[Создать товар]]></string>
+	<string name="_bx_snipcart_acl_action_delete_entry"><![CDATA[Удалить товар]]></string>
+	<string name="_bx_snipcart_acl_action_view_entry"><![CDATA[Просмотреть товар]]></string>
+	<string name="_bx_snipcart_acl_action_set_thumb"><![CDATA[Назначить значок товара]]></string>
+	<string name="_bx_snipcart_acl_action_edit_any_entry"><![CDATA[Редактировать любой товар]]></string>
+
+	<string name="_bx_snipcart_page_title_sys_create_entry"><![CDATA[Новый товар]]></string>
+	<string name="_bx_snipcart_page_title_create_entry"><![CDATA[Новый товар]]></string>
+	<string name="_bx_snipcart_page_block_title_create_entry"><![CDATA[Новый товар]]></string>
+	<string name="_bx_snipcart_page_title_sys_edit_entry"><![CDATA[Редактировать товар]]></string>
+	<string name="_bx_snipcart_page_title_edit_entry"><![CDATA[Редактировать товар]]></string>
+	<string name="_bx_snipcart_page_block_title_edit_entry"><![CDATA[Редактировать товар]]></string>
+    <string name="_bx_snipcart_page_title_sys_delete_entry"><![CDATA[Удалить товар]]></string>
+    <string name="_bx_snipcart_page_title_delete_entry"><![CDATA[Удалить товар]]></string>
+    <string name="_bx_snipcart_page_block_title_delete_entry"><![CDATA[Удалить товар]]></string>
+	<string name="_bx_snipcart_page_title_sys_view_entry"><![CDATA[Просмотреть товар]]></string>
+	<string name="_bx_snipcart_page_title_view_entry"><![CDATA[{title}]]></string>
+	<string name="_bx_snipcart_page_block_title_entry_text"><![CDATA[Текст товара]]></string>
+	<string name="_bx_snipcart_page_title_browse"><![CDATA[Товары]]></string>
+	<string name="_bx_snipcart_page_title_search_results"><![CDATA[Товары, соответствующие "{0}"]]></string>
+	<string name="_bx_snipcart_page_title_browse_by_author"><![CDATA[Товары {display_name}]]></string>
+	<string name="_bx_snipcart_page_title_browse_featured"><![CDATA[Продвинутые Товары]]></string>
+    <string name="_bx_snipcart_page_title_browse_recent"><![CDATA[Недавние Товары]]></string>
+    <string name="_bx_snipcart_page_title_browse_popular"><![CDATA[Популярные Товары]]></string>
+    <string name="_bx_snipcart_page_title_browse_updated"><![CDATA[Обновлённые Товары]]></string>
+    <string name="_bx_snipcart_page_title_sys_home"><![CDATA[Snipcart - Домой]]></string>
+    <string name="_bx_snipcart_page_title_home"><![CDATA[Товары]]></string>
+    <string name="_bx_snipcart_page_block_title_featured_entries_view_extended"><![CDATA[Продвинутые]]></string>
+    <string name="_bx_snipcart_page_block_title_recent_entries"><![CDATA[Новые Товары (Галерея)]]></string>
+    <string name="_bx_snipcart_page_block_title_recent_entries_view_extended"><![CDATA[Новые Товары]]></string>
+    <string name="_bx_snipcart_page_block_title_recent_entries_view_full"><![CDATA[Недавние Товары (Полный просмотр)]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_social_sharing"><![CDATA[Поделиться]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_author"><![CDATA[Автор]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_actions"><![CDATA[Действия]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_comments"><![CDATA[Комментарии]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_comments_link"><![CDATA[Комментарии к <a href="{entry_link}">{title}</a>]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_location"><![CDATA[Расположение]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_attachments"><![CDATA[Прикрепления]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_all_actions"><![CDATA[Все Действия]]></string>
+    <string name="_bx_snipcart_page_title_sys_entries_popular"><![CDATA[Популярные Товары]]></string>
+    <string name="_bx_snipcart_page_title_entries_popular"><![CDATA[Популярные Товары]]></string>
+    <string name="_bx_snipcart_page_title_sys_entries_updated"><![CDATA[Обновленные Товары]]></string>
+    <string name="_bx_snipcart_page_title_entries_updated"><![CDATA[Обновленные Товары]]></string>
+    <string name="_bx_snipcart_page_block_title_popular_entries"><![CDATA[Популярные Товары]]></string>
+    <string name="_bx_snipcart_page_block_title_popular_entries_view_extended"><![CDATA[Популярные Товары (Дополнительный просмотр)]]></string>
+    <string name="_bx_snipcart_page_block_title_popular_entries_view_full"><![CDATA[Популярные Товары (Полный просмотр)]]></string>
+    <string name="_bx_snipcart_page_block_title_updated_entries"><![CDATA[Обновленные Товары]]></string>
+    <string name="_bx_snipcart_page_title_sys_view_entry_comments"><![CDATA[Комментарии товаркту]]></string>
+    <string name="_bx_snipcart_page_title_view_entry_comments"><![CDATA[Комментарии к {title}]]></string>
+    <string name="_bx_snipcart_page_title_sys_entries_of_author"><![CDATA[Товары автора]]></string>
+    <string name="_bx_snipcart_page_title_entries_of_author"><![CDATA[{display_name} - Товары]]></string>
+    <string name="_bx_snipcart_page_block_title_favorites_of_author"><![CDATA[<a href="{profile_link}">{display_name}</a> - Избранное]]></string>   
+    <string name="_bx_snipcart_page_block_title_sys_favorites_of_author"><![CDATA[Избранное автора]]></string>
+    <string name="_bx_snipcart_page_block_title_entries_of_author"><![CDATA[<a href="{profile_link}">{display_name}</a> - Товары]]></string>   
+    <string name="_bx_snipcart_page_block_title_sys_entries_of_author"><![CDATA[Товары автора]]></string>   
+    <string name="_bx_snipcart_page_block_title_entries_actions"><![CDATA[Товары - Действия]]></string>
+    <string name="_bx_snipcart_page_block_title_browse_cmts"><![CDATA[Товары - Комментарии]]></string>
+	<string name="_bx_snipcart_page_title_sys_manage"><![CDATA[Управление собственными товарами]]></string>
+	<string name="_bx_snipcart_page_title_sys_manage_administration"><![CDATA[Управление всеми товарами]]></string>
+	<string name="_bx_snipcart_page_title_manage"><![CDATA[Управление товарами]]></string>
+	<string name="_bx_snipcart_page_block_title_system_manage"><![CDATA[Управление собственными товарами]]></string>
+	<string name="_bx_snipcart_page_block_title_system_manage_administration"><![CDATA[Управление всеми товарами]]></string>
+	<string name="_bx_snipcart_page_block_title_manage"><![CDATA[Управление товарами]]></string>    
+	<string name="_bx_snipcart_page_block_title_popular_keywords"><![CDATA[Популярные Хэштеги]]></string>
+    <string name="_bx_snipcart_page_block_title_cats"><![CDATA[Категории]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_info"><![CDATA[Инфо]]></string>
+    <string name="_bx_snipcart_page_block_title_my_entries"><![CDATA[Мои товары]]></string>
+    <string name="_bx_snipcart_page_title_sys_settings"><![CDATA[Настройки]]></string>
+    <string name="_bx_snipcart_page_title_settings"><![CDATA[Настройки]]></string>
+    <string name="_bx_snipcart_page_block_title_system_settings"><![CDATA[Настройки]]></string>
+    <string name="_bx_snipcart_page_block_title_settings"><![CDATA[Настройки]]></string>
+
+    <string name="_bx_snipcart_menu_set_title_view_entry"><![CDATA[Действия с товаром]]></string>
+    <string name="_bx_snipcart_menu_title_view_entry"><![CDATA[Действия с товаром]]></string>
+    <string name="_bx_snipcart_menu_title_submenu"><![CDATA[Товары - Подменю]]></string>
+    <string name="_bx_snipcart_menu_set_title_submenu"><![CDATA[Товары - Подменю]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_create_entry"><![CDATA[Новый товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_create_entry"><![CDATA[Новый товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_edit_entry"><![CDATA[Редактировать товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_edit_entry"><![CDATA[Редактировать товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_delete_entry"><![CDATA[Удалить товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_delete_entry"><![CDATA[Удалить товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_view_entry"><![CDATA[Просмотреть товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_home"><![CDATA[Магазин]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_home"><![CDATA[Магазин]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_public"><![CDATA[Новые товары]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_public"><![CDATA[Новые товары]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_manage"><![CDATA[Управление товарами]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_manage"><![CDATA[Управление товарами]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_settings"><![CDATA[Настройки]]></string>
+    <string name="_bx_snipcart_menu_item_title_settings"><![CDATA[Настройки]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_dashboard"><![CDATA[Панель]]></string>
+    <string name="_bx_snipcart_menu_item_title_dashboard"><![CDATA[Панель]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_popular"><![CDATA[Популярные товары]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_popular"><![CDATA[Популярные товары]]></string>
+    <string name="_bx_snipcart_menu_title_view_entry_submenu"><![CDATA[Просмотреть товар - Подменю]]></string>
+    <string name="_bx_snipcart_menu_set_title_view_entry_submenu"><![CDATA[Просмотреть товар - Подменю]]></string>
+    <string name="_bx_snipcart_menu_item_title_view_entry_submenu_entry"><![CDATA[Товар]]></string>
+    <string name="_bx_snipcart_menu_item_title_view_entry_submenu_comments"><![CDATA[Комментарии]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_view_entry_comments"><![CDATA[Комментарии к товару]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_view_entries_author"><![CDATA[Товары]]></string>
+    <string name="_bx_snipcart_menu_item_title_view_entries_author"><![CDATA[Товары]]></string>
+    <string name="_bx_snipcart_menu_title_entries_my"><![CDATA[Мои Товары - Меню действий]]></string>
+    <string name="_bx_snipcart_menu_set_title_entries_my"><![CDATA[Мои Товары - Меню]]></string>
+	<string name="_bx_snipcart_menu_item_title_system_manage_my_entries"><![CDATA[Мои товары]]></string>
+    <string name="_bx_snipcart_menu_item_title_manage_my_entries"><![CDATA[{addon} товаров]]></string>
+    <string name="_bx_snipcart_menu_set_title_manage_tools"><![CDATA[Управление Подменю инструментов]]></string>
+    <string name="_bx_snipcart_menu_title_manage_tools"><![CDATA[Управление Подменю инструментов]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_manage_account"><![CDATA[Управление аккаунтом]]></string>
+    <string name="_bx_snipcart_menu_item_title_manage_account"><![CDATA[Управление аккаунтом]]></string>
+	<string name="_bx_snipcart_menu_item_title_system_admt_entries"><![CDATA[Товары]]></string>
+	<string name="_bx_snipcart_menu_item_title_admt_entries"><![CDATA[Товары - {addon} спрятано]]></string>
+	<string name="_bx_snipcart_menu_item_title_manage_my"><![CDATA[Мои Товары]]></string>
+	<string name="_bx_snipcart_menu_item_title_manage_all"><![CDATA[Все Товары]]></string>
+	<string name="_bx_snipcart_menu_item_title_buy"><![CDATA[Купить]]></string>
+
+	<string name="_bx_snipcart_grid_filter_item_title_adm_select_one_filter1"><![CDATA[Все статусы]]></string>
+	<string name="_bx_snipcart_grid_filter_item_title_adm_active"><![CDATA[Активные]]></string>
+	<string name="_bx_snipcart_grid_filter_item_title_adm_hidden"><![CDATA[Спрятанные]]></string>
+	<string name="_bx_snipcart_grid_column_title_adm_active"><![CDATA[Активные]]></string>
+    <string name="_bx_snipcart_grid_column_title_adm_title"><![CDATA[Заголовок]]></string>
+    <string name="_bx_snipcart_grid_column_title_adm_added"><![CDATA[Добавленные]]></string>
+    <string name="_bx_snipcart_grid_column_title_adm_author"><![CDATA[Автор]]></string>
+    <string name="_bx_snipcart_grid_action_title_adm_edit"><![CDATA[Редактировать]]></string>
+    <string name="_bx_snipcart_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_snipcart_grid_action_title_adm_more_actions"><![CDATA[Дополнительные действия]]></string>
+    <string name="_bx_snipcart_grid_action_err_delete"><![CDATA[Невозможно удалить выбранный(ные) товар(ы).]]></string>
+    <string name="_bx_snipcart_grid_txt_account_manager"><![CDATA[Перенаправить в Управление аккаунтом.]]></string>
+
+    <string name="_bx_snipcart_pre_lists_cats"><![CDATA[Категории товаров]]></string>
+    <string name="_bx_snipcart_cat_adult"><![CDATA[Для взрослых]]></string>
+    <string name="_bx_snipcart_cat_communication"><![CDATA[Коммуникация]]></string>
+    <string name="_bx_snipcart_cat_conversion"><![CDATA[Преобразование]]></string>
+    <string name="_bx_snipcart_cat_documentation"><![CDATA[Документация]]></string>
+    <string name="_bx_snipcart_cat_games"><![CDATA[Игры]]></string>
+    <string name="_bx_snipcart_cat_mobile"><![CDATA[Мобильные устройства]]></string>
+    <string name="_bx_snipcart_cat_multimedia"><![CDATA[Мультимедиа]]></string>
+    <string name="_bx_snipcart_cat_music"><![CDATA[Музыка]]></string>
+    <string name="_bx_snipcart_cat_navigation"><![CDATA[Навигация]]></string>
+    <string name="_bx_snipcart_cat_other"><![CDATA[Другое]]></string>
+    <string name="_bx_snipcart_cat_photography"><![CDATA[Фотография]]></string>
+    <string name="_bx_snipcart_cat_security"><![CDATA[Безопасность]]></string>
+    <string name="_bx_snipcart_cat_tools"><![CDATA[Инструменты]]></string>
+
+    <string name="_bx_snipcart_pre_lists_modes"><![CDATA[Режимы]]></string>
+    <string name="_bx_snipcart_mode_test"><![CDATA[тестовый]]></string>
+    <string name="_bx_snipcart_mode_live"><![CDATA[рабочий]]></string>
+
+    <string name="_bx_snipcart_err_not_configured"><![CDATA[Сначала вам необходимо настроить магазин. <a href="{0}">Нажмите здесь</a>.]]></string>
+
+    <string name="_bx_snipcart_txt_all_entries_by"><![CDATA[<a href="{0}">Все товары от {1} ({2})</a>]]></string>
+    <string name="_bx_snipcart_txt_sample_single"><![CDATA[товар]]></string>
+    <string name="_bx_snipcart_txt_sample_single_with_article"><![CDATA[товар]]></string>
+    <string name="_bx_snipcart_txt_sample_comment_single"><![CDATA[комментарии к товару]]></string>
+    <string name="_bx_snipcart_txt_sample_vote_single"><![CDATA[голос за товар]]></string>
+</resources>

+ 21 - 0
modules/boonex/snipcart/classes/BxSnipcartAlertsResponse.php

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

+ 24 - 0
modules/boonex/snipcart/classes/BxSnipcartCmtsSearchResult.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxSnipcartCmtsSearchResult extends BxBaseModGeneralCmtsSearchResult
+{
+    function __construct($sMode = '', $aParams = array())
+    {
+    	$this->sModule = 'bx_snipcart';
+
+        parent::__construct($sMode, $aParams);
+
+        $this->aCurrent['title'] = _t('_bx_snipcart_page_block_title_browse_cmts');
+    }
+}
+
+/** @} */

+ 153 - 0
modules/boonex/snipcart/classes/BxSnipcartConfig.php

@@ -0,0 +1,153 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxSnipcartConfig extends BxBaseModTextConfig
+{
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $aMenuItems2Methods = array (
+            'edit-snipcart-entry' => 'checkAllowedEdit',
+            'delete-snipcart-entry' => 'checkAllowedDelete',
+        );
+
+        $this->CNF = array (
+
+            // module icon
+            'ICON' => 'shopping-cart col-green1',
+
+            // database tables
+            'TABLE_ENTRIES' => $aModule['db_prefix'] . 'entries',
+        	'TABLE_SETTINGS' => $aModule['db_prefix'] . 'settings',
+        	'TABLE_ENTRIES_FULLTEXT' => 'title_text',
+
+            // database fields
+            'FIELD_ID' => 'id',
+            'FIELD_AUTHOR' => 'author',
+            'FIELD_ADDED' => 'added',
+            'FIELD_CHANGED' => 'changed',
+            'FIELD_TITLE' => 'title',
+            'FIELD_TEXT' => 'text',
+            'FIELD_TEXT_ID' => 'snipcart-entry-text',
+            'FIELD_PRICE' => 'price',
+            'FIELD_WEIGHT' => 'weight',
+            'FIELD_ALLOW_VIEW_TO' => 'allow_view_to',
+            'FIELD_PHOTO' => 'pictures',
+            'FIELD_THUMB' => 'thumb',
+            'FIELD_COMMENTS' => 'comments',
+	        'FIELD_STATUS' => 'status',
+        	'FIELD_STATUS_ADMIN' => 'status_admin',
+            'FIELD_LOCATION_PREFIX' => 'location',
+            'FIELDS_WITH_KEYWORDS' => 'auto', // can be 'auto', array of fields or comma separated string of field names, works only when OBJECT_METATAGS is specified
+
+            // page URIs
+            'URI_VIEW_ENTRY' => 'view-snipcart-entry',
+            'URI_AUTHOR_ENTRIES' => 'snipcart-author',
+            'URI_ADD_ENTRY' => 'create-snipcart-entry',
+        	'URI_EDIT_ENTRY' => 'edit-snipcart-entry',
+        	'URI_MANAGE_COMMON' => 'snipcart-manage',
+
+            'URL_HOME' => 'page.php?i=snipcart-home',
+            'URL_POPULAR' => 'page.php?i=snipcart-popular',
+            'URL_UPDATED' => 'page.php?i=snipcart-updated',
+        	'URL_MANAGE_COMMON' => 'page.php?i=snipcart-manage',
+        	'URL_MANAGE_ADMINISTRATION' => 'page.php?i=snipcart-administration',
+        	'URL_SETTINGS' => 'page.php?i=snipcart-settings',
+
+            // some params
+            'PARAM_CHARS_SUMMARY' => 'bx_snipcart_summary_chars',
+            'PARAM_CHARS_SUMMARY_PLAIN' => 'bx_snipcart_plain_summary_chars',
+            'PARAM_NUM_RSS' => 'bx_snipcart_rss_num',
+        	'PARAM_SEARCHABLE_FIELDS' => 'bx_snipcart_searchable_fields',
+
+            // objects
+            'OBJECT_STORAGE' => 'bx_snipcart_files',
+            'OBJECT_IMAGES_TRANSCODER_PREVIEW' => 'bx_snipcart_preview',
+            'OBJECT_IMAGES_TRANSCODER_GALLERY' => 'bx_snipcart_gallery',
+            'OBJECT_VIDEOS_TRANSCODERS' => array(),
+        	'OBJECT_REPORTS' => 'bx_snipcart',
+            'OBJECT_VIEWS' => 'bx_snipcart',
+            'OBJECT_VOTES' => 'bx_snipcart',
+        	'OBJECT_FAVORITES' => 'bx_snipcart',
+            'OBJECT_FEATURED' => 'bx_snipcart',
+            'OBJECT_METATAGS' => 'bx_snipcart',
+            'OBJECT_COMMENTS' => 'bx_snipcart',
+            'OBJECT_PRIVACY_VIEW' => 'bx_snipcart_allow_view_to',
+            'OBJECT_FORM_ENTRY' => 'bx_snipcart',
+            'OBJECT_FORM_ENTRY_DISPLAY_VIEW' => 'bx_snipcart_entry_view',
+            'OBJECT_FORM_ENTRY_DISPLAY_ADD' => 'bx_snipcart_entry_add',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT' => 'bx_snipcart_entry_edit',
+            'OBJECT_FORM_ENTRY_DISPLAY_DELETE' => 'bx_snipcart_entry_delete',
+        	'OBJECT_FORM_SETTINGS' => 'bx_snipcart_settings',
+        	'OBJECT_FORM_SETTINGS_DISPLAY_EDIT' => 'bx_snipcart_settings_edit',
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY' => 'bx_snipcart_view', // actions menu on view entry page
+            'OBJECT_MENU_ACTIONS_MY_ENTRIES' => 'bx_snipcart_my', // actions menu on my entries page
+            'OBJECT_MENU_SUBMENU' => 'bx_snipcart_submenu', // main module submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY' => 'bx_snipcart_view_submenu', // view entry submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_MAIN_SELECTION' => 'snipcart-home', // first item in view entry submenu from main module submenu
+            'OBJECT_MENU_MANAGE_TOOLS' => 'bx_snipcart_menu_manage_tools', //manage menu in content administration tools
+            'OBJECT_GRID_ADMINISTRATION' => 'bx_snipcart_administration',
+        	'OBJECT_GRID_COMMON' => 'bx_snipcart_common',
+            'OBJECT_UPLOADERS' => array('sys_simple', 'sys_html5'),
+
+            // menu items which visibility depends on custom visibility checking
+            'MENU_ITEM_TO_METHOD' => array (
+                'bx_snipcart_my' => array (
+                    'create-snipcart-entry' => 'checkAllowedAdd',
+                ),
+                'bx_snipcart_view' => $aMenuItems2Methods,
+            ),
+
+            // some language keys
+            'T' => array (
+                'txt_sample_single' => '_bx_snipcart_txt_sample_single',
+            	'txt_sample_single_with_article' => '_bx_snipcart_txt_sample_single_with_article',
+            	'txt_sample_comment_single' => '_bx_snipcart_txt_sample_comment_single',
+            	'txt_sample_vote_single' => '_bx_snipcart_txt_sample_vote_single',
+            	'grid_action_err_delete' => '_bx_snipcart_grid_action_err_delete',
+            	'grid_txt_account_manager' => '_bx_snipcart_grid_txt_account_manager',
+				'filter_item_active' => '_bx_snipcart_grid_filter_item_title_adm_active',
+            	'filter_item_hidden' => '_bx_snipcart_grid_filter_item_title_adm_hidden',
+            	'filter_item_select_one_filter1' => '_bx_snipcart_grid_filter_item_title_adm_select_one_filter1',
+            	'menu_item_manage_my' => '_bx_snipcart_menu_item_title_manage_my',
+            	'menu_item_manage_all' => '_bx_snipcart_menu_item_title_manage_all',
+                'txt_all_entries_by' => '_bx_snipcart_txt_all_entries_by',
+                'txt_all_entries_by_author' => '_bx_snipcart_page_title_browse_by_author',
+            	'txt_pict_use_as_thumb' => '_bx_snipcart_form_entry_input_picture_use_as_thumb'
+            ),
+        );
+
+        $this->_aJsClasses = array(
+        	'manage_tools' => 'BxSnipcartManageTools'
+        );
+
+        $this->_aJsObjects = array(
+        	'manage_tools' => 'oBxSnipcartManageTools'
+        );
+
+        $this->_aGridObjects = array(
+        	'common' => $this->CNF['OBJECT_GRID_COMMON'],
+        	'administration' => $this->CNF['OBJECT_GRID_ADMINISTRATION'],
+        	
+        );
+    }
+
+    public function getApiKey($aSettings)
+    {
+        if(empty($aSettings['mode']) || !in_array($aSettings['mode'], array(BX_SNIPCART_MODE_TEST, BX_SNIPCART_MODE_LIVE)))
+            return '';
+
+        return $aSettings['api_key_' . $aSettings['mode']]; 
+    }
+}
+
+/** @} */

+ 59 - 0
modules/boonex/snipcart/classes/BxSnipcartDb.php

@@ -0,0 +1,59 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/*
+ * Module database queries
+ */
+class BxSnipcartDb extends BxBaseModTextDb
+{
+    function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+
+    public function getSettings($aParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+    	$aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
+        $sWhereClause = $sOrderByClause = "";
+
+        $sSelectClause = "*";
+        switch($aParams['type']) {
+            case 'id':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1] = array(
+                	'id' => $aParams['id']
+                );
+
+                $sWhereClause .= " AND `id`=:id";
+                break;
+
+            case 'author':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1] = array(
+                	'author' => $aParams['author']
+                );
+
+                $sWhereClause .= " AND `author`=:author";
+                break;
+
+            case 'all':
+            	break;
+        }
+
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . " FROM `" . $CNF['TABLE_SETTINGS'] . "` WHERE 1 " . $sWhereClause;
+
+        return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/snipcart/classes/BxSnipcartFormEntry.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Create/Edit entry form
+ */
+class BxSnipcartFormEntry extends BxBaseModTextFormEntry
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_snipcart';
+        parent::__construct($aInfo, $oTemplate);
+    }
+}
+
+/** @} */

+ 30 - 0
modules/boonex/snipcart/classes/BxSnipcartFormSettings.php

@@ -0,0 +1,30 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Edit settings form
+ */
+class BxSnipcartFormSettings extends BxTemplFormView
+{
+    protected $_sModule;
+    protected $_oModule;
+
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->_sModule = 'bx_snipcart';
+
+        parent::__construct($aInfo, $oTemplate);
+
+        $this->_oModule = BxDolModule::getInstance($this->_sModule);
+    }
+}
+
+/** @} */

+ 23 - 0
modules/boonex/snipcart/classes/BxSnipcartFormsEntryHelper.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Entry forms helper functions
+ */
+class BxSnipcartFormsEntryHelper extends BxBaseModTextFormsEntryHelper
+{
+    public function __construct($oModule)
+    {
+        parent::__construct($oModule);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/snipcart/classes/BxSnipcartGridAdministration.php

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

+ 21 - 0
modules/boonex/snipcart/classes/BxSnipcartGridCommon.php

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

+ 24 - 0
modules/boonex/snipcart/classes/BxSnipcartMenu.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * General class for module menu.
+ */
+class BxSnipcartMenu extends BxBaseModTextMenu
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_snipcart';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 25 - 0
modules/boonex/snipcart/classes/BxSnipcartMenuManageTools.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * 'Snipcart manage tools' menu.
+ */
+class BxSnipcartMenuManageTools extends BxBaseModTextMenuManageTools
+{
+
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_snipcart';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 37 - 0
modules/boonex/snipcart/classes/BxSnipcartMenuView.php

@@ -0,0 +1,37 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * View entry menu
+ */
+class BxSnipcartMenuView extends BxBaseModTextMenuView
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_snipcart';
+
+        parent::__construct($aObject, $oTemplate);
+    }
+
+
+    public function getCode ()
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $sResult = parent::getCode();
+        if($this->_sObject != $CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY'])
+            return $sResult;
+
+        return $this->_oModule->_oTemplate->getSctButton($this->_aContentInfo) . $sResult;
+    }
+}
+
+/** @} */

+ 93 - 0
modules/boonex/snipcart/classes/BxSnipcartModule.php

@@ -0,0 +1,93 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+define('BX_SNIPCART_MODE_TEST', 'test');
+define('BX_SNIPCART_MODE_LIVE', 'live');
+
+/**
+ * Snipcart module
+ */
+class BxSnipcartModule extends BxBaseModTextModule
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+    }
+
+    public function serviceIncludeCssJs($iProfileId = 0)
+    {
+        $iProfileId = !empty($iProfileId) ? $iProfileId : $this->_iProfileId;
+        if(empty($iProfileId))
+            return '';
+
+        $aSettings = $this->_oDb->getSettings(array('type' => 'author', 'author' => $iProfileId));
+        if(empty($aSettings) || !is_array($aSettings))
+            return '';
+
+        return $this->_oTemplate->getSctInclude($aSettings);
+    }
+
+    public function serviceEntityCreate ()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+    	$aSettings = $this->_oDb->getSettings(array('type' => 'author', 'author' => $this->_iProfileId));
+        if(empty($aSettings) || !is_array($aSettings))
+    		return MsgBox(_t('_bx_snipcart_err_not_configured', BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink($CNF['URL_SETTINGS'])));
+
+    	$this->_oTemplate->addJs(array('entry.js'));
+    	return $this->_oTemplate->getJsCode('entry') . parent::serviceEntityCreate();
+    }
+
+    public function serviceSettings()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(!$this->_iProfileId)
+            return MsgBox(_t('_Access denied'));
+
+        $oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_SETTINGS'], $CNF['OBJECT_FORM_SETTINGS_DISPLAY_EDIT'], $this->_oTemplate);
+        if(!$oForm)
+            return MsgBox(_t('_sys_txt_error_occured'));       
+
+        $aSettings = $this->_oDb->getSettings(array('type' => 'author', 'author' => $this->_iProfileId));
+        $bSettings = !empty($aSettings) && is_array($aSettings);
+
+        $oForm->initChecker($aSettings);
+        if(!$oForm->isSubmittedAndValid())
+            return $oForm->getCode();
+
+        if(!$bSettings) {
+            $aValsToAdd = array('author' => $this->_iProfileId);
+            $iSettings = $oForm->insert($aValsToAdd);
+            if(!$iSettings) {
+                if(!$oForm->isValid())
+                    return $oForm->getCode();
+                else
+                    return MsgBox(_t('_sys_txt_error_entry_creation'));
+            }
+        }
+        else {
+            if(!$oForm->update($aSettings['id'])) {
+                if(!$oForm->isValid())
+                    return $oForm->getCode();
+                else
+                    return MsgBox(_t('_sys_txt_error_entry_update'));
+            }
+        }
+
+        return array(
+        	'content' => $oForm->getCode()
+        );
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/snipcart/classes/BxSnipcartPageAuthor.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Profile's entries page.
+ */
+class BxSnipcartPageAuthor extends BxBaseModTextPageAuthor
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        parent::__construct($aObject, $oTemplate);
+    }
+
+}
+
+/** @} */

+ 24 - 0
modules/boonex/snipcart/classes/BxSnipcartPageBrowse.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Browse entries pages.
+ */
+class BxSnipcartPageBrowse extends BxBaseModTextPageBrowse
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_snipcart';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 46 - 0
modules/boonex/snipcart/classes/BxSnipcartPageEntry.php

@@ -0,0 +1,46 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Entry create/edit pages
+ */
+class BxSnipcartPageEntry extends BxBaseModTextPageEntry
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_snipcart';
+        parent::__construct($aObject, $oTemplate);
+    }
+
+    public function getCode ()
+    {
+        if (!$this->_aContentInfo) {
+            $this->_oTemplate->displayPageNotFound();
+            exit;
+        }
+
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        BxDolTemplate::getInstance()->addInjection('injection_head', 'text', $this->_oModule->serviceIncludeCssJs($this->_aContentInfo[$CNF['FIELD_AUTHOR']]));
+
+        return parent::getCode();
+    }
+
+    protected function _setSubmenu($aParams)
+    {
+    	parent::_setSubmenu(array_merge($aParams, array(
+    		'title' => '',
+    		'icon' => ''
+    	)));
+    }
+}
+
+/** @} */

+ 138 - 0
modules/boonex/snipcart/classes/BxSnipcartSearchResult.php

@@ -0,0 +1,138 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxSnipcartSearchResult extends BxBaseModTextSearchResult
+{
+    function __construct($sMode = '', $aParams = array())
+    {
+        parent::__construct($sMode, $aParams);
+
+        $this->aCurrent = array(
+            'name' => 'bx_snipcart',
+            'module_name' => 'bx_snipcart',
+            'object_metatags' => 'bx_snipcart',
+            'title' => _t('_bx_snipcart_page_title_browse'),
+            'table' => 'bx_snipcart_entries',
+            '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' => '='),
+            ),
+            'paginate' => array('perPage' => getParam('bx_snipcart_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',
+                ),
+            ),
+            'ident' => 'id',
+        );
+
+        $this->sFilterName = 'bx_snipcart_filter';
+        $this->oModule = $this->getMain();
+        $this->aCurrent['searchFields'] = explode(',', getParam($this->oModule->_oConfig->CNF['PARAM_SEARCHABLE_FIELDS']));
+
+        $oProfileAuthor = null;
+
+        $CNF = &$this->oModule->_oConfig->CNF;
+
+        switch ($sMode) {
+            case 'author':
+                if(!$this->_updateCurrentForAuthor($sMode, $aParams, $oProfileAuthor)) {
+                    $this->isError = true;
+                    break;
+                }
+                break;
+
+            case 'favorite':
+                if(!$this->_updateCurrentForFavorite($sMode, $aParams, $oProfileAuthor)) {
+                    $this->isError = true;
+                    break;
+                }
+                break;
+
+            case 'public':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_HOME']);
+                $this->aCurrent['title'] = _t('_bx_snipcart_page_title_browse_recent');
+                $this->aCurrent['rss']['link'] = 'modules/?r=snipcart/rss/' . $sMode;
+                break;
+
+            case 'featured':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_HOME']);
+                $this->aCurrent['title'] = _t('_bx_snipcart_page_title_browse_featured');
+                $this->aCurrent['restriction']['featured']['value'] = '0';
+                $this->aCurrent['rss']['link'] = 'modules/?r=snipcart/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'featured';
+                break;
+
+            case 'popular':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_POPULAR']);
+                $this->aCurrent['title'] = _t('_bx_snipcart_page_title_browse_popular');
+                $this->aCurrent['rss']['link'] = 'modules/?r=snipcart/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'popular';
+                break;
+
+            case 'updated':
+                $this->sBrowseUrl = BxDolPermalinks::getInstance()->permalink($CNF['URL_UPDATED']);
+                $this->aCurrent['title'] = _t('_bx_snipcart_page_title_browse_updated');
+                $this->aCurrent['rss']['link'] = 'modules/?r=snipcart/rss/' . $sMode;
+                $this->aCurrent['sorting'] = 'updated';
+                break;
+
+            case '': // search results
+                $this->sBrowseUrl = BX_DOL_SEARCH_KEYWORD_PAGE;
+                $this->aCurrent['title'] = _t('_bx_snipcart');
+                $this->aCurrent['paginate']['perPage'] = 3;
+                unset($this->aCurrent['rss']);
+                break;
+
+            default:
+                $sMode = '';
+                $this->isError = true;
+        }
+
+        $this->processReplaceableMarkers($oProfileAuthor);
+
+        $this->addConditionsForPrivateContent($CNF, $oProfileAuthor);
+    }
+
+    function getAlterOrder()
+    {
+        $aSql = array();
+        switch ($this->aCurrent['sorting']) {
+            case 'last':
+                $aSql['order'] = ' ORDER BY `bx_snipcart_entries`.`added` DESC';
+                break;
+            case 'featured':
+                $aSql['order'] = ' ORDER BY `bx_snipcart_entries`.`featured` DESC';
+                break;
+            case 'updated':
+                $aSql['order'] = ' ORDER BY `bx_snipcart_entries`.`changed` DESC';
+                break;
+            case 'popular':
+                $aSql['order'] = ' ORDER BY `bx_snipcart_entries`.`views` DESC';
+                break;
+        }
+        return $aSql;
+    }
+}
+
+/** @} */

+ 56 - 0
modules/boonex/snipcart/classes/BxSnipcartTemplate.php

@@ -0,0 +1,56 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/*
+ * Module representation.
+ */
+class BxSnipcartTemplate extends BxBaseModTextTemplate
+{
+    /**
+     * Constructor
+     */
+    function __construct(&$oConfig, &$oDb)
+    {
+        $this->MODULE = 'bx_snipcart';
+        parent::__construct($oConfig, $oDb);
+    }
+
+    public function getSctInclude($aSettings)
+    {
+        $sKey = $this->_oConfig->getApiKey($aSettings);
+        if(empty($sKey))
+            return '';
+
+        return $this->parseHtmlByName('sct_include.html', array(
+            'key' => $sKey
+        ));
+    }
+
+    public function getSctButton($aContentInfo)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $sUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $aContentInfo[$CNF['FIELD_ID']]);
+
+        return $this->parseHtmlByName('sct_button.html', array(
+            'bx_repeat:items' => array(
+                array('key' => 'id', 'value' => $aContentInfo[$CNF['FIELD_ID']]),
+                array('key' => 'name', 'value' => bx_html_attribute($aContentInfo[$CNF['FIELD_TITLE']])),
+                array('key' => 'price', 'value' => sprintf('%01.2f', $aContentInfo[$CNF['FIELD_PRICE']])),
+                array('key' => 'weight', 'value' => $aContentInfo[$CNF['FIELD_WEIGHT']]),
+                array('key' => 'url', 'value' => $sUrl),
+                array('key' => 'description', 'value' => bx_html_attribute(strip_tags($aContentInfo[$CNF['FIELD_TEXT']]))),
+            )
+        ));
+    }
+}
+
+/** @} */

+ 124 - 0
modules/boonex/snipcart/install/config.php

@@ -0,0 +1,124 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_snipcart',
+    'title' => 'Snipcart',
+    'note' => 'Snipcart shopping module.',
+    'version' => '9.0.0.DEV',
+    'vendor' => 'BoonEx',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
+
+    'compatible_with' => array(
+        '9.0.x'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/snipcart/',
+    'home_uri' => 'snipcart',
+
+    'db_prefix' => 'bx_snipcart_',
+    'class_prefix' => 'BxSnipcart',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Snipcart',
+
+    /**
+     * List of page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_profile_view_entry',
+    ),
+    
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+    	'trigger_profile_view_submenu'
+    ),
+
+    /**
+     * Storages.
+     */
+    'storages' => array(
+    	'bx_snipcart_files'
+    ),
+
+    /**
+     * Transcoders.
+     */
+    'transcoders' => array(
+		'bx_snipcart_preview',
+        'bx_snipcart_gallery',
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_storages' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'process_menu_triggers' => 1,
+        'process_page_triggers' => 1,
+    	'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+    	'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'
+    ),
+
+);
+
+/** @} */

+ 20 - 0
modules/boonex/snipcart/install/installer.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    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxSnipcartInstaller extends BxBaseModTextInstaller
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}
+
+/** @} */

+ 219 - 0
modules/boonex/snipcart/install/langs/en.xml

@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+
+	<string name="_bx_snipcart"><![CDATA[Snipcart]]></string>
+	<string name="_bx_snipcart_cmts"><![CDATA[Snipcart's Reviews]]></string>
+
+	<string name="_bx_snipcart_option_summary_chars"><![CDATA[Number of characters in auto-cropped item summary]]></string>
+	<string name="_bx_snipcart_option_plain_summary_chars"><![CDATA[Number of characters in plain item description when item hasn't thumb]]></string>
+	<string name="_bx_snipcart_option_per_page_browse"><![CDATA[Number of items per page]]></string>
+	<string name="_bx_snipcart_option_per_page_profile"><![CDATA[Number of items per page on profile/group page]]></string>
+	<string name="_bx_snipcart_option_rss_num"><![CDATA[Number of items in RSS feed]]></string>
+	<string name="_bx_snipcart_option_searchable_fields"><![CDATA[Searchable fields]]></string>
+
+	<string name="_bx_snipcart_form_entry"><![CDATA[Goods]]></string>
+	<string name="_bx_snipcart_form_entry_display_add"><![CDATA[Add Goods]]></string>
+	<string name="_bx_snipcart_form_entry_display_edit"><![CDATA[Edit Goods]]></string>
+	<string name="_bx_snipcart_form_entry_display_delete"><![CDATA[Delete Goods]]></string>
+	<string name="_bx_snipcart_form_entry_display_view"><![CDATA[View Goods]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_do_submit"><![CDATA[Submit]]></string>
+	<string name="_bx_snipcart_form_entry_input_do_submit"><![CDATA[Submit]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_do_publish"><![CDATA[Publish]]></string>
+	<string name="_bx_snipcart_form_entry_input_do_publish"><![CDATA[Publish]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_title"><![CDATA[Title]]></string>
+	<string name="_bx_snipcart_form_entry_input_title"><![CDATA[Title]]></string>
+	<string name="_bx_snipcart_form_entry_input_title_err"><![CDATA[Title is essential. Please, fill in this field]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_cat"><![CDATA[Category]]></string>
+	<string name="_bx_snipcart_form_entry_input_cat"><![CDATA[Category]]></string>
+    <string name="_bx_snipcart_form_entry_input_cat_err"><![CDATA[Please select category]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_text"><![CDATA[Text]]></string>
+	<string name="_bx_snipcart_form_entry_input_text"><![CDATA[Text]]></string>
+	<string name="_bx_snipcart_form_entry_input_text_err"><![CDATA[Text field can't be empty]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_price"><![CDATA[Price]]></string>
+    <string name="_bx_snipcart_form_entry_input_price"><![CDATA[Price]]></string>
+    <string name="_bx_snipcart_form_entry_input_price_err"><![CDATA[Price field can't be empty]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_weight"><![CDATA[Weight]]></string>
+    <string name="_bx_snipcart_form_entry_input_weight"><![CDATA[Weight]]></string>
+    <string name="_bx_snipcart_form_entry_input_weight_err"><![CDATA[Weight field can't be empty]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_delete_confirm"><![CDATA[Delete confirmation]]></string>
+	<string name="_bx_snipcart_form_entry_input_delete_confirm"><![CDATA[I am sure I want to delete this product]]></string>
+	<string name="_bx_snipcart_form_entry_input_delete_confirm_info"><![CDATA[This action can not be undone]]></string>
+	<string name="_bx_snipcart_form_entry_input_delete_confirm_error"><![CDATA[Please check this checkbox if you really want to delete the product]]></string>
+	<string name="_bx_snipcart_form_entry_input_sys_pictures"><![CDATA[Pictures]]></string>
+	<string name="_bx_snipcart_form_entry_input_pictures"><![CDATA[Pictures]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_allow_view_to"><![CDATA[Visibility]]></string>
+    <string name="_bx_snipcart_form_entry_input_allow_view_to"><![CDATA[Visibility]]></string>
+    <string name="_bx_snipcart_form_entry_input_picture_use_as_thumb"><![CDATA[Cover Image]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_date_added"><![CDATA[Created]]></string>
+    <string name="_bx_snipcart_form_entry_input_date_added"><![CDATA[Created]]></string>
+    <string name="_bx_snipcart_form_entry_input_sys_date_changed"><![CDATA[Updated]]></string>
+    <string name="_bx_snipcart_form_entry_input_date_changed"><![CDATA[Updated]]></string>
+
+    <string name="_bx_snipcart_form_settings"><![CDATA[Settings]]></string>
+    <string name="_bx_snipcart_form_settings_display_edit"><![CDATA[Edit Settings]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_mode"><![CDATA[Mode]]></string>
+    <string name="_bx_snipcart_form_settings_input_mode"><![CDATA[Mode]]></string>
+    <string name="_bx_snipcart_form_settings_input_mode_err"><![CDATA[Mode is essential. Please, fill in this field]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_api_key_test"><![CDATA[API Key (test)]]></string>
+    <string name="_bx_snipcart_form_settings_input_api_key_test"><![CDATA[API Key (test)]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_api_key_live"><![CDATA[API Key (live)]]></string>
+    <string name="_bx_snipcart_form_settings_input_api_key_live"><![CDATA[API Key (live)]]></string>
+    <string name="_bx_snipcart_form_settings_input_sys_do_submit"><![CDATA[Submit]]></string>
+    <string name="_bx_snipcart_form_settings_input_do_submit"><![CDATA[Submit]]></string>
+
+	<string name="_bx_snipcart_acl_action_create_entry"><![CDATA[Create Goods]]></string>
+	<string name="_bx_snipcart_acl_action_delete_entry"><![CDATA[Delete Goods]]></string>
+	<string name="_bx_snipcart_acl_action_view_entry"><![CDATA[View Goods]]></string>
+	<string name="_bx_snipcart_acl_action_set_thumb"><![CDATA[Set Goods Thumbnail]]></string>
+	<string name="_bx_snipcart_acl_action_edit_any_entry"><![CDATA[Edit Any Goods]]></string>
+
+	<string name="_bx_snipcart_page_title_sys_create_entry"><![CDATA[New Goods]]></string>
+	<string name="_bx_snipcart_page_title_create_entry"><![CDATA[New Item]]></string>
+	<string name="_bx_snipcart_page_block_title_create_entry"><![CDATA[New Item]]></string>
+	<string name="_bx_snipcart_page_title_sys_edit_entry"><![CDATA[Edit]]></string>
+	<string name="_bx_snipcart_page_title_edit_entry"><![CDATA[Edit]]></string>
+	<string name="_bx_snipcart_page_block_title_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_snipcart_page_title_sys_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_snipcart_page_title_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_snipcart_page_block_title_delete_entry"><![CDATA[Delete]]></string>
+	<string name="_bx_snipcart_page_title_sys_view_entry"><![CDATA[View Goods]]></string>
+	<string name="_bx_snipcart_page_title_view_entry"><![CDATA[{title}]]></string>
+	<string name="_bx_snipcart_page_block_title_entry_text"><![CDATA[Item Text]]></string>
+	<string name="_bx_snipcart_page_title_browse"><![CDATA[Goods]]></string>
+	<string name="_bx_snipcart_page_title_search_results"><![CDATA[Goods matching "{0}"]]></string>
+	<string name="_bx_snipcart_page_title_browse_by_author"><![CDATA[Goods of {display_name}]]></string>
+	<string name="_bx_snipcart_page_title_browse_featured"><![CDATA[Featured]]></string>
+    <string name="_bx_snipcart_page_title_browse_recent"><![CDATA[Latest]]></string>
+    <string name="_bx_snipcart_page_title_browse_popular"><![CDATA[Popular]]></string>
+    <string name="_bx_snipcart_page_title_browse_updated"><![CDATA[Updated Goods]]></string>
+    <string name="_bx_snipcart_page_title_sys_home"><![CDATA[Goods Home]]></string>
+    <string name="_bx_snipcart_page_title_home"><![CDATA[Goods]]></string>
+    <string name="_bx_snipcart_page_block_title_featured_entries_view_extended"><![CDATA[Featured]]></string>
+    <string name="_bx_snipcart_page_block_title_recent_entries"><![CDATA[Latest (Gallery View)]]></string>
+    <string name="_bx_snipcart_page_block_title_recent_entries_view_extended"><![CDATA[Latest]]></string>
+    <string name="_bx_snipcart_page_block_title_recent_entries_view_full"><![CDATA[Latest (Full View)]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_social_sharing"><![CDATA[Share]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_author"><![CDATA[Author]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_actions"><![CDATA[Actions]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_comments"><![CDATA[Comments]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_comments_link"><![CDATA[Comments to <a href="{entry_link}">{title}</a>]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_location"><![CDATA[Location]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_attachments"><![CDATA[Attachments]]></string>
+    <string name="_bx_snipcart_page_block_title_entry_all_actions"><![CDATA[All Actions]]></string>
+    <string name="_bx_snipcart_page_title_sys_entries_popular"><![CDATA[Popular]]></string>
+    <string name="_bx_snipcart_page_title_entries_popular"><![CDATA[Popular]]></string>
+    <string name="_bx_snipcart_page_title_sys_entries_updated"><![CDATA[Updated Goods]]></string>
+    <string name="_bx_snipcart_page_title_entries_updated"><![CDATA[Updated Goods]]></string>
+    <string name="_bx_snipcart_page_block_title_popular_entries"><![CDATA[Popular]]></string>
+    <string name="_bx_snipcart_page_block_title_popular_entries_view_extended"><![CDATA[Popular (Extended View)]]></string>
+    <string name="_bx_snipcart_page_block_title_popular_entries_view_full"><![CDATA[Popular (Full View)]]></string>
+    <string name="_bx_snipcart_page_block_title_updated_entries"><![CDATA[Updated Goods]]></string>
+    <string name="_bx_snipcart_page_title_sys_view_entry_comments"><![CDATA[Goods Comments]]></string>
+    <string name="_bx_snipcart_page_title_view_entry_comments"><![CDATA[Comments to {title}]]></string>
+    <string name="_bx_snipcart_page_title_sys_entries_of_author"><![CDATA[Goods of author]]></string>
+    <string name="_bx_snipcart_page_title_entries_of_author"><![CDATA[Goods by {display_name}]]></string>
+    <string name="_bx_snipcart_page_block_title_favorites_of_author"><![CDATA[Favorites by <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_snipcart_page_block_title_sys_favorites_of_author"><![CDATA[Favorites of author]]></string>
+    <string name="_bx_snipcart_page_block_title_entries_of_author"><![CDATA[Goods by <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_snipcart_page_block_title_sys_entries_of_author"><![CDATA[Goods of author]]></string>   
+    <string name="_bx_snipcart_page_block_title_entries_actions"><![CDATA[Goods actions]]></string>
+    <string name="_bx_snipcart_page_block_title_browse_cmts"><![CDATA[Goods' Comments]]></string>
+	<string name="_bx_snipcart_page_title_sys_manage"><![CDATA[Manage Own]]></string>
+	<string name="_bx_snipcart_page_title_sys_manage_administration"><![CDATA[Manage All]]></string>
+	<string name="_bx_snipcart_page_title_manage"><![CDATA[Manage]]></string>
+	<string name="_bx_snipcart_page_block_title_system_manage"><![CDATA[Manage Own]]></string>
+	<string name="_bx_snipcart_page_block_title_system_manage_administration"><![CDATA[Manage All]]></string>
+	<string name="_bx_snipcart_page_block_title_manage"><![CDATA[Manage]]></string>    
+	<string name="_bx_snipcart_page_block_title_popular_keywords"><![CDATA[Popular Hashtags]]></string>
+	<string name="_bx_snipcart_page_block_title_cats"><![CDATA[Categories]]></string>
+	<string name="_bx_snipcart_page_block_title_entry_info"><![CDATA[Info]]></string>
+	<string name="_bx_snipcart_page_block_title_my_entries"><![CDATA[My Goods]]></string>
+    <string name="_bx_snipcart_page_title_sys_settings"><![CDATA[Settings]]></string>
+    <string name="_bx_snipcart_page_title_settings"><![CDATA[Settings]]></string>
+    <string name="_bx_snipcart_page_block_title_system_settings"><![CDATA[Settings]]></string>
+    <string name="_bx_snipcart_page_block_title_settings"><![CDATA[Settings]]></string>
+
+    <string name="_bx_snipcart_menu_set_title_view_entry"><![CDATA[Goods Actions]]></string>
+    <string name="_bx_snipcart_menu_title_view_entry"><![CDATA[Goods Actions]]></string>
+    <string name="_bx_snipcart_menu_title_submenu"><![CDATA[Goods Submenu]]></string>
+    <string name="_bx_snipcart_menu_set_title_submenu"><![CDATA[Goods Submenu]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_create_entry"><![CDATA[New Goods]]></string>
+    <string name="_bx_snipcart_menu_item_title_create_entry"><![CDATA[New Goods]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_snipcart_menu_item_title_edit_entry"><![CDATA[Edit]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_snipcart_menu_item_title_delete_entry"><![CDATA[Delete]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_view_entry"><![CDATA[View Goods]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_home"><![CDATA[Shop]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_home"><![CDATA[Shop]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_public"><![CDATA[Latest]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_public"><![CDATA[Latest]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_settings"><![CDATA[Settings]]></string>
+    <string name="_bx_snipcart_menu_item_title_settings"><![CDATA[Settings]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_dashboard"><![CDATA[Dashboard]]></string>
+    <string name="_bx_snipcart_menu_item_title_dashboard"><![CDATA[Dashboard]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_entries_popular"><![CDATA[Popular]]></string>
+    <string name="_bx_snipcart_menu_item_title_entries_popular"><![CDATA[Popular]]></string>
+    <string name="_bx_snipcart_menu_title_view_entry_submenu"><![CDATA[View Goods Submenu]]></string>
+    <string name="_bx_snipcart_menu_set_title_view_entry_submenu"><![CDATA[View Goods Submenu]]></string>
+    <string name="_bx_snipcart_menu_item_title_view_entry_submenu_entry"><![CDATA[Item]]></string>
+    <string name="_bx_snipcart_menu_item_title_view_entry_submenu_comments"><![CDATA[Comments]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_view_entry_comments"><![CDATA[Goods Comments]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_view_entries_author"><![CDATA[Goods]]></string>
+    <string name="_bx_snipcart_menu_item_title_view_entries_author"><![CDATA[Goods]]></string>
+    <string name="_bx_snipcart_menu_title_entries_my"><![CDATA[My Goods Action Menu]]></string>
+    <string name="_bx_snipcart_menu_set_title_entries_my"><![CDATA[My Goods Menu]]></string>
+	<string name="_bx_snipcart_menu_item_title_system_manage_my_entries"><![CDATA[My goods]]></string>
+    <string name="_bx_snipcart_menu_item_title_manage_my_entries"><![CDATA[{addon} goods]]></string>
+    <string name="_bx_snipcart_menu_set_title_manage_tools"><![CDATA[Manage Tools Submenu]]></string>
+    <string name="_bx_snipcart_menu_title_manage_tools"><![CDATA[Manage Tools Submenu]]></string>
+    <string name="_bx_snipcart_menu_item_title_system_manage_account"><![CDATA[Manage account]]></string>
+    <string name="_bx_snipcart_menu_item_title_manage_account"><![CDATA[Manage account]]></string>
+	<string name="_bx_snipcart_menu_item_title_system_admt_entries"><![CDATA[Goods]]></string>
+	<string name="_bx_snipcart_menu_item_title_admt_entries"><![CDATA[Goods - {addon} hidden]]></string>
+	<string name="_bx_snipcart_menu_item_title_manage_my"><![CDATA[My Goods]]></string>
+	<string name="_bx_snipcart_menu_item_title_manage_all"><![CDATA[All Goods]]></string>
+	<string name="_bx_snipcart_menu_item_title_buy"><![CDATA[Buy]]></string>
+
+	<string name="_bx_snipcart_grid_filter_item_title_adm_select_one_filter1"><![CDATA[All Statuses]]></string>
+	<string name="_bx_snipcart_grid_filter_item_title_adm_active"><![CDATA[Active]]></string>
+	<string name="_bx_snipcart_grid_filter_item_title_adm_hidden"><![CDATA[Hidden]]></string>
+	<string name="_bx_snipcart_grid_column_title_adm_active"><![CDATA[Active]]></string>
+    <string name="_bx_snipcart_grid_column_title_adm_title"><![CDATA[Title]]></string>
+    <string name="_bx_snipcart_grid_column_title_adm_added"><![CDATA[Added]]></string>
+    <string name="_bx_snipcart_grid_column_title_adm_author"><![CDATA[Author]]></string>
+    <string name="_bx_snipcart_grid_action_title_adm_edit"><![CDATA[Edit]]></string>
+    <string name="_bx_snipcart_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_snipcart_grid_action_title_adm_more_actions"><![CDATA[More Actions]]></string>
+    <string name="_bx_snipcart_grid_action_err_delete"><![CDATA[Cannot delete the selected product(s).]]></string>
+    <string name="_bx_snipcart_grid_txt_account_manager"><![CDATA[Redirect to manage account.]]></string>
+
+    <string name="_bx_snipcart_pre_lists_cats"><![CDATA[Goods categories]]></string>
+    <string name="_bx_snipcart_cat_adult"><![CDATA[Adult]]></string>
+    <string name="_bx_snipcart_cat_communication"><![CDATA[Communication]]></string>
+    <string name="_bx_snipcart_cat_conversion"><![CDATA[Conversion]]></string>
+    <string name="_bx_snipcart_cat_documentation"><![CDATA[Documentation]]></string>
+    <string name="_bx_snipcart_cat_games"><![CDATA[Games]]></string>
+    <string name="_bx_snipcart_cat_mobile"><![CDATA[Mobile]]></string>
+    <string name="_bx_snipcart_cat_multimedia"><![CDATA[Multimedia]]></string>
+    <string name="_bx_snipcart_cat_music"><![CDATA[Music]]></string>
+    <string name="_bx_snipcart_cat_navigation"><![CDATA[Navigation]]></string>
+    <string name="_bx_snipcart_cat_other"><![CDATA[Other]]></string>
+    <string name="_bx_snipcart_cat_photography"><![CDATA[Photography]]></string>
+    <string name="_bx_snipcart_cat_security"><![CDATA[Security]]></string>
+    <string name="_bx_snipcart_cat_tools"><![CDATA[Tools]]></string>
+
+    <string name="_bx_snipcart_pre_lists_modes"><![CDATA[Modes]]></string>
+    <string name="_bx_snipcart_mode_test"><![CDATA[test]]></string>
+    <string name="_bx_snipcart_mode_live"><![CDATA[live]]></string>
+
+    <string name="_bx_snipcart_err_not_configured"><![CDATA[You need to configure shop settings first. <a href="{0}">Click here</a>.]]></string>
+
+    <string name="_bx_snipcart_txt_all_entries_by"><![CDATA[<a href="{0}">All Goods by {1} ({2})</a>]]></string>
+    <string name="_bx_snipcart_txt_sample_single"><![CDATA[shop item]]></string>
+    <string name="_bx_snipcart_txt_sample_single_with_article"><![CDATA[a shop item]]></string>
+    <string name="_bx_snipcart_txt_sample_comment_single"><![CDATA[shop item's comment]]></string>
+    <string name="_bx_snipcart_txt_sample_vote_single"><![CDATA[shop item's vote]]></string>
+</resources>

+ 51 - 0
modules/boonex/snipcart/install/sql/disable.sql

@@ -0,0 +1,51 @@
+
+-- SETTINGS
+SET @iTypeId = (SELECT `ID` FROM `sys_options_types` WHERE `name` = 'bx_snipcart' 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_snipcart';
+DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_snipcart' OR `object` IN('bx_snipcart_create_entry', 'bx_snipcart_edit_entry', 'bx_snipcart_delete_entry', 'bx_snipcart_view_entry', 'bx_snipcart_view_entry_comments', 'bx_snipcart_home', 'bx_snipcart_popular', 'bx_snipcart_updated', 'bx_snipcart_author');
+
+
+-- MENU
+DELETE FROM `sys_objects_menu` WHERE `module` = 'bx_snipcart';
+DELETE FROM `sys_menu_sets` WHERE `module` = 'bx_snipcart';
+DELETE FROM `sys_menu_items` WHERE `module` = 'bx_snipcart' OR `set_name` IN('bx_snipcart_view', 'bx_snipcart_submenu', 'bx_snipcart_view_submenu', 'bx_snipcart_my');
+
+
+-- PRIVACY 
+DELETE FROM `sys_objects_privacy` WHERE `object` = 'bx_snipcart_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_snipcart';
+DELETE FROM `sys_acl_actions` WHERE `Module` = 'bx_snipcart';
+
+
+-- SEARCH
+DELETE FROM `sys_objects_search` WHERE `ObjectName` IN ('bx_snipcart', 'bx_snipcart_cmts');
+
+
+-- METATAGS
+DELETE FROM `sys_objects_metatags` WHERE `object` = 'bx_snipcart';
+
+
+-- CATEGORY
+DELETE FROM `sys_objects_category` WHERE `object` = 'bx_snipcart_cats';
+
+
+-- GRIDS
+DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_snipcart_administration', 'bx_snipcart_common');
+DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_snipcart_administration', 'bx_snipcart_common');
+DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_snipcart_administration', 'bx_snipcart_common');
+
+
+-- ALERTS
+SET @iHandler := (SELECT `id` FROM `sys_alerts_handlers` WHERE `name` = 'bx_snipcart' LIMIT 1);
+DELETE FROM `sys_alerts` WHERE `handler_id` = @iHandler;
+DELETE FROM `sys_alerts_handlers` WHERE `id` = @iHandler;

+ 350 - 0
modules/boonex/snipcart/install/sql/enable.sql

@@ -0,0 +1,350 @@
+
+-- 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_snipcart', '_bx_snipcart', 'bx_snipcart@modules/boonex/snipcart/|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_snipcart', '_bx_snipcart', 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `check`, `check_error`, `extra`, `order`) VALUES
+('bx_snipcart_summary_chars', '700', @iCategId, '_bx_snipcart_option_summary_chars', 'digit', '', '', '', 1),
+('bx_snipcart_plain_summary_chars', '240', @iCategId, '_bx_snipcart_option_plain_summary_chars', 'digit', '', '', '', 2),
+('bx_snipcart_per_page_browse', '12', @iCategId, '_bx_snipcart_option_per_page_browse', 'digit', '', '', '', 10),
+('bx_snipcart_per_page_profile', '3', @iCategId, '_bx_snipcart_option_per_page_profile', 'digit', '', '', '', 12),
+('bx_snipcart_rss_num', '10', @iCategId, '_bx_snipcart_option_rss_num', 'digit', '', '', '', 20),
+('bx_snipcart_searchable_fields', 'title,text', @iCategId, '_bx_snipcart_option_searchable_fields', 'list', '', '', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:21:"get_searchable_fields";}', 30);
+
+-- 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_snipcart_create_entry', '_bx_snipcart_page_title_sys_create_entry', '_bx_snipcart_page_title_create_entry', 'bx_snipcart', 5, 2147483647, 1, 'create-snipcart-entry', 'page.php?i=create-snipcart-entry', '', '', '', 0, 1, 0, 'BxSnipcartPageBrowse', 'modules/boonex/snipcart/classes/BxSnipcartPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_snipcart_create_entry', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_create_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";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_snipcart_edit_entry', '_bx_snipcart_page_title_sys_edit_entry', '_bx_snipcart_page_title_edit_entry', 'bx_snipcart', 5, 2147483647, 1, 'edit-snipcart-entry', '', '', '', '', 0, 1, 0, 'BxSnipcartPageEntry', 'modules/boonex/snipcart/classes/BxSnipcartPageEntry.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_snipcart_edit_entry', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_edit_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";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_snipcart_delete_entry', '_bx_snipcart_page_title_sys_delete_entry', '_bx_snipcart_page_title_delete_entry', 'bx_snipcart', 5, 2147483647, 1, 'delete-snipcart-entry', '', '', '', '', 0, 1, 0, 'BxSnipcartPageEntry', 'modules/boonex/snipcart/classes/BxSnipcartPageEntry.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_snipcart_delete_entry', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_delete_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";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_snipcart_view_entry', '_bx_snipcart_page_title_sys_view_entry', '_bx_snipcart_page_title_view_entry', 'bx_snipcart', 10, 2147483647, 1, 'view-snipcart-entry', '', '', '', '', 0, 1, 0, 'BxSnipcartPageEntry', 'modules/boonex/snipcart/classes/BxSnipcartPageEntry.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_snipcart_view_entry', 1, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_text', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:17:"entity_text_block";}', 0, 0, 1, 0),
+('bx_snipcart_view_entry', 2, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_author', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:13:"entity_author";}', 0, 0, 1, 0),
+('bx_snipcart_view_entry', 3, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_info', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:11:"entity_info";}', 0, 0, 1, 1),
+('bx_snipcart_view_entry', 3, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_location', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:15:"entity_location";}', 0, 0, 0, 2),
+('bx_snipcart_view_entry', 4, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_all_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:18:"entity_all_actions";}', 0, 0, 1, 0),
+('bx_snipcart_view_entry', 4, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:14:"entity_actions";}', 0, 0, 0, 1),
+('bx_snipcart_view_entry', 4, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_social_sharing', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:21:"entity_social_sharing";}', 0, 0, 0, 2),
+('bx_snipcart_view_entry', 4, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_attachments', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:18:"entity_attachments";}', 0, 0, 0, 3),
+('bx_snipcart_view_entry', 4, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_comments', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:15:"entity_comments";}', 0, 0, 1, 4),
+('bx_snipcart_view_entry', 4, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entry_location', 3, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:13:"locations_map";s:6:"params";a:2:{i:0;s:11:"bx_snipcart";i:1;s:4:"{id}";}s:5:"class";s:20:"TemplServiceMetatags";}', 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_snipcart_view_entry_comments', '_bx_snipcart_page_title_sys_view_entry_comments', '_bx_snipcart_page_title_view_entry_comments', 'bx_snipcart', 5, 2147483647, 1, 'view-snipcart-entry-comments', '', '', '', '', 0, 1, 0, 'BxSnipcartPageEntry', 'modules/boonex/snipcart/classes/BxSnipcartPageEntry.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_snipcart_view_entry_comments', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_entry_comments', '_bx_snipcart_page_block_title_entry_comments_link', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:15:"entity_comments";}', 0, 0, 1);
+
+-- PAGE: popular entries
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart_popular', '_bx_snipcart_page_title_sys_entries_popular', '_bx_snipcart_page_title_entries_popular', 'bx_snipcart', 5, 2147483647, 1, 'snipcart-popular', 'page.php?i=snipcart-popular', '', '', '', 0, 1, 0, 'BxSnipcartPageBrowse', 'modules/boonex/snipcart/classes/BxSnipcartPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_snipcart_popular', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_popular_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:14:"browse_popular";s:6:"params";a:3:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;s:13:"ajax_paginate";b:0;}}', 0, 1, 1);
+
+-- PAGE: recently updated entries
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart_updated', '_bx_snipcart_page_title_sys_entries_updated', '_bx_snipcart_page_title_entries_updated', 'bx_snipcart', 5, 2147483647, 1, 'snipcart-updated', 'page.php?i=snipcart-updated', '', '', '', 0, 1, 0, 'BxSnipcartPageBrowse', 'modules/boonex/snipcart/classes/BxSnipcartPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_snipcart_updated', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_updated_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:14:"browse_updated";s:6:"params";a:3:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;s:13:"ajax_paginate";b:0;}}', 0, 1, 1);
+
+-- PAGE: entries of author
+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_snipcart_author', 'snipcart-author', '_bx_snipcart_page_title_sys_entries_of_author', '_bx_snipcart_page_title_entries_of_author', 'bx_snipcart', 5, 2147483647, 1, '', '', '', '', 0, 1, 0, 'BxSnipcartPageAuthor', 'modules/boonex/snipcart/classes/BxSnipcartPageAuthor.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_snipcart_author', 1, 'bx_snipcart', '', '_bx_snipcart_page_block_title_entries_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:18:"my_entries_actions";}', 0, 0, 1, 1),
+('bx_snipcart_author', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_sys_favorites_of_author', '_bx_snipcart_page_block_title_favorites_of_author', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:15:"browse_favorite";s:6:"params";a:1:{i:0;s:12:"{profile_id}";}}', 0, 1, 1, 2),
+('bx_snipcart_author', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_sys_entries_of_author', '_bx_snipcart_page_block_title_entries_of_author', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:13:"browse_author";}', 0, 0, 1, 3);
+
+-- PAGE: module home
+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_snipcart_home', 'snipcart-home', '_bx_snipcart_page_title_sys_home', '_bx_snipcart_page_title_home', 'bx_snipcart', 2, 2147483647, 1, 'page.php?i=snipcart-home', '', '', '', 0, 1, 0, 'BxSnipcartPageBrowse', 'modules/boonex/snipcart/classes/BxSnipcartPageBrowse.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_snipcart_home', 1, 'bx_snipcart', '', '_bx_snipcart_page_block_title_featured_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:15:"browse_featured";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 1, 1, 0),
+('bx_snipcart_home', 1, 'bx_snipcart', '', '_bx_snipcart_page_block_title_recent_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:13:"browse_public";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 1, 1, 1),
+('bx_snipcart_home', 2, 'bx_snipcart', '', '_bx_snipcart_page_block_title_popular_keywords', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:14:"keywords_cloud";s:6:"params";a:2:{i:0;s:11:"bx_snipcart";i:1;s:11:"bx_snipcart";}s:5:"class";s:20:"TemplServiceMetatags";}', 0, 1, 1, 0),
+('bx_snipcart_home', 2, 'bx_snipcart', '', '_bx_snipcart_page_block_title_cats', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"categories_list";s:6:"params";a:2:{i:0;s:16:"bx_snipcart_cats";i:1;a:1:{s:10:"show_empty";b:1;}}s:5:"class";s:20:"TemplServiceCategory";}', 0, 1, 1, 1);
+
+-- PAGE: module manage own
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart_manage', '_bx_snipcart_page_title_sys_manage', '_bx_snipcart_page_title_manage', 'bx_snipcart', 5, 2147483647, 1, 'snipcart-manage', 'page.php?i=snipcart-manage', '', '', '', 0, 1, 0, 'BxSnipcartPageBrowse', 'modules/boonex/snipcart/classes/BxSnipcartPageBrowse.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_snipcart_manage', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_system_manage', '_bx_snipcart_page_block_title_manage', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:12:"manage_tools";}}', 0, 1, 0);
+
+-- PAGE: module manage all
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart_administration', '_bx_snipcart_page_title_sys_manage_administration', '_bx_snipcart_page_title_manage', 'bx_snipcart', 5, 192, 1, 'snipcart-administration', 'page.php?i=snipcart-administration', '', '', '', 0, 1, 0, 'BxSnipcartPageBrowse', 'modules/boonex/snipcart/classes/BxSnipcartPageBrowse.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_snipcart_administration', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_system_manage_administration', '_bx_snipcart_page_block_title_manage', 11, 192, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:12:"manage_tools";s:6:"params";a:1:{i:0;s:14:"administration";}}', 0, 1, 0);
+
+-- PAGE: module settings
+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_snipcart_settings', '_bx_snipcart_page_title_sys_settings', '_bx_snipcart_page_title_settings', 'bx_snipcart', 5, 2147483647, 1, 'snipcart-settings', 'page.php?i=snipcart-settings', '', '', '', 0, 1, 0, 'BxSnipcartPageBrowse', 'modules/boonex/snipcart/classes/BxSnipcartPageBrowse.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_snipcart_settings', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_system_settings', '_bx_snipcart_page_block_title_settings', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:8:"settings";}}', 0, 1, 0);
+
+-- PAGE: add block to homepage
+SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = 'sys_home' AND `cell_id` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('sys_home', 1, 'bx_snipcart', '_bx_snipcart_page_block_title_recent_entries', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:13:"browse_public";}', 1, 0, 0, IFNULL(@iBlockOrder, 0) + 1);
+
+-- PAGES: add page block to profiles modules (trigger* page objects are processed separately upon modules enable/disable)
+SET @iPBCellProfile = 3;
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('trigger_page_profile_view_entry', @iPBCellProfile, 'bx_snipcart', '_bx_snipcart_page_block_title_my_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:13:"browse_author";s:6:"params";a:2:{i:0;s:12:"{profile_id}";i:1;a:1:{s:8:"per_page";s:28:"bx_snipcart_per_page_profile";}}}', 0, 0, 0);
+
+-- PAGE: service blocks
+SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = '' AND `cell_id` = 0 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('', 0, 'bx_snipcart', '_bx_snipcart_page_block_title_recent_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:13:"browse_public";s:6:"params";a:3:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;s:13:"ajax_paginate";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+
+('', 0, 'bx_snipcart', '_bx_snipcart_page_block_title_recent_entries_view_full', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:13:"browse_public";s:6:"params";a:1:{i:0;s:4:"full";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 2),
+('', 0, 'bx_snipcart', '_bx_snipcart_page_block_title_popular_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:14:"browse_popular";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 3),
+('', 0, 'bx_snipcart', '_bx_snipcart_page_block_title_popular_entries_view_full', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:14:"browse_popular";s:6:"params";a:1:{i:0;s:4:"full";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 4);
+
+
+-- MENU: add to site menu
+SET @iSiteMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_site' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_site', 'bx_snipcart', 'snipcart-home', '_bx_snipcart_menu_item_title_system_entries_home', '_bx_snipcart_menu_item_title_entries_home', 'page.php?i=snipcart-home', '', '', 'shopping-cart col-green1', 'bx_snipcart_submenu', 2147483647, 1, 1, IFNULL(@iSiteMenuOrder, 0) + 1);
+
+-- MENU: add to homepage menu
+SET @iHomepageMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_homepage' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_homepage', 'bx_snipcart', 'snipcart-home', '_bx_snipcart_menu_item_title_system_entries_home', '_bx_snipcart_menu_item_title_entries_home', 'page.php?i=snipcart-home', '', '', 'shopping-cart col-green1', 'bx_snipcart_submenu', 2147483647, 1, 1, IFNULL(@iHomepageMenuOrder, 0) + 1);
+
+-- MENU: add to "add content" menu
+SET @iAddMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_add_content_links' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_add_content_links', 'bx_snipcart', 'create-snipcart-entry', '_bx_snipcart_menu_item_title_system_create_entry', '_bx_snipcart_menu_item_title_create_entry', 'page.php?i=create-snipcart-entry', '', '', 'shopping-cart col-green1', '', 2147483647, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
+
+-- 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_snipcart_view', '_bx_snipcart_menu_title_view_entry', 'bx_snipcart_view', 'bx_snipcart', 9, 0, 1, 'BxSnipcartMenuView', 'modules/boonex/snipcart/classes/BxSnipcartMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_snipcart_view', 'bx_snipcart', '_bx_snipcart_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_snipcart_view', 'bx_snipcart', 'edit-snipcart-entry', '_bx_snipcart_menu_item_title_system_edit_entry', '_bx_snipcart_menu_item_title_edit_entry', 'page.php?i=edit-snipcart-entry&id={content_id}', '', '', 'pencil', '', 2147483647, 1, 0, 1),
+('bx_snipcart_view', 'bx_snipcart', 'delete-snipcart-entry', '_bx_snipcart_menu_item_title_system_delete_entry', '_bx_snipcart_menu_item_title_delete_entry', 'page.php?i=delete-snipcart-entry&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 2);
+
+-- MENU: actions menu for my entries
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart_my', '_bx_snipcart_menu_title_entries_my', 'bx_snipcart_my', 'bx_snipcart', 9, 0, 1, 'BxSnipcartMenu', 'modules/boonex/snipcart/classes/BxSnipcartMenu.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_snipcart_my', 'bx_snipcart', '_bx_snipcart_menu_set_title_entries_my', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_snipcart_my', 'bx_snipcart', 'create-snipcart-entry', '_bx_snipcart_menu_item_title_system_create_entry', '_bx_snipcart_menu_item_title_create_entry', 'page.php?i=create-snipcart-entry', '', '', 'plus', '', 2147483647, 1, 0, 0);
+
+-- MENU: module sub-menu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart_submenu', '_bx_snipcart_menu_title_submenu', 'bx_snipcart_submenu', 'bx_snipcart', 8, 0, 1, '', '');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_snipcart_submenu', 'bx_snipcart', '_bx_snipcart_menu_set_title_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_snipcart_submenu', 'bx_snipcart', 'snipcart-home', '_bx_snipcart_menu_item_title_system_entries_public', '_bx_snipcart_menu_item_title_entries_public', 'page.php?i=snipcart-home', '', '', '', '', 2147483647, 1, 1, 1),
+('bx_snipcart_submenu', 'bx_snipcart', 'snipcart-popular', '_bx_snipcart_menu_item_title_system_entries_popular', '_bx_snipcart_menu_item_title_entries_popular', 'page.php?i=snipcart-popular', '', '', '', '', 2147483647, 1, 1, 2),
+('bx_snipcart_submenu', 'bx_snipcart', 'snipcart-manage', '_bx_snipcart_menu_item_title_system_entries_manage', '_bx_snipcart_menu_item_title_entries_manage', 'page.php?i=snipcart-manage', '', '', '', '', 2147483646, 1, 1, 3),
+('bx_snipcart_submenu', 'bx_snipcart', 'snipcart-settings', '_bx_snipcart_menu_item_title_system_settings', '_bx_snipcart_menu_item_title_settings', 'page.php?i=snipcart-settings', '', '', '', '', 2147483646, 1, 1, 4),
+('bx_snipcart_submenu', 'bx_snipcart', 'snipcart-dashboard', '_bx_snipcart_menu_item_title_system_dashboard', '_bx_snipcart_menu_item_title_dashboard', 'https://app.snipcart.com', '', '_blank', '', '', 2147483646, 1, 1, 5);
+
+-- 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_snipcart_view_submenu', '_bx_snipcart_menu_title_view_entry_submenu', 'bx_snipcart_view_submenu', 'bx_snipcart', 8, 0, 1, 'BxSnipcartMenuView', 'modules/boonex/snipcart/classes/BxSnipcartMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_snipcart_view_submenu', 'bx_snipcart', '_bx_snipcart_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_snipcart_view_submenu', 'bx_snipcart', 'view-snipcart-entry', '_bx_snipcart_menu_item_title_system_view_entry', '_bx_snipcart_menu_item_title_view_entry_submenu_entry', 'page.php?i=view-snipcart-entry&id={content_id}', '', '', '', '', 2147483647, 1, 0, 1),
+('bx_snipcart_view_submenu', 'bx_snipcart', 'view-snipcart-entry-comments', '_bx_snipcart_menu_item_title_system_view_entry_comments', '_bx_snipcart_menu_item_title_view_entry_submenu_comments', 'page.php?i=view-snipcart-entry-comments&id={content_id}', '', '', '', '', 2147483647, 1, 0, 2);
+
+-- MENU: profile stats
+SET @iNotifMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name` = 'sys_profile_stats' AND `active` = 1 LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('sys_profile_stats', 'bx_snipcart', 'profile-stats-manage-snipcart', '_bx_snipcart_menu_item_title_system_manage_my_entries', '_bx_snipcart_menu_item_title_manage_my_entries', 'page.php?i=snipcart-manage', '', '_self', 'shopping-cart col-green1', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:41:"get_menu_addon_manage_tools_profile_stats";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 1);
+
+-- MENU: manage tools submenu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart_menu_manage_tools', '_bx_snipcart_menu_title_manage_tools', 'bx_snipcart_menu_manage_tools', 'bx_snipcart', 6, 0, 1, 'BxSnipcartMenuManageTools', 'modules/boonex/snipcart/classes/BxSnipcartMenuManageTools.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_snipcart_menu_manage_tools', 'bx_snipcart', '_bx_snipcart_menu_set_title_manage_tools', 0);
+
+--INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+--('bx_snipcart_menu_manage_tools', 'bx_snipcart', 'delete-with-content', '_bx_snipcart_menu_item_title_system_delete_with_content', '_bx_snipcart_menu_item_title_delete_with_content', 'javascript:void(0)', 'javascript:{js_object}.onClickDeleteWithContent({content_id});', '_self', 'trash-o', '', 128, 1, 0, 0);
+
+-- MENU: dashboard manage tools
+SET @iManageMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard_manage_tools' LIMIT 1);
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_account_dashboard_manage_tools', 'bx_snipcart', 'snipcart-administration', '_bx_snipcart_menu_item_title_system_admt_entries', '_bx_snipcart_menu_item_title_admt_entries', 'page.php?i=snipcart-administration', '', '_self', '', 'a:2:{s:6:"module";s:11:"bx_snipcart";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, @iManageMenuOrder + 1);
+
+-- MENU: add menu item to profiles modules (trigger* menu sets are processed separately upon modules enable/disable)
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('trigger_profile_view_submenu', 'bx_snipcart', 'snipcart-author', '_bx_snipcart_menu_item_title_system_view_entries_author', '_bx_snipcart_menu_item_title_view_entries_author', 'page.php?i=snipcart-author&profile_id={profile_id}', '', '', 'shopping-cart col-green1', '', 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_snipcart_allow_view_to', 'bx_snipcart', 'view', '_bx_snipcart_form_entry_input_allow_view_to', '3', 'bx_snipcart_entries', 'id', 'author', '', '');
+
+
+-- ACL
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_snipcart', 'create entry', NULL, '_bx_snipcart_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_snipcart', 'delete entry', NULL, '_bx_snipcart_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_snipcart', 'view entry', NULL, '_bx_snipcart_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_snipcart', 'set thumb', NULL, '_bx_snipcart_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_snipcart', 'edit any entry', NULL, '_bx_snipcart_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_snipcart', '_bx_snipcart', @iSearchOrder + 1, 'BxSnipcartSearchResult', 'modules/boonex/snipcart/classes/BxSnipcartSearchResult.php'),
+('bx_snipcart_cmts', '_bx_snipcart_cmts', @iSearchOrder + 2, 'BxSnipcartCmtsSearchResult', 'modules/boonex/snipcart/classes/BxSnipcartCmtsSearchResult.php');
+
+
+-- METATAGS
+INSERT INTO `sys_objects_metatags` (`object`, `table_keywords`, `table_locations`, `table_mentions`, `override_class_name`, `override_class_file`) VALUES
+('bx_snipcart', 'bx_snipcart_meta_keywords', 'bx_snipcart_meta_locations', '', '', '');
+
+
+-- 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_snipcart_cats', 'bx_snipcart', 'bx_snipcart', 'bx_snipcart_cats', 'bx_snipcart_entries', 'cat', 'INNER JOIN `sys_profiles` ON (`sys_profiles`.`id` = `bx_snipcart_entries`.`author`)', 'AND `sys_profiles`.`status` = ''active''', '', '');
+
+
+-- 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_snipcart_administration', 'Sql', 'SELECT * FROM `bx_snipcart_entries` WHERE 1 ', 'bx_snipcart_entries', 'id', 'added', 'status_admin', '', 20, NULL, 'start', '', 'title,text', '', 'like', '', '', 192, 'BxSnipcartGridAdministration', 'modules/boonex/snipcart/classes/BxSnipcartGridAdministration.php'),
+('bx_snipcart_common', 'Sql', 'SELECT * FROM `bx_snipcart_entries` WHERE 1 ', 'bx_snipcart_entries', 'id', 'added', 'status', '', 20, NULL, 'start', '', 'title,text', '', 'like', '', '', 2147483647, 'BxSnipcartGridCommon', 'modules/boonex/snipcart/classes/BxSnipcartGridCommon.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_snipcart_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_snipcart_administration', 'switcher', '_bx_snipcart_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('bx_snipcart_administration', 'title', '_bx_snipcart_grid_column_title_adm_title', '25%', 0, '', '', 3),
+('bx_snipcart_administration', 'added', '_bx_snipcart_grid_column_title_adm_added', '20%', 1, '25', '', 4),
+('bx_snipcart_administration', 'author', '_bx_snipcart_grid_column_title_adm_author', '25%', 0, '25', '', 5),
+('bx_snipcart_administration', 'actions', '', '20%', 0, '', '', 6),
+
+('bx_snipcart_common', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_snipcart_common', 'switcher', '_bx_snipcart_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('bx_snipcart_common', 'title', '_bx_snipcart_grid_column_title_adm_title', '40%', 0, '', '', 3),
+('bx_snipcart_common', 'added', '_bx_snipcart_grid_column_title_adm_added', '30%', 1, '25', '', 4),
+('bx_snipcart_common', 'actions', '', '20%', 0, '', '', 5);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_snipcart_administration', 'bulk', 'delete', '_bx_snipcart_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_snipcart_administration', 'single', 'edit', '_bx_snipcart_grid_action_title_adm_edit', 'pencil', 1, 0, 1),
+('bx_snipcart_administration', 'single', 'delete', '_bx_snipcart_grid_action_title_adm_delete', 'remove', 1, 1, 2),
+('bx_snipcart_administration', 'single', 'settings', '_bx_snipcart_grid_action_title_adm_more_actions', 'cog', 1, 0, 3),
+
+('bx_snipcart_common', 'bulk', 'delete', '_bx_snipcart_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_snipcart_common', 'single', 'edit', '_bx_snipcart_grid_action_title_adm_edit', 'pencil', 1, 0, 1),
+('bx_snipcart_common', 'single', 'delete', '_bx_snipcart_grid_action_title_adm_delete', 'remove', 1, 1, 2),
+('bx_snipcart_common', 'single', 'settings', '_bx_snipcart_grid_action_title_adm_more_actions', 'cog', 1, 0, 3);
+
+
+-- ALERTS
+INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
+('bx_snipcart', 'BxSnipcartAlertsResponse', 'modules/boonex/snipcart/classes/BxSnipcartAlertsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('system', 'save_setting', @iHandler),
+('profile', 'delete', @iHandler);

+ 324 - 0
modules/boonex/snipcart/install/sql/install.sql

@@ -0,0 +1,324 @@
+SET @sStorageEngine = (SELECT `value` FROM `sys_options` WHERE `name` = 'sys_storage_default');
+
+
+-- TABLE: entries
+CREATE TABLE IF NOT EXISTS `bx_snipcart_entries` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `author` int(10) unsigned NOT NULL,
+  `added` int(11) NOT NULL,
+  `changed` int(11) NOT NULL,
+  `thumb` int(11) NOT NULL,
+  `title` varchar(255) NOT NULL,
+  `cat` int(11) NOT NULL,
+  `text` text NOT NULL,
+  `price` float NOT NULL default '0',
+  `weight` float NOT NULL default '0',
+  `views` int(11) NOT NULL default '0',
+  `rate` float NOT NULL default '0',
+  `votes` int(11) NOT NULL default '0',
+  `favorites` int(11) NOT NULL default '0',
+  `comments` int(11) NOT NULL default '0',
+  `reports` int(11) NOT NULL default '0',
+  `featured` int(11) NOT NULL default '0',
+  `allow_view_to` int(11) NOT NULL DEFAULT '3',
+  `status` enum('active','hidden') NOT NULL DEFAULT 'active',
+  `status_admin` enum('active','hidden') NOT NULL DEFAULT 'active',
+  PRIMARY KEY (`id`),
+  FULLTEXT KEY `title_text` (`title`,`text`)
+);
+
+-- TABLE: settings
+CREATE TABLE IF NOT EXISTS `bx_snipcart_settings` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `author` int(10) unsigned NOT NULL,
+  `mode` varchar(8) NOT NULL DEFAULT '',
+  `api_key_test` varchar(255) NOT NULL,
+  `api_key_live` varchar(255) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `author` (`author`)
+);
+
+-- TABLE: storages & transcoders
+CREATE TABLE IF NOT EXISTS `bx_snipcart_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` int(11) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_snipcart_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` int(11) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+-- TABLE: comments
+CREATE TABLE IF NOT EXISTS `bx_snipcart_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(10) unsigned 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_snipcart_votes` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `bx_snipcart_votes_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: views
+CREATE TABLE `bx_snipcart_views_track` (
+  `object_id` int(11) NOT NULL default '0',
+  `viewer_id` int(11) NOT NULL default '0',
+  `viewer_nip` int(11) unsigned NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  KEY `id` (`object_id`,`viewer_id`,`viewer_nip`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: metas
+CREATE TABLE `bx_snipcart_meta_keywords` (
+  `object_id` int(10) unsigned NOT NULL,
+  `keyword` varchar(255) NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `keyword` (`keyword`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE `bx_snipcart_meta_locations` (
+  `object_id` int(10) unsigned NOT NULL,
+  `lat` double NOT NULL,
+  `lng` double NOT NULL,
+  `country` varchar(2) NOT NULL,
+  `state` varchar(255) NOT NULL,
+  `city` varchar(255) NOT NULL,
+  `zip` varchar(255) NOT NULL,
+  `street` varchar(255) NOT NULL,
+  `street_number` varchar(255) NOT NULL,
+  PRIMARY KEY (`object_id`),
+  KEY `country_state_city` (`country`,`state`(8),`city`(8))
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: reports
+CREATE TABLE IF NOT EXISTS `bx_snipcart_reports` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `bx_snipcart_reports_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `type` varchar(32) NOT NULL default '',
+  `text` text NOT NULL default '',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `report` (`object_id`, `author_nip`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: favorites
+CREATE TABLE `bx_snipcart_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`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+
+-- STORAGES & TRANSCODERS
+INSERT INTO `sys_objects_storage` (`object`, `engine`, `params`, `token_life`, `cache_control`, `levels`, `table_files`, `ext_mode`, `ext_allow`, `ext_deny`, `quota_size`, `current_size`, `quota_number`, `current_number`, `max_file_size`, `ts`) VALUES
+('bx_snipcart_files', @sStorageEngine, '', 360, 2592000, 3, 'bx_snipcart_files', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('bx_snipcart_photos_resized', @sStorageEngine, '', 360, 2592000, 3, 'bx_snipcart_photos_resized', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0);
+
+INSERT INTO `sys_objects_transcoder` (`object`, `storage_object`, `source_type`, `source_params`, `private`, `atime_tracking`, `atime_pruning`, `ts`) VALUES 
+('bx_snipcart_preview', 'bx_snipcart_photos_resized', 'Storage', 'a:1:{s:6:"object";s:17:"bx_snipcart_files";}', 'no', '1', '2592000', '0'),
+('bx_snipcart_gallery', 'bx_snipcart_photos_resized', 'Storage', 'a:1:{s:6:"object";s:17:"bx_snipcart_files";}', 'no', '1', '2592000', '0');
+
+INSERT INTO `sys_transcoder_filters` (`transcoder_object`, `filter`, `filter_params`, `order`) VALUES 
+('bx_snipcart_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_snipcart_gallery', 'Resize', 'a:1:{s:1:"w";s:3:"500";}', '0');
+
+-- FORMS
+INSERT INTO `sys_objects_form`(`object`, `module`, `title`, `action`, `form_attrs`, `table`, `key`, `uri`, `uri_title`, `submit_name`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_snipcart', 'bx_snipcart', '_bx_snipcart_form_entry', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', 'bx_snipcart_entries', 'id', '', '', 'do_submit', '', 0, 1, 'BxSnipcartFormEntry', 'modules/boonex/snipcart/classes/BxSnipcartFormEntry.php'),
+('bx_snipcart_settings', 'bx_snipcart', '_bx_snipcart_form_settings', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', 'bx_snipcart_settings', 'id', '', '', 'do_submit', '', 0, 1, 'BxSnipcartFormSettings', 'modules/boonex/snipcart/classes/BxSnipcartFormSettings.php');
+
+INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`, `title`) VALUES 
+('bx_snipcart', 'bx_snipcart_entry_add', 'bx_snipcart', 0, '_bx_snipcart_form_entry_display_add'),
+('bx_snipcart', 'bx_snipcart_entry_delete', 'bx_snipcart', 0, '_bx_snipcart_form_entry_display_delete'),
+('bx_snipcart', 'bx_snipcart_entry_edit', 'bx_snipcart', 0, '_bx_snipcart_form_entry_display_edit'),
+('bx_snipcart', 'bx_snipcart_entry_view', 'bx_snipcart', 1, '_bx_snipcart_form_entry_display_view'),
+
+('bx_snipcart_settings', 'bx_snipcart_settings_edit', 'bx_snipcart', 0, '_bx_snipcart_form_settings_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_snipcart', 'bx_snipcart', 'allow_view_to', '', '', 0, 'custom', '_bx_snipcart_form_entry_input_sys_allow_view_to', '_bx_snipcart_form_entry_input_allow_view_to', '', 1, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_snipcart', 'bx_snipcart', 'delete_confirm', 1, '', 0, 'checkbox', '_bx_snipcart_form_entry_input_sys_delete_confirm', '_bx_snipcart_form_entry_input_delete_confirm', '_bx_snipcart_form_entry_input_delete_confirm_info', 1, 0, 0, '', '', '', 'Avail', '', '_bx_snipcart_form_entry_input_delete_confirm_error', '', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'do_publish', '_bx_snipcart_form_entry_input_do_publish', '', 0, 'submit', '_bx_snipcart_form_entry_input_sys_do_publish', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'do_submit', '_bx_snipcart_form_entry_input_do_submit', '', 0, 'submit', '_bx_snipcart_form_entry_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'location', '', '', 0, 'location', '_sys_form_input_sys_location', '_sys_form_input_location', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'pictures', 'a:1:{i:0;s:9:"sys_html5";}', 'a:2:{s:10:"sys_simple";s:26:"_sys_uploader_simple_title";s:9:"sys_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_snipcart_form_entry_input_sys_pictures', '_bx_snipcart_form_entry_input_pictures', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'text', '', '', 0, 'textarea', '_bx_snipcart_form_entry_input_sys_text', '_bx_snipcart_form_entry_input_text', '', 1, 0, 2, '', '', '', 'Avail', '', '_bx_snipcart_form_entry_input_text_err', 'XssHtml', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'title', '', '', 0, 'text', '_bx_snipcart_form_entry_input_sys_title', '_bx_snipcart_form_entry_input_title', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_snipcart_form_entry_input_title_err', 'Xss', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'cat', '', '#!bx_snipcart_cats', 0, 'select', '_bx_snipcart_form_entry_input_sys_cat', '_bx_snipcart_form_entry_input_cat', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_snipcart_form_entry_input_cat_err', 'Xss', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'price', '', '', 0, 'text', '_bx_snipcart_form_entry_input_sys_price', '_bx_snipcart_form_entry_input_price', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_snipcart_form_entry_input_price_err', 'Float', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'weight', '', '', 0, 'text', '_bx_snipcart_form_entry_input_sys_weight', '_bx_snipcart_form_entry_input_weight', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_snipcart_form_entry_input_weight_err', 'Float', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'added', '', '', 0, 'datetime', '_bx_snipcart_form_entry_input_sys_date_added', '_bx_snipcart_form_entry_input_date_added', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_snipcart', 'bx_snipcart', 'changed', '', '', 0, 'datetime', '_bx_snipcart_form_entry_input_sys_date_changed', '_bx_snipcart_form_entry_input_date_changed', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+
+('bx_snipcart_settings', 'bx_snipcart', 'mode', '', '#!bx_snipcart_modes', 0, 'select', '_bx_snipcart_form_settings_input_sys_mode', '_bx_snipcart_form_settings_input_mode', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_snipcart_form_settings_input_mode_err', 'Xss', '', 0, 0),
+('bx_snipcart_settings', 'bx_snipcart', 'api_key_test', '', '', 0, 'text', '_bx_snipcart_form_settings_input_sys_api_key_test', '_bx_snipcart_form_settings_input_api_key_test', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
+('bx_snipcart_settings', 'bx_snipcart', 'api_key_live', '', '', 0, 'text', '_bx_snipcart_form_settings_input_sys_api_key_live', '_bx_snipcart_form_settings_input_api_key_live', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
+('bx_snipcart_settings', 'bx_snipcart', 'do_submit', '_bx_snipcart_form_settings_input_do_submit', '', 0, 'submit', '_bx_snipcart_form_settings_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0);
+
+INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES 
+('bx_snipcart_entry_add', 'title', 2147483647, 1, 1),
+('bx_snipcart_entry_add', 'cat', 2147483647, 1, 2),
+('bx_snipcart_entry_add', 'text', 2147483647, 1, 3),
+('bx_snipcart_entry_add', 'price', 2147483647, 1, 4),
+('bx_snipcart_entry_add', 'weight', 2147483647, 1, 5),
+('bx_snipcart_entry_add', 'pictures', 2147483647, 1, 6),
+('bx_snipcart_entry_add', 'allow_view_to', 2147483647, 1, 7),
+('bx_snipcart_entry_add', 'location', 2147483647, 1, 8),
+('bx_snipcart_entry_add', 'do_publish', 2147483647, 1, 9),
+
+('bx_snipcart_entry_delete', 'delete_confirm', 2147483647, 1, 1),
+('bx_snipcart_entry_delete', 'do_submit', 2147483647, 1, 2),
+
+('bx_snipcart_entry_edit', 'title', 2147483647, 1, 1),
+('bx_snipcart_entry_edit', 'cat', 2147483647, 1, 2),
+('bx_snipcart_entry_edit', 'text', 2147483647, 1, 3),
+('bx_snipcart_entry_edit', 'price', 2147483647, 1, 4),
+('bx_snipcart_entry_edit', 'weight', 2147483647, 1, 5),
+('bx_snipcart_entry_edit', 'pictures', 2147483647, 1, 6),
+('bx_snipcart_entry_edit', 'allow_view_to', 2147483647, 1, 7),
+('bx_snipcart_entry_edit', 'location', 2147483647, 1, 8),
+('bx_snipcart_entry_edit', 'do_submit', 2147483647, 1, 9),
+
+('bx_snipcart_entry_view', 'cat', 2147483647, 1, 1),
+('bx_snipcart_entry_view', 'weight', 2147483647, 1, 2),
+('bx_snipcart_entry_view', 'added', 2147483647, 1, 3),
+('bx_snipcart_entry_view', 'changed', 2147483647, 1, 4),
+
+('bx_snipcart_entry_view_full', 'cat', 2147483647, 1, 1),
+('bx_snipcart_entry_view_full', 'text', 2147483647, 1, 2),
+('bx_snipcart_entry_view_full', 'weight', 2147483647, 1, 3),
+('bx_snipcart_entry_view_full', 'added', 2147483647, 1, 4),
+('bx_snipcart_entry_view_full', 'changed', 2147483647, 1, 5),
+
+('bx_snipcart_settings_edit', 'mode', 2147483647, 1, 1),
+('bx_snipcart_settings_edit', 'api_key_test', 2147483647, 1, 2),
+('bx_snipcart_settings_edit', 'api_key_live', 2147483647, 1, 3),
+('bx_snipcart_settings_edit', 'do_submit', 2147483647, 1, 4);
+
+
+-- PRE-VALUES
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`, `extendable`) VALUES
+('bx_snipcart_cats', '_bx_snipcart_pre_lists_cats', 'bx_snipcart', '0', '1'),
+('bx_snipcart_modes', '_bx_snipcart_pre_lists_modes', 'bx_snipcart', '0', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_snipcart_cats', '', 0, '_sys_please_select', ''),
+('bx_snipcart_cats', '1', 1, '_bx_snipcart_cat_adult', ''),
+('bx_snipcart_cats', '2', 2, '_bx_snipcart_cat_communication', ''),
+('bx_snipcart_cats', '3', 3, '_bx_snipcart_cat_conversion', ''),
+('bx_snipcart_cats', '4', 4, '_bx_snipcart_cat_documentation', ''),
+('bx_snipcart_cats', '5', 5, '_bx_snipcart_cat_games', ''),
+('bx_snipcart_cats', '7', 6, '_bx_snipcart_cat_mobile', ''),
+('bx_snipcart_cats', '8', 7, '_bx_snipcart_cat_multimedia', ''),
+('bx_snipcart_cats', '9', 8, '_bx_snipcart_cat_music', ''),
+('bx_snipcart_cats', '9', 9, '_bx_snipcart_cat_navigation', ''),
+('bx_snipcart_cats', '10', 10, '_bx_snipcart_cat_other', ''),
+('bx_snipcart_cats', '11', 11, '_bx_snipcart_cat_photography', ''),
+('bx_snipcart_cats', '12', 12, '_bx_snipcart_cat_security', ''),
+('bx_snipcart_cats', '13', 13, '_bx_snipcart_cat_tools', ''),
+
+('bx_snipcart_modes', '', 0, '_sys_please_select', ''),
+('bx_snipcart_modes', 'test', 1, '_bx_snipcart_mode_test', ''),
+('bx_snipcart_modes', 'live', 2, '_bx_snipcart_mode_live', '');
+
+
+-- COMMENTS
+INSERT INTO `sys_objects_cmts` (`Name`, `Table`, `CharsPostMin`, `CharsPostMax`, `CharsDisplayMax`, `Nl2br`, `PerView`, `PerViewReplies`, `BrowseType`, `IsBrowseSwitch`, `PostFormPosition`, `NumberOfLevels`, `IsDisplaySwitch`, `IsRatable`, `ViewingThreshold`, `IsOn`, `RootStylePrefix`, `BaseUrl`, `ObjectVote`, `TriggerTable`, `TriggerFieldId`, `TriggerFieldAuthor`, `TriggerFieldTitle`, `TriggerFieldComments`, `ClassName`, `ClassFile`) VALUES
+('bx_snipcart', 'bx_snipcart_cmts', 1, 5000, 1000, 1, 5, 3, 'tail', 1, 'bottom', 1, 1, 1, -3, 1, 'cmt', 'page.php?i=view-snipcart-entry&id={object_id}', '', 'bx_snipcart_entries', '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_snipcart', 'bx_snipcart_votes', 'bx_snipcart_votes_track', '604800', '1', '1', '0', '1', 'bx_snipcart_entries', 'id', 'author', 'rate', 'votes', '', '');
+
+
+-- REPORTS
+INSERT INTO `sys_objects_report` (`name`, `table_main`, `table_track`, `is_on`, `base_url`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_snipcart', 'bx_snipcart_reports', 'bx_snipcart_reports_track', '1', 'page.php?i=view-snipcart-entry&id={object_id}', 'bx_snipcart_entries', '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_snipcart', 'bx_snipcart_views_track', '86400', '1', 'bx_snipcart_entries', '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_snipcart', 'bx_snipcart_favorites_track', '1', '1', '1', 'page.php?i=view-snipcart-entry&id={object_id}', 'bx_snipcart_entries', '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_snipcart', '1', '1', 'page.php?i=view-snipcart-entry&id={object_id}', 'bx_snipcart_entries', 'id', 'author', 'featured', '', '');
+
+
+-- STUDIO: page & widget
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, 'bx_snipcart', '_bx_snipcart', '_bx_snipcart', 'bx_snipcart@modules/boonex/snipcart/|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_snipcart', '{url_studio}module.php?name=bx_snipcart', '', 'bx_snipcart@modules/boonex/snipcart/|std-icon.svg', '_bx_snipcart', '', '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));

+ 54 - 0
modules/boonex/snipcart/install/sql/uninstall.sql

@@ -0,0 +1,54 @@
+
+-- TABLES
+DROP TABLE IF EXISTS `bx_snipcart_entries`, `bx_snipcart_settings`, `bx_snipcart_files`, `bx_snipcart_photos_resized`, `bx_snipcart_cmts`, `bx_snipcart_votes`, `bx_snipcart_votes_track`, `bx_snipcart_views_track`, `bx_snipcart_meta_keywords`, `bx_snipcart_meta_locations`, `bx_snipcart_reports`, `bx_snipcart_reports_track`, `bx_snipcart_favorites_track`;
+
+
+-- STORAGES & TRANSCODERS
+DELETE FROM `sys_objects_storage` WHERE `object` = 'bx_snipcart_files' OR `object` = 'bx_snipcart_photos_resized';
+DELETE FROM `sys_storage_tokens` WHERE `object` = 'bx_snipcart_files' OR `object` = 'bx_snipcart_photos_resized';
+
+DELETE FROM `sys_objects_transcoder` WHERE `object` IN('bx_snipcart_preview', 'bx_snipcart_gallery');
+DELETE FROM `sys_transcoder_filters` WHERE `transcoder_object` IN('bx_snipcart_preview', 'bx_snipcart_gallery');
+DELETE FROM `sys_transcoder_images_files` WHERE `transcoder_object` IN('bx_snipcart_preview', 'bx_snipcart_gallery');
+
+
+-- FORMS
+DELETE FROM `sys_objects_form` WHERE `module` = 'bx_snipcart';
+DELETE FROM `sys_form_displays` WHERE `module` = 'bx_snipcart';
+DELETE FROM `sys_form_inputs` WHERE `module` = 'bx_snipcart';
+DELETE FROM `sys_form_display_inputs` WHERE `display_name` IN ('bx_snipcart_entry_add', 'bx_snipcart_entry_edit', 'bx_snipcart_entry_view', 'bx_snipcart_entry_view_full', 'bx_snipcart_entry_delete', 'bx_snipcart_settings_edit');
+
+
+-- PRE-VALUES
+DELETE FROM `sys_form_pre_lists` WHERE `module` = 'bx_snipcart';
+DELETE FROM `sys_form_pre_values` WHERE `Key` IN('bx_snipcart_cats', 'bx_snipcart_modes');
+
+
+-- COMMENTS
+DELETE FROM `sys_objects_cmts` WHERE `Name` = 'bx_snipcart';
+
+
+-- VOTES
+DELETE FROM `sys_objects_vote` WHERE `Name` = 'bx_snipcart';
+
+
+-- REPORTS
+DELETE FROM `sys_objects_report` WHERE `name` = 'bx_snipcart';
+
+
+-- VIEWS
+DELETE FROM `sys_objects_view` WHERE `name` = 'bx_snipcart';
+
+
+-- FAFORITES
+DELETE FROM `sys_objects_favorite` WHERE `name` = 'bx_snipcart';
+
+
+-- FEATURED
+DELETE FROM `sys_objects_feature` WHERE `name` = 'bx_snipcart';
+
+
+-- 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_snipcart';

+ 51 - 0
modules/boonex/snipcart/js/manage_tools.js

@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Snipcart Snipcart
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+function BxSnipcartManageTools(oOptions) {
+	this._sActionsUrl = oOptions.sActionUrl;
+	this._sObjNameGrid = oOptions.sObjNameGrid;
+    this._sObjName = oOptions.sObjName == undefined ? 'oBxSnipcartManageTools' : 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;
+}
+
+BxSnipcartManageTools.prototype.onChangeFilter = function(oFilter) {
+	var oFilter1 = $('#bx-grid-filter1-' + this._sObjNameGrid);
+	var sValueFilter1 = oFilter1.length > 0 ? oFilter1.val() : '';
+
+	var oSearch = $('#bx-grid-search-' + this._sObjNameGrid);
+	var sValueSearch = oSearch.length > 0 ? oSearch.val() : '';
+	if(sValueSearch == _t('_sys_grid_search'))
+		sValueSearch = '';
+
+	glGrids[this._sObjNameGrid].setFilter(sValueFilter1 + this._sParamsDivider + sValueSearch, true);
+};
+
+BxSnipcartManageTools.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')
+	});
+};
+
+BxSnipcartManageTools.prototype.onClickDelete = function(iContentId) {
+	$('.bx-popup-applied:visible').dolPopupHide();
+
+	glGrids[this._sObjNameGrid].actionWithId(iContentId, 'delete', {}, '', false, 1);
+};
+
+/** @} */

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

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

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

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

+ 3 - 0
modules/boonex/snipcart/template/author.html

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

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

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

+ 3 - 0
modules/boonex/snipcart/template/css/forms.css

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

+ 9 - 0
modules/boonex/snipcart/template/css/main.css

@@ -0,0 +1,9 @@
+@import url(../../../../base/text/template/css/main.css);
+
+
+.bx_snipcart_cover .bx-cover-actions .bx-menu-btns-hor,
+.bx_snipcart_cover .bx-cover-actions .bx-btn.snipcart-add-item {
+	display: inline-block;
+	float: none;
+	vertical-align: top;
+}

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

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

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

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

+ 3 - 0
modules/boonex/snipcart/template/entry-location.html

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

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

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

+ 3 - 0
modules/boonex/snipcart/template/entry-text.html

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

+ 3 - 0
modules/boonex/snipcart/template/form_ghost_template.html

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

+ 57 - 0
modules/boonex/snipcart/template/images/icons/std-icon.svg

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="600px" height="600px" viewBox="0 0 600 600" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 40.3 (33839) - http://www.bohemiancoding.com/sketch -->
+    <title>Group 2 Copy 29</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#FFFFFF" stop-opacity="0.2" offset="0%"></stop>
+            <stop stop-color="#000000" stop-opacity="0.138870018" offset="100%"></stop>
+        </linearGradient>
+        <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
+            <stop stop-color="#FFFFFF" offset="0%"></stop>
+            <stop stop-color="#F6F6F6" offset="35.2427758%"></stop>
+            <stop stop-color="#E5E5E5" offset="100%"></stop>
+        </linearGradient>
+        <path d="M0,0.192307692 L0,40.1923077 L40,40.1923077 L112.002885,186.040385 L81.8990385,235.034615 C78.9009615,240.034615 76.8990385,247.036538 76.8990385,254.039423 C76.8990385,280.818269 95.1923077,294.039423 120,294.039423 L353.846154,294.039423 L353.846154,255.577885 L124.897115,255.577885 C121.899038,255.577885 119.897115,253.575962 119.897115,250.577885 C119.897115,249.581731 122.019231,245.577885 122.019231,245.577885 L142.001923,214.039423 L290.996154,214.039423 C305.997115,214.039423 319.003846,206.042308 325.996154,193.043269 L397.998077,69.1971154 C399.1875,66.8307692 400,63.1913462 400,59.1980769 C400,48.1923077 390.996154,40.1932692 380,40.1932692 L84.0038462,40.1932692 L65,0.192307692 L0,0.192307692 L0,0.192307692 Z" id="path-3"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-4">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M313.845192,314.038462 C291.843269,314.038462 273.845192,332.036538 273.845192,354.039423 C273.845192,376.041346 291.843269,394.039423 313.845192,394.039423 C335.847115,394.039423 353.846154,376.040385 353.846154,354.038462 C353.846154,332.035577 335.847115,314.038462 313.845192,314.038462 L313.845192,314.038462 Z" id="path-5"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-6">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M116.923077,314.038462 C94.9211538,314.038462 76.9230769,332.036538 76.9230769,354.039423 C76.9230769,376.041346 94.9211538,394.039423 116.923077,394.039423 C138.925,394.039423 156.924038,376.041346 156.924038,354.039423 C156.923077,332.035577 138.924038,314.038462 116.923077,314.038462 L116.923077,314.038462 Z" id="path-7"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-8">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Group-2-Copy-29">
+            <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 L552.268958,552.268958 Z" id="path" fill="#2BAF92"></path>
+            <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 L552.268958,552.268958 Z" id="path-copy" fill="url(#linearGradient-1)"></path>
+            <g id="android-cart" transform="translate(100.000000, 115.000000)">
+                <g id="Layer_1">
+                    <g id="Shape">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
+                        <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-3"></use>
+                    </g>
+                    <g id="Path" opacity="0.5">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
+                        <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-5"></use>
+                    </g>
+                    <g id="Path" opacity="0.5">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
+                        <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-7"></use>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 3 - 0
modules/boonex/snipcart/template/sct_button.html

@@ -0,0 +1,3 @@
+<button class="bx-btn snipcart-add-item bx-def-margin-thd-topbottom bx-def-margin-right" style="display:inline-block; float:none" <bx_repeat:items>data-item-__key__="__value__"</bx_repeat:items>>
+    <bx_text:_bx_snipcart_menu_item_title_buy />
+</button>

+ 2 - 0
modules/boonex/snipcart/template/sct_include.html

@@ -0,0 +1,2 @@
+<script src="https://cdn.snipcart.com/scripts/2.0/snipcart.js" data-api-key="__key__" id="snipcart"></script>
+<link href="https://cdn.snipcart.com/themes/2.0/base/snipcart.min.css" rel="stylesheet" type="text/css" />

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

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

+ 3 - 0
modules/boonex/snipcart/template/unit.html

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

+ 1 - 0
modules/boonex/snipcart/template/unit_full.html

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

+ 3 - 0
modules/boonex/snipcart/template/unit_full_private.html

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

+ 1 - 0
modules/boonex/snipcart/template/unit_gallery.html

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

+ 3 - 0
modules/boonex/snipcart/template/unit_gallery_private.html

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

+ 3 - 0
modules/boonex/snipcart/template/unit_live_search.html

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

+ 3 - 0
modules/boonex/snipcart/template/unit_private.html

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