Disable admin notices individually - Version 1.1.3

Version Description

(01.07.2020) = * Removed: Ads notices and dashboard widget * Fixed: Minor bugs

Download this release

Release Info

Developer alexkovalevv
Plugin Icon 128x128 Disable admin notices individually
Version 1.1.3
Comparing to
See all releases

Code changes from version 1.1.1 to 1.1.3

Files changed (143) hide show
  1. admin/boot.php +55 -29
  2. admin/options.php +2 -2
  3. admin/pages/class-pages-more-features.php +1 -1
  4. admin/pages/class-pages-notices.php +4 -4
  5. clearfy.php +2 -1
  6. disable-admin-notices.php +41 -43
  7. includes/class-plugin.php +4 -4
  8. includes/classes/class-configurate-notices.php +170 -161
  9. libs/factory/adverts/boot.php +14 -14
  10. libs/factory/adverts/includes/class-base.php +6 -6
  11. libs/factory/adverts/includes/class-dashboard-widget.php +4 -4
  12. libs/factory/adverts/includes/class-rest-request.php +65 -45
  13. libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.mo → wbcr_factory_adverts_109-ru_RU.mo} +0 -0
  14. libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.po → wbcr_factory_adverts_109-ru_RU.po} +0 -0
  15. libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css +1 -1
  16. libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css +1 -1
  17. libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css +1 -1
  18. libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css +2 -2
  19. libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css +1 -1
  20. libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css +1 -1
  21. libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css +1 -1
  22. libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css +1 -1
  23. libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css +1 -1
  24. libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css +1 -1
  25. libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css +1 -1
  26. libs/factory/bootstrap/assets/css-min/control.checkbox.min.css +1 -1
  27. libs/factory/bootstrap/assets/css-min/control.dropdown.min.css +1 -1
  28. libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css +1 -1
  29. libs/factory/bootstrap/assets/css-min/holder.more-link.min.css +1 -1
  30. libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js +1 -1
  31. libs/factory/bootstrap/assets/js-min/control.checkbox.min.js +1 -1
  32. libs/factory/bootstrap/assets/js-min/control.dropdown.min.js +1 -1
  33. libs/factory/bootstrap/assets/js-min/control.list.min.js +1 -1
  34. libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js +1 -1
  35. libs/factory/bootstrap/boot.php +15 -15
  36. libs/factory/bootstrap/includes/functions.php +13 -63
  37. libs/factory/clearfy/assets/css/clearfy-base.css +24 -24
  38. libs/factory/clearfy/assets/css/clearfy-base.css.map +1 -0
  39. libs/factory/clearfy/assets/css/libs/autocomplete.css +44 -0
  40. libs/factory/clearfy/assets/css/libs/autocomplete.css.map +1 -0
  41. libs/factory/clearfy/assets/css/libs/autocomplete.less +57 -0
  42. libs/factory/clearfy/assets/js/globals.js +15 -15
  43. libs/factory/clearfy/assets/js/libs/jquery.autocomplete.min.js +8 -0
  44. libs/factory/clearfy/assets/js/license-manager.js +14 -18
  45. libs/factory/clearfy/assets/js/search-options.js +40 -0
  46. libs/factory/clearfy/boot.php +50 -19
  47. libs/factory/clearfy/includes/ajax-handlers.php +22 -13
  48. libs/factory/clearfy/includes/class-configurate.php +3 -3
  49. libs/factory/clearfy/includes/class-helpers.php +1 -97
  50. libs/factory/clearfy/includes/class-search-options.php +87 -0
  51. libs/factory/clearfy/langs/{wbcr_factory_clearfy_212-ru_RU.mo → wbcr_factory_clearfy_221-ru_RU.mo} +0 -0
  52. libs/factory/clearfy/langs/{wbcr_factory_clearfy_212-ru_RU.po → wbcr_factory_clearfy_221-ru_RU.po} +0 -0
  53. libs/factory/clearfy/pages/class-page-license.php +207 -154
  54. libs/factory/clearfy/pages/class-page-more-features.php +23 -23
  55. libs/factory/clearfy/pages/class-pages.php +227 -182
  56. libs/factory/core/boot.php +28 -28
  57. libs/factory/core/includes/activation/class-factory-activator.php +3 -3
  58. libs/factory/core/includes/activation/class-factory-update.php +3 -3
  59. libs/factory/core/includes/assets-managment/class-factory-assets-list.php +4 -4
  60. libs/factory/core/includes/assets-managment/class-factory-script-list.php +4 -3
  61. libs/factory/core/includes/assets-managment/class-factory-style-list.php +1 -1
  62. libs/factory/core/includes/class-check-compatibility.php +3 -3
  63. libs/factory/core/includes/class-factory-migrations.php +13 -13
  64. libs/factory/core/includes/class-factory-notices.php +91 -86
  65. libs/factory/core/includes/class-factory-options.php +2 -2
  66. libs/factory/core/includes/class-factory-plugin-abstract.php +241 -184
  67. libs/factory/core/includes/class-factory-plugin-base.php +84 -30
  68. libs/factory/core/includes/class-factory-requests.php +1 -1
  69. libs/factory/core/includes/class-factory-requirements.php +16 -15
  70. libs/factory/core/includes/entities/class-factory-paths.php +1 -1
  71. libs/factory/core/includes/entities/class-factory-support.php +1 -1
  72. libs/factory/core/includes/functions.php +7 -7
  73. libs/factory/core/includes/premium/class-factory-license-interface.php +1 -1
  74. libs/factory/core/includes/premium/class-factory-manager.php +8 -8
  75. libs/factory/core/includes/premium/class-factory-provider-abstract.php +123 -75
  76. libs/factory/core/includes/updates/class-factory-premium-upgrader.php +347 -308
  77. libs/factory/core/includes/updates/class-factory-upgrader.php +8 -8
  78. libs/factory/core/includes/updates/repositories/class-factory-repository-abstract.php +5 -5
  79. libs/factory/core/includes/updates/repositories/class-factory-wordpress.php +4 -4
  80. libs/factory/core/langs/{wbcr_factory_420-ru_RU.mo → wbcr_factory_429-ru_RU.mo} +0 -0
  81. libs/factory/core/langs/{wbcr_factory_420-ru_RU.po → wbcr_factory_429-ru_RU.po} +0 -0
  82. libs/factory/forms/boot.php +144 -143
  83. libs/factory/forms/controls/checkbox.php +4 -4
  84. libs/factory/forms/controls/color-and-opacity.php +4 -4
  85. libs/factory/forms/controls/color.php +2 -2
  86. libs/factory/forms/controls/customs/html.php +2 -2
  87. libs/factory/forms/controls/customs/separator.php +2 -2
  88. libs/factory/forms/controls/datepicker-range.php +4 -4
  89. libs/factory/forms/controls/dropdown-and-colors.php +6 -6
  90. libs/factory/forms/controls/dropdown.php +5 -5
  91. libs/factory/forms/controls/font.php +11 -11
  92. libs/factory/forms/controls/google-font.php +8 -8
  93. libs/factory/forms/controls/gradient.php +4 -4
  94. libs/factory/forms/controls/hidden.php +2 -2
  95. libs/factory/forms/controls/holders/accordion-item.php +2 -2
  96. libs/factory/forms/controls/holders/accordion.php +2 -2
  97. libs/factory/forms/controls/holders/columns.php +2 -2
  98. libs/factory/forms/controls/holders/control-group-item.php +2 -2
  99. libs/factory/forms/controls/holders/control-group.php +3 -3
  100. libs/factory/forms/controls/holders/div.php +2 -2
  101. libs/factory/forms/controls/holders/form-group.php +2 -2
  102. libs/factory/forms/controls/holders/more-link.php +2 -2
  103. libs/factory/forms/controls/holders/tab-item.php +2 -2
  104. libs/factory/forms/controls/holders/tab.php +4 -4
  105. libs/factory/forms/controls/integer.php +2 -2
  106. libs/factory/forms/controls/list.php +4 -4
  107. libs/factory/forms/controls/multiple-textbox.php +3 -3
  108. libs/factory/forms/controls/paddings-editor.php +3 -3
  109. libs/factory/forms/controls/pattern.php +9 -9
  110. libs/factory/forms/controls/radio-colors.php +2 -2
  111. libs/factory/forms/controls/radio.php +2 -2
  112. libs/factory/forms/controls/textarea.php +2 -2
  113. libs/factory/forms/controls/textbox.php +2 -2
  114. libs/factory/forms/controls/url.php +3 -3
  115. libs/factory/forms/controls/wp-editor.php +3 -3
  116. libs/factory/forms/includes/complex-control.class.php +4 -4
  117. libs/factory/forms/includes/control-holder.class.php +5 -5
  118. libs/factory/forms/includes/control.class.php +5 -5
  119. libs/factory/forms/includes/custom-element.class.php +2 -2
  120. libs/factory/forms/includes/form-element.class.php +7 -7
  121. libs/factory/forms/includes/form-layout.class.php +5 -5
  122. libs/factory/forms/includes/form.class.php +39 -39
  123. libs/factory/forms/includes/holder.class.php +6 -6
  124. libs/factory/forms/includes/html-builder.class.php +2 -2
  125. libs/factory/forms/includes/providers/meta-value-provider.class.php +2 -2
  126. libs/factory/forms/includes/providers/options-value-provider.class.php +3 -3
  127. libs/factory/forms/includes/providers/value-provider.interface.php +2 -2
  128. libs/factory/forms/langs/{wbcr_factory_forms_418-ru_RU.mo → wbcr_factory_forms_427-ru_RU.mo} +0 -0
  129. libs/factory/forms/langs/{wbcr_factory_forms_418-ru_RU.po → wbcr_factory_forms_427-ru_RU.po} +0 -0
  130. libs/factory/forms/layouts/bootstrap-3/bootstrap-3.php +7 -7
  131. libs/factory/pages/boot.php +14 -14
  132. libs/factory/pages/includes/admin-page.class.php +145 -130
  133. libs/factory/pages/includes/page.class.php +7 -7
  134. libs/factory/pages/langs/{wbcr_factory_pages_420-fr_FR.mo → wbcr_factory_pages_429-fr_FR.mo} +0 -0
  135. libs/factory/pages/langs/{wbcr_factory_pages_420-fr_FR.po → wbcr_factory_pages_429-fr_FR.po} +0 -0
  136. libs/factory/pages/langs/{wbcr_factory_pages_420-ru_RU.mo → wbcr_factory_pages_429-ru_RU.mo} +0 -0
  137. libs/factory/pages/langs/{wbcr_factory_pages_420-ru_RU.po → wbcr_factory_pages_429-ru_RU.po} +0 -0
  138. libs/factory/pages/pages.php +11 -11
  139. libs/factory/pages/templates/assets/css/impressive.page.template.css +160 -117
  140. libs/factory/pages/templates/assets/css/impressive.page.template.less +98 -1
  141. libs/factory/pages/templates/impressive-page.class.php +404 -320
  142. migrations/010007.php +1 -1
  143. readme.txt +11 -3
admin/boot.php CHANGED
@@ -11,24 +11,24 @@
11
  */
12
 
13
  // Exit if accessed directly
14
- if ( ! defined( 'ABSPATH' ) ) {
15
  exit;
16
  }
17
 
18
- if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) ) {
19
- add_filter( 'plugin_row_meta', function ( $links, $file ) {
20
- if ( $file == WDN_PLUGIN_BASE ) {
21
  $url = 'https://clearfy.pro';
22
 
23
- if ( get_locale() == 'ru_RU' ) {
24
  $url = 'https://ru.clearfy.pro';
25
  }
26
- $url .= '?utm_source=wordpress.org&utm_campaign=' . WDN_Plugin::app()->getPluginName();
27
- $links[] = '<a href="' . $url . '" style="color: #FF5722;font-weight: bold;" target="_blank">' . __( 'Get ultimate plugin free', 'disable-admin-notices' ) . '</a>';
28
  }
29
 
30
  return $links;
31
- }, 10, 2 );
32
 
33
  /**
34
  * Изменяем ссылку по умолчанию на собственную в виджете "Голосу за нас".
@@ -36,21 +36,21 @@ if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) ) {
36
  * Ссылка ведет на страницу рейтинга в репозитори Wordpress.org
37
  * https://wordpress.org/support/plugin/disable-admin-notices/reviews/
38
  *
39
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
40
- * @since 1.0
41
- *
42
  * @param string $page_url
43
  * @param string $plugin_name
44
  *
45
  * @return string
 
 
 
46
  */
47
- add_filter( 'wbcr_factory_pages_420_imppage_rating_widget_url', function ( $page_url, $plugin_name ) {
48
- if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) && ( $plugin_name == WDN_Plugin::app()->getPluginName() ) ) {
49
  return 'https://goo.gl/68ucHp';
50
  }
51
 
52
  return $page_url;
53
- }, 10, 2 );
54
 
55
  /**
56
  * Удаляем лишние виджеты из правого сайдбара в интерфейсе плагина
@@ -59,15 +59,15 @@ if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) ) {
59
  * - Виджет с рейтингом
60
  * - Виджет с маркерами информации
61
  */
62
- add_filter( 'wbcr/factory/pages/impressive/widgets', function ( $widgets, $position, $plugin ) {
63
- if ( WDN_Plugin::app()->getPluginName() == $plugin->getPluginName() && 'right' == $position ) {
64
- unset( $widgets['business_suggetion'] );
65
- unset( $widgets['rating_widget'] );
66
- unset( $widgets['info_widget'] );
67
  }
68
 
69
  return $widgets;
70
- }, 20, 3 );
71
  } else {
72
  /**
73
  * Регистрируем опции плагина в Clearfy, чтобы тот мог совершать манипуляции с опциями этого плагина.
@@ -76,19 +76,45 @@ if ( ! defined( 'LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON' ) ) {
76
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
77
  * @since 1.0
78
  */
79
- add_filter( "wbcr_clearfy_group_options", function ( $options ) {
80
  $options[] = [
81
- 'name' => 'hide_admin_notices',
82
- 'title' => __( 'Hide admin notices', 'disable-admin-notices' ),
83
- 'tags' => [],
84
- 'values' => [ 'hide_admin_notices' => 'only_selected' ]
85
  ];
86
  $options[] = [
87
- 'name' => 'show_notices_in_adminbar',
88
- 'title' => __( 'Enable hidden notices in adminbar', 'disable-admin-notices' ),
89
- 'tags' => []
90
  ];
91
 
92
  return $options;
93
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
11
  */
12
 
13
  // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
  exit;
16
  }
17
 
18
+ if( !defined('LOADING_DISABLE_ADMIN_NOTICES_AS_ADDON') ) {
19
+ add_filter('plugin_row_meta', function ($links, $file) {
20
+ if( $file == WDN_PLUGIN_BASE ) {
21
  $url = 'https://clearfy.pro';
22
 
23
+ if( get_locale() == 'ru_RU' ) {
24
  $url = 'https://ru.clearfy.pro';
25
  }
26
+ $url .= '?utm_source=wordpress.org&utm_campaign=' . WDN_Plugin::app()->getPluginName();
27
+ $links[] = '<a href="' . $url . '" style="color: #FF5722;font-weight: bold;" target="_blank">' . __('Get ultimate plugin free', 'disable-admin-notices') . '</a>';
28
  }
29
 
30
  return $links;
31
+ }, 10, 2);
32
 
33
  /**
34
  * Изменяем ссылку по умолчанию на собственную в виджете "Голосу за нас".
36
  * Ссылка ведет на страницу рейтинга в репозитори Wordpress.org
37
  * https://wordpress.org/support/plugin/disable-admin-notices/reviews/
38
  *
 
 
 
39
  * @param string $page_url
40
  * @param string $plugin_name
41
  *
42
  * @return string
43
+ * @since 1.0
44
+ *
45
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
46
  */
47
+ add_filter('wbcr_factory_pages_429_imppage_rating_widget_url', function ($page_url, $plugin_name) {
48
+ if( $plugin_name == WDN_Plugin::app()->getPluginName() ) {
49
  return 'https://goo.gl/68ucHp';
50
  }
51
 
52
  return $page_url;
53
+ }, 10, 2);
54
 
55
  /**
56
  * Удаляем лишние виджеты из правого сайдбара в интерфейсе плагина
59
  * - Виджет с рейтингом
60
  * - Виджет с маркерами информации
61
  */
62
+ add_filter('wbcr/factory/pages/impressive/widgets', function ($widgets, $position, $plugin) {
63
+ if( WDN_Plugin::app()->getPluginName() == $plugin->getPluginName() && 'right' == $position ) {
64
+ unset($widgets['business_suggetion']);
65
+ unset($widgets['rating_widget']);
66
+ unset($widgets['info_widget']);
67
  }
68
 
69
  return $widgets;
70
+ }, 20, 3);
71
  } else {
72
  /**
73
  * Регистрируем опции плагина в Clearfy, чтобы тот мог совершать манипуляции с опциями этого плагина.
76
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
77
  * @since 1.0
78
  */
79
+ add_filter("wbcr_clearfy_group_options", function ($options) {
80
  $options[] = [
81
+ 'name' => 'hide_admin_notices',
82
+ 'title' => __('Hide admin notices', 'disable-admin-notices'),
83
+ 'tags' => [],
84
+ 'values' => ['hide_admin_notices' => 'only_selected']
85
  ];
86
  $options[] = [
87
+ 'name' => 'show_notices_in_adminbar',
88
+ 'title' => __('Enable hidden notices in adminbar', 'disable-admin-notices'),
89
+ 'tags' => []
90
  ];
91
 
92
  return $options;
93
+ });
94
+
95
+ /**
96
+ * Print admin notice: "Would you like to send them for spam checking?"
97
+ *
98
+ * If user clicked button "Yes, do it", plugin will exec action,
99
+ * that put all unapproved comments to spam check queue.
100
+ */
101
+ /*add_action('wbcr/factory/admin_notices', function ($notices, $plugin_name) {
102
+ if( $plugin_name != WDN_Plugin::app()->getPluginName() ) {
103
+ return $notices;
104
+ }
105
+
106
+ $page_url = 'https://wordpress.org/support/plugin/disable-admin-notices/reviews/';
107
+
108
+ $notice_text = sprintf(__('Hey, You’ve using Disable admin notices – that’s awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress? Just to help us spread the word and boost our motivation! <a href="%s">Review</a>', "titan-security"), $page_url);
109
+
110
+ $notices[] = [
111
+ 'id' => 'wdan_got_5star_rating',
112
+ 'type' => 'success',
113
+ 'dismissible' => true,
114
+ 'dismiss_expires' => 0,
115
+ 'text' => '<p><strong>Disable Admin Notices Individually:</strong><br>' . $notice_text . '</p>'
116
+ ];
117
+
118
+ return $notices;
119
+ }, 10, 2);*/
120
  }
admin/options.php CHANGED
@@ -131,7 +131,7 @@ function wbcr_dan_get_plugin_options() {
131
  * с настройками этого плагина, потому что это ухудшает юзабилити.
132
  *
133
  * @param array $form Массив с группой настроек, страницы "Дополнительно" в плагине Clearfy
134
- * @param Wbcr_FactoryPages420_ImpressiveThemplate $page Экземпляр страницы
135
  *
136
  * @return mixed Отсортированный массив с группой опций
137
  */
@@ -161,7 +161,7 @@ add_filter( 'wbcr_clr_additionally_form_options', 'wbcr_dan_additionally_form_op
161
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
162
  * @since 1.0
163
  *
164
- * @param @param $html_builder Wbcr_FactoryForms418_Html
165
  */
166
  function wbcr_dan_reset_notices_button( $html_builder ) {
167
  global $wpdb;
131
  * с настройками этого плагина, потому что это ухудшает юзабилити.
132
  *
133
  * @param array $form Массив с группой настроек, страницы "Дополнительно" в плагине Clearfy
134
+ * @param Wbcr_FactoryPages429_ImpressiveThemplate $page Экземпляр страницы
135
  *
136
  * @return mixed Отсортированный массив с группой опций
137
  */
161
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
162
  * @since 1.0
163
  *
164
+ * @param @param $html_builder Wbcr_FactoryForms427_Html
165
  */
166
  function wbcr_dan_reset_notices_button( $html_builder ) {
167
  global $wpdb;
admin/pages/class-pages-more-features.php CHANGED
@@ -22,6 +22,6 @@ if ( ! defined( 'ABSPATH' ) ) {
22
  exit;
23
  }
24
 
25
- class WDN_MoreFeaturesPage extends Wbcr_FactoryClearfy212_MoreFeaturesPage {
26
 
27
  }
22
  exit;
23
  }
24
 
25
+ class WDN_MoreFeaturesPage extends Wbcr_FactoryClearfy221_MoreFeaturesPage {
26
 
27
  }
admin/pages/class-pages-notices.php CHANGED
@@ -19,7 +19,7 @@ if ( ! defined( 'ABSPATH' ) ) {
19
  exit;
20
  }
21
 
22
- class WDN_NoticesPage extends Wbcr_FactoryClearfy212_PageBase {
23
 
24
  /**
25
  * {@inheritDoc}
@@ -52,9 +52,9 @@ class WDN_NoticesPage extends Wbcr_FactoryClearfy212_PageBase {
52
 
53
 
54
  /**
55
- * @param Wbcr_Factory420_Plugin $plugin
56
  */
57
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
58
  $this->menu_title = __( 'Hide admin notices', 'disable-admin-notices' );
59
 
60
  $this->internal = false;
@@ -86,7 +86,7 @@ class WDN_NoticesPage extends Wbcr_FactoryClearfy212_PageBase {
86
  'wbcr_dan_code' => 'interal_error'
87
  ),
88
  'type' => 'danger',
89
- 'message' => __('An error occurred while trying to delete comments. Internal error occured. Please try again later.', 'factory_pages_420')
90
  );*/
91
 
92
  return $notices;
19
  exit;
20
  }
21
 
22
+ class WDN_NoticesPage extends Wbcr_FactoryClearfy221_PageBase {
23
 
24
  /**
25
  * {@inheritDoc}
52
 
53
 
54
  /**
55
+ * @param Wbcr_Factory429_Plugin $plugin
56
  */
57
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
58
  $this->menu_title = __( 'Hide admin notices', 'disable-admin-notices' );
59
 
60
  $this->internal = false;
86
  'wbcr_dan_code' => 'interal_error'
87
  ),
88
  'type' => 'danger',
89
+ 'message' => __('An error occurred while trying to delete comments. Internal error occured. Please try again later.', 'factory_pages_429')
90
  );*/
91
 
92
  return $notices;
clearfy.php CHANGED
@@ -18,7 +18,8 @@ if ( ! defined( 'ABSPATH' ) ) {
18
  }
19
 
20
  if ( ! defined( 'WDN_PLUGIN_ACTIVE' ) ) {
21
- define( 'WDN_PLUGIN_VERSION', '1.1.0' );
 
22
  define( 'WDN_PLUGIN_ACTIVE', true );
23
 
24
  // Этот плагин загружен, как аддон для плагина Clearfy
18
  }
19
 
20
  if ( ! defined( 'WDN_PLUGIN_ACTIVE' ) ) {
21
+ define( 'WDN_PLUGIN_VERSION', '1.1.2' );
22
+ define( 'WDN_TEXT_DOMAIN', 'disable-admin-notices' );
23
  define( 'WDN_PLUGIN_ACTIVE', true );
24
 
25
  // Этот плагин загружен, как аддон для плагина Clearfy
disable-admin-notices.php CHANGED
@@ -4,11 +4,11 @@
4
  * Plugin URI: https://webcraftic.com
5
  * Description: Disable admin notices plugin gives you the option to hide updates warnings and inline notices in the admin panel.
6
  * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.1.1
8
  * Text Domain: disable-admin-notices
9
  * Domain Path: /languages/
10
  * Author URI: https://webcraftic.com
11
- * Framework Version: FACTORY_420_VERSION
12
  */
13
 
14
  /**
@@ -25,7 +25,7 @@
25
  */
26
 
27
  // Exit if accessed directly
28
- if ( ! defined( 'ABSPATH' ) ) {
29
  exit;
30
  }
31
 
@@ -37,54 +37,53 @@ if ( ! defined( 'ABSPATH' ) ) {
37
  * -----------------------------------------------------------------------------
38
  */
39
 
40
- require_once( dirname( __FILE__ ) . '/libs/factory/core/includes/class-factory-requirements.php' );
41
 
42
  // @formatter:off
43
  $wdan_plugin_info = array(
44
- 'prefix' => 'wbcr_dan_',
45
- 'plugin_name' => 'wbcr_dan',
46
- 'plugin_title' => __( 'Webcraftic disable admin notices', 'disable-admin-notices' ),
47
 
48
  // PLUGIN SUPPORT
49
- 'support_details' => array(
50
- 'url' => 'https://webcraftic.com',
51
  'pages_map' => array(
52
- 'support' => 'support', // {site}/support
53
- 'docs' => 'docs' // {site}/docs
54
  )
55
  ),
56
 
57
  // PLUGIN ADVERTS
58
  'render_adverts' => true,
59
- 'adverts_settings' => array(
60
- 'dashboard_widget' => true, // show dashboard widget (default: false)
61
- 'right_sidebar' => true, // show adverts sidebar (default: false)
62
- 'notice' => true, // show notice message (default: false)
63
  ),
64
 
65
  // FRAMEWORK MODULES
66
  'load_factory_modules' => array(
67
- array( 'libs/factory/bootstrap', 'factory_bootstrap_421', 'admin' ),
68
- array( 'libs/factory/forms', 'factory_forms_418', 'admin' ),
69
- array( 'libs/factory/pages', 'factory_pages_420', 'admin' ),
70
- array( 'libs/factory/clearfy', 'factory_clearfy_212', 'all' ),
71
- array( 'libs/factory/adverts', 'factory_adverts_102', 'admin')
72
  )
73
  );
74
 
75
- $wdan_compatibility = new Wbcr_Factory420_Requirements( __FILE__, array_merge( $wdan_plugin_info, array(
76
- 'plugin_already_activate' => defined( 'WDN_PLUGIN_ACTIVE' ),
77
- 'required_php_version' => '5.4',
78
- 'required_wp_version' => '4.2.0',
79
  'required_clearfy_check_component' => false
80
- ) ) );
81
-
82
 
83
  /**
84
  * If the plugin is compatible, then it will continue its work, otherwise it will be stopped,
85
  * and the user will throw a warning.
86
  */
87
- if ( ! $wdan_compatibility->check() ) {
88
  return;
89
  }
90
 
@@ -97,12 +96,11 @@ if ( ! $wdan_compatibility->check() ) {
97
  */
98
 
99
  // This plugin is activated
100
- define( 'WDN_PLUGIN_ACTIVE', true );
101
- define( 'WDN_PLUGIN_VERSION', $wdan_compatibility->get_plugin_version() );
102
- define( 'WDN_PLUGIN_DIR', dirname( __FILE__ ) );
103
- define( 'WDN_PLUGIN_BASE', plugin_basename( __FILE__ ) );
104
- define( 'WDN_PLUGIN_URL', plugins_url( null, __FILE__ ) );
105
-
106
 
107
 
108
 
@@ -112,24 +110,24 @@ define( 'WDN_PLUGIN_URL', plugins_url( null, __FILE__ ) );
112
  * -----------------------------------------------------------------------------
113
  */
114
 
115
- require_once( WDN_PLUGIN_DIR . '/libs/factory/core/boot.php' );
116
- require_once( WDN_PLUGIN_DIR . '/includes/class-plugin.php' );
117
 
118
  try {
119
- new WDN_Plugin( __FILE__, array_merge( $wdan_plugin_info, array(
120
- 'plugin_version' => WDN_PLUGIN_VERSION,
121
  'plugin_text_domain' => $wdan_compatibility->get_text_domain(),
122
- ) ) );
123
  } catch( Exception $e ) {
124
  // Plugin wasn't initialized due to an error
125
- define( 'WDN_PLUGIN_THROW_ERROR', true );
126
 
127
- $wdan_plugin_error_func = function () use ( $e ) {
128
- $error = sprintf( "The %s plugin has stopped. <b>Error:</b> %s Code: %s", 'Webcraftic Disable Admin Notices', $e->getMessage(), $e->getCode() );
129
  echo '<div class="notice notice-error"><p>' . $error . '</p></div>';
130
  };
131
 
132
- add_action( 'admin_notices', $wdan_plugin_error_func );
133
- add_action( 'network_admin_notices', $wdan_plugin_error_func );
134
  }
135
  // @formatter:on
4
  * Plugin URI: https://webcraftic.com
5
  * Description: Disable admin notices plugin gives you the option to hide updates warnings and inline notices in the admin panel.
6
  * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.1.3
8
  * Text Domain: disable-admin-notices
9
  * Domain Path: /languages/
10
  * Author URI: https://webcraftic.com
11
+ * Framework Version: FACTORY_429_VERSION
12
  */
13
 
14
  /**
25
  */
26
 
27
  // Exit if accessed directly
28
+ if( !defined('ABSPATH') ) {
29
  exit;
30
  }
31
 
37
  * -----------------------------------------------------------------------------
38
  */
39
 
40
+ require_once(dirname(__FILE__) . '/libs/factory/core/includes/class-factory-requirements.php');
41
 
42
  // @formatter:off
43
  $wdan_plugin_info = array(
44
+ 'prefix' => 'wbcr_dan_',
45
+ 'plugin_name' => 'wbcr_dan',
46
+ 'plugin_title' => __('Webcraftic disable admin notices', 'disable-admin-notices'),
47
 
48
  // PLUGIN SUPPORT
49
+ 'support_details' => array(
50
+ 'url' => 'https://webcraftic.com',
51
  'pages_map' => array(
52
+ 'support' => 'support', // {site}/support
53
+ 'docs' => 'docs' // {site}/docs
54
  )
55
  ),
56
 
57
  // PLUGIN ADVERTS
58
  'render_adverts' => true,
59
+ 'adverts_settings' => array(
60
+ 'dashboard_widget' => false, // show dashboard widget (default: false)
61
+ 'right_sidebar' => true, // show adverts sidebar (default: false)
62
+ 'notice' => false, // show notice message (default: false)
63
  ),
64
 
65
  // FRAMEWORK MODULES
66
  'load_factory_modules' => array(
67
+ array('libs/factory/bootstrap', 'factory_bootstrap_430', 'admin'),
68
+ array('libs/factory/forms', 'factory_forms_427', 'admin'),
69
+ array('libs/factory/pages', 'factory_pages_429', 'admin'),
70
+ array('libs/factory/clearfy', 'factory_clearfy_221', 'all'),
71
+ array('libs/factory/adverts', 'factory_adverts_109', 'admin')
72
  )
73
  );
74
 
75
+ $wdan_compatibility = new Wbcr_Factory429_Requirements(__FILE__, array_merge($wdan_plugin_info, array(
76
+ 'plugin_already_activate' => defined('WDN_PLUGIN_ACTIVE'),
77
+ 'required_php_version' => '5.4',
78
+ 'required_wp_version' => '4.2.0',
79
  'required_clearfy_check_component' => false
80
+ )));
 
81
 
82
  /**
83
  * If the plugin is compatible, then it will continue its work, otherwise it will be stopped,
84
  * and the user will throw a warning.
85
  */
86
+ if( !$wdan_compatibility->check() ) {
87
  return;
88
  }
89
 
96
  */
97
 
98
  // This plugin is activated
99
+ define('WDN_PLUGIN_ACTIVE', true);
100
+ define('WDN_PLUGIN_VERSION', $wdan_compatibility->get_plugin_version());
101
+ define('WDN_PLUGIN_DIR', dirname(__FILE__));
102
+ define('WDN_PLUGIN_BASE', plugin_basename(__FILE__));
103
+ define('WDN_PLUGIN_URL', plugins_url(null, __FILE__));
 
104
 
105
 
106
 
110
  * -----------------------------------------------------------------------------
111
  */
112
 
113
+ require_once(WDN_PLUGIN_DIR . '/libs/factory/core/boot.php');
114
+ require_once(WDN_PLUGIN_DIR . '/includes/class-plugin.php');
115
 
116
  try {
117
+ new WDN_Plugin(__FILE__, array_merge($wdan_plugin_info, array(
118
+ 'plugin_version' => WDN_PLUGIN_VERSION,
119
  'plugin_text_domain' => $wdan_compatibility->get_text_domain(),
120
+ )));
121
  } catch( Exception $e ) {
122
  // Plugin wasn't initialized due to an error
123
+ define('WDN_PLUGIN_THROW_ERROR', true);
124
 
125
+ $wdan_plugin_error_func = function () use ($e) {
126
+ $error = sprintf("The %s plugin has stopped. <b>Error:</b> %s Code: %s", 'Webcraftic Disable Admin Notices', $e->getMessage(), $e->getCode());
127
  echo '<div class="notice notice-error"><p>' . $error . '</p></div>';
128
  };
129
 
130
+ add_action('admin_notices', $wdan_plugin_error_func);
131
+ add_action('network_admin_notices', $wdan_plugin_error_func);
132
  }
133
  // @formatter:on
includes/class-plugin.php CHANGED
@@ -9,16 +9,16 @@
9
  */
10
 
11
  // Exit if accessed directly
12
- //use WBCR\Factory_Adverts_102\Base;
13
 
14
  if ( ! defined( 'ABSPATH' ) ) {
15
  exit;
16
  }
17
 
18
- class WDN_Plugin extends Wbcr_Factory420_Plugin {
19
 
20
  /**
21
- * @var Wbcr_Factory420_Plugin
22
  */
23
  private static $app;
24
  private $plugin_data;
@@ -44,7 +44,7 @@ class WDN_Plugin extends Wbcr_Factory420_Plugin {
44
  }
45
 
46
  /**
47
- * @return Wbcr_Factory420_Plugin
48
  */
49
  public static function app() {
50
  return self::$app;
9
  */
10
 
11
  // Exit if accessed directly
12
+ //use WBCR\Factory_Adverts_109\Base;
13
 
14
  if ( ! defined( 'ABSPATH' ) ) {
15
  exit;
16
  }
17
 
18
+ class WDN_Plugin extends Wbcr_Factory429_Plugin {
19
 
20
  /**
21
+ * @var Wbcr_Factory429_Plugin
22
  */
23
  private static $app;
24
  private $plugin_data;
44
  }
45
 
46
  /**
47
+ * @return Wbcr_Factory429_Plugin
48
  */
49
  public static function app() {
50
  return self::$app;
includes/classes/class-configurate-notices.php CHANGED
@@ -11,138 +11,143 @@
11
  */
12
 
13
  // Exit if accessed directly
14
- if ( ! defined( 'ABSPATH' ) ) {
15
  exit;
16
  }
17
 
18
- class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy212_Configurate {
19
 
20
- public function registerActionsAndFilters() {
21
- if ( is_admin() ) {
22
- $hide_notices_type = $this->getPopulateOption( 'hide_admin_notices' );
 
23
 
24
- if ( $hide_notices_type != 'not_hide' ) {
25
- add_action( 'admin_print_scripts', [ $this, 'catchNotices' ], 999 );
26
 
27
- if ( empty( $hide_notices_type ) || $hide_notices_type == 'only_selected' ) {
28
- add_action( 'admin_head', [ $this, 'printNotices' ], 999 );
29
  }
30
 
31
- if ( ! empty( $hide_notices_type ) ) {
32
- add_action( 'admin_bar_menu', [ $this, 'notificationsPanel' ], 999 );
33
- add_action( 'admin_enqueue_scripts', [ $this, 'notificationsPanelStyles' ] );
34
  }
35
  }
36
  }
37
  }
38
 
39
- public function printNotices() {
40
- if ( is_multisite() && is_network_admin() ) {
41
- add_action( 'network_admin_notices', [ $this, 'noticesCollection' ] );
 
42
  } else {
43
- add_action( 'admin_notices', [ $this, 'noticesCollection' ] );
44
  }
45
  }
46
 
47
 
48
- public function notificationsPanelStyles() {
49
- if ( ! $this->getPopulateOption( 'show_notices_in_adminbar', false ) && current_user_can( 'manage_network' ) ) {
 
50
  return;
51
  }
52
 
53
- wp_enqueue_style( 'wbcr-notification-panel-styles', WDN_PLUGIN_URL . '/admin/assets/css/notifications-panel.css', [], $this->plugin->getPluginVersion() );
54
- wp_enqueue_script( 'wbcr-notification-panel-scripts', WDN_PLUGIN_URL . '/admin/assets/js/notifications-panel.js', [], $this->plugin->getPluginVersion() );
55
  }
56
 
57
- public function notificationsPanel( &$wp_admin_bar ) {
58
- if ( ! $this->getPopulateOption( 'show_notices_in_adminbar', false ) ) {
 
59
  return;
60
  }
61
 
62
- if ( current_user_can( 'manage_options' ) || current_user_can( 'manage_network' ) ) {
63
  $titles = [];
64
 
65
- $notifications = get_user_meta( get_current_user_id(), WDN_Plugin::app()->getOptionName( 'hidden_notices' ), true );
66
 
67
- if ( empty( $notifications ) ) {
68
  return;
69
  }
70
 
71
- $cont_notifications = sizeof( $notifications );
72
 
73
  // Add top menu
74
- $wp_admin_bar->add_menu( [
75
- 'id' => 'wbcr-han-notify-panel',
76
  'parent' => 'top-secondary',
77
- 'title' => sprintf( __( 'Notifications %s', 'disable-admin-notices' ), '<span class="wbcr-han-adminbar-counter">' . $cont_notifications . '</span>' ),
78
- 'href' => false
79
- ] );
80
 
81
  // loop
82
- if ( ! empty( $notifications ) ) {
83
  $i = 0;
84
- foreach ( $notifications as $notice_id => $message ) {
85
- $message = $this->getExcerpt( stripslashes( $message ), 0, 350 );
86
  $message .= '<div class="wbcr-han-panel-restore-notify-line">';
87
- $message .= '<a href="#" data-nonce="' . wp_create_nonce( $this->plugin->getPluginName() . '_ajax_restore_notice_nonce' );
88
- $message .= '" data-notice-id="' . esc_attr( $notice_id ) . '" class="wbcr-han-panel-restore-notify-link">';
89
- $message .= __( 'Restore notice', 'clearfy' ) . ( isset( $titles[ $notice_id ] ) ? ' (' . $titles[ $notice_id ] . ')' : '' );
90
  $message .= '</a></div>';
91
 
92
- $wp_admin_bar->add_menu( [
93
- 'id' => 'wbcr-han-notify-panel-item-' . $i,
94
  'parent' => 'wbcr-han-notify-panel',
95
- 'title' => $message,
96
- 'href' => false,
97
- 'meta' => [
98
  'class' => ''
99
  ]
100
- ] );
101
 
102
- $i ++;
103
  }
104
  }
105
  }
106
  }
107
 
108
- public function noticesCollection() {
 
109
  global $wbcr_dan_plugin_all_notices;
110
 
111
- if ( empty( $wbcr_dan_plugin_all_notices ) ) {
112
  return;
113
  }
114
  ?>
115
- <!-- Disable admin notices plugin (Clearfy tools) -->
116
- <style>
117
- .wbcr-dan-hide-notices {
118
- position: initial;
119
- padding: 5px 5px 0;
120
- background: transparent;
121
- }
122
-
123
- .wbcr-dan-hide-notices > div {
124
- margin: 0 !important;
125
- }
126
-
127
- .wbcr-dan-hide-notice-link {
128
- display: block;
129
- text-align: right;
130
- margin: 5px 0 5px 5px;
131
- font-weight: bold;
132
- color: #F44336;
133
- }
134
-
135
- .is-dismissible .wbcr-dan-hide-notice-link {
136
- margin-right: -30px;
137
- }
138
-
139
- .wbcr-dan-hide-notice-link:active, .wbcr-dan-hide-notice-link:focus {
140
- box-shadow: none;
141
- outline: none;
142
- }
143
- </style>
144
- <!-- Disable admin notices plugin (Clearfy tools) -->
145
- <script>
146
  jQuery(document).ready(function($) {
147
  $(document).on('click', '.wbcr-dan-hide-notice-link', function() {
148
  var self = $(this),
@@ -194,21 +199,22 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy212_Configurate {
194
  return false;
195
  });
196
  });
197
- </script>
198
  <?php
199
- foreach ( $wbcr_dan_plugin_all_notices as $val ) {
200
  echo $val;
201
  }
202
  }
203
 
204
- public function catchNotices() {
 
205
  global $wbcr_dan_plugin_all_notices;
206
 
207
  try {
208
- if ( is_multisite() && is_network_admin() ) {
209
- $wp_filter_admin_notices = &$this->getWPFilter( 'network_admin_notices' );
210
  } else {
211
- $wp_filter_admin_notices = &$this->getWPFilter( 'admin_notices' );
212
  }
213
  //todo: Доработать all admin notices
214
 
@@ -216,16 +222,16 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy212_Configurate {
216
  $wp_filter_admin_notices = null;
217
  }
218
 
219
- $hide_notices_type = $this->getPopulateOption( 'hide_admin_notices' );
220
 
221
- if ( empty( $hide_notices_type ) || $hide_notices_type == 'only_selected' ) {
222
- $get_hidden_notices = get_user_meta( get_current_user_id(), WDN_Plugin::app()->getOptionName( 'hidden_notices' ), true );
223
 
224
  $content = [];
225
- foreach ( (array) $wp_filter_admin_notices as $filters ) {
226
- foreach ( $filters as $callback_name => $callback ) {
227
 
228
- if ( 'usof_hide_admin_notices_start' == $callback_name || 'usof_hide_admin_notices_end' == $callback_name ) {
229
  continue;
230
  }
231
 
@@ -233,68 +239,69 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy212_Configurate {
233
 
234
  // #CLRF-140 fix bug for php7
235
  // when the developers forgot to delete the argument in the function of implementing the notification.
236
- $args = [];
237
- $accepted_args = isset( $callback['accepted_args'] ) && ! empty( $callback['accepted_args'] ) ? $callback['accepted_args'] : 0;
238
 
239
- if ( $accepted_args > 0 ) {
240
- for ( $i = 0; $i < (int) $accepted_args; $i ++ ) {
241
  $args[] = null;
242
  }
243
  }
244
  //===========
245
 
246
- call_user_func_array( $callback['function'], $args );
247
  $cont = ob_get_clean();
248
 
249
- if ( empty( $cont ) ) {
250
  continue;
251
  }
252
 
253
- $salt = is_multisite() ? get_current_blog_id() : '';
254
- $uniq_id1 = md5( $cont . $salt );
255
- $uniq_id2 = md5( $callback_name . $salt );
256
 
257
- if ( is_array( $callback['function'] ) && sizeof( $callback['function'] ) == 2 ) {
258
  $class = $callback['function'][0];
259
- if ( is_object( $class ) ) {
260
- $class_name = get_class( $class );
261
  $method_name = $callback['function'][1];
262
- $uniq_id2 = md5( $class_name . ':' . $method_name );
263
  }
264
  }
 
265
  //838339d1a188e17fec838c2df3058603
266
  //838339d1a188e17fec838c2df3058603
267
- if ( ! empty( $get_hidden_notices ) ) {
268
 
269
  $skip_notice = true;
270
- foreach ( (array) $get_hidden_notices as $key => $notice ) {
271
- $splited_notice_id = explode( '_', $key );
272
- if ( empty( $splited_notice_id ) || sizeof( $splited_notice_id ) < 2 ) {
273
  continue;
274
  }
275
  $compare_notice_id_1 = $splited_notice_id[0];
276
  $compare_notice_id_2 = $splited_notice_id[1];
277
 
278
- if ( $compare_notice_id_1 == $uniq_id1 || $compare_notice_id_2 == $uniq_id2 ) {
279
  $skip_notice = false;
280
  }
281
  }
282
 
283
- if ( ! $skip_notice ) {
284
  continue;
285
  }
286
  }
287
 
288
- $hide_link = '<a href="#" data-nonce="' . wp_create_nonce( $this->plugin->getPluginName() . '_ajax_hide_notices_nonce' ) . '" data-notice-id="' . $uniq_id1 . '_' . $uniq_id2 . '" class="wbcr-dan-hide-notice-link">[' . __( 'Hide notification forever', 'disable-admin-notices' ) . ']</a>';
289
 
290
  // Fix for Woocommerce membership
291
- if ( $cont != '<div class="js-wc-memberships-admin-notice-placeholder"></div>' ) {
292
- $cont = preg_replace( '/<(script|style)([^>]+)?>(.*?)<\/(script|style)>/is', '', $cont );
293
- $cont = rtrim( trim( $cont ) );
294
- $cont = preg_replace( '/^(<div[^>]+>)(.*?)(<\/div>)$/is', '$1<div class="wbcr-dan-hide-notices">$2' . $hide_link . '</div>$3', $cont );
295
  }
296
 
297
- if ( empty( $cont ) ) {
298
  continue;
299
  }
300
  $content[] = $cont;
@@ -305,83 +312,83 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy212_Configurate {
305
  }
306
 
307
  try {
308
- $wp_filter_user_admin_notices = &$this->getWPFilter( 'user_admin_notices' );
309
  } catch( Exception $e ) {
310
  $wp_filter_user_admin_notices = null;
311
  }
312
 
313
  try {
314
- $wp_filter_network_admin_notices = &$this->getWPFilter( 'network_admin_notices' );
315
  } catch( Exception $e ) {
316
  $wp_filter_network_admin_notices = null;
317
  }
318
 
319
- if ( is_user_admin() && $wp_filter_user_admin_notices !== null ) {
320
  $wp_filter_user_admin_notices = null;
321
- } else if ( is_network_admin() && $wp_filter_network_admin_notices !== null ) {
322
  //unset($wp_filter['network_admin_notices']);
323
- foreach ( $wp_filter_network_admin_notices as $f_key => $f ) {
324
- foreach ( $f as $c_name => $clback ) {
325
- if ( is_array( $clback['function'] ) && sizeof( $clback['function'] ) == 2 ) {
326
  $class = $clback['function'][0];
327
- if ( is_object( $class ) ) {
328
- $class_name = get_class( $class );
329
  }
330
  }
331
 
332
- unset( $wp_filter_network_admin_notices[ $f_key ][ $c_name ] );
333
  }
334
  }
335
- } else if ( $wp_filter_admin_notices !== null ) {
336
- foreach ( $wp_filter_admin_notices as $f_key => $f ) {
337
- foreach ( $f as $c_name => $clback ) {
338
- if ( is_array( $clback['function'] ) && sizeof( $clback['function'] ) == 2 ) {
339
  $class = $clback['function'][0];
340
- if ( is_object( $class ) ) {
341
- $class_name = get_class( $class );
342
  }
343
  }
344
 
345
- unset( $wp_filter_admin_notices[ $f_key ][ $c_name ] );
346
  }
347
  }
348
 
349
- unset( $f_key );
350
- unset( $f );
351
  }
352
 
353
  try {
354
- $wp_filter_all_admin_notices = &$this->getWPfilter( 'all_admin_notices' );
355
  } catch( Exception $e ) {
356
  $wp_filter_all_admin_notices = null;
357
  }
358
 
359
- if ( $wp_filter_all_admin_notices !== null ) {
360
- foreach ( $wp_filter_all_admin_notices as $f_key => $f ) {
361
- foreach ( $f as $c_name => $clback ) {
362
- if ( is_array( $clback['function'] ) && sizeof( $clback['function'] ) == 2 ) {
363
  $class = $clback['function'][0];
364
- if ( is_object( $class ) ) {
365
- $class_name = get_class( $class );
366
 
367
- #Fix for Learn dash && Woocommerce membership
368
- if ( $class_name == 'Learndash_Admin_Menus_Tabs' || $class_name == 'WC_Memberships_Admin' ) {
369
  continue;
370
  }
371
  }
372
  }
373
 
374
  #Fix for Divi theme
375
- if ( $c_name == 'et_pb_export_layouts_interface' ) {
376
  continue;
377
  }
378
 
379
- unset( $wp_filter_all_admin_notices[ $f_key ][ $c_name ] );
380
  }
381
  }
382
 
383
- unset( $f_key );
384
- unset( $f );
385
  }
386
  }
387
 
@@ -389,18 +396,19 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy212_Configurate {
389
  /**
390
  * Get excerpt from string
391
  *
392
- * @param String $str String to get an excerpt from
393
- * @param Integer $startPos Position int string to start excerpt from
394
- * @param Integer $maxLength Maximum length the excerpt may be
395
  *
396
  * @return String excerpt
397
  */
398
- public function getExcerpt( $str, $startPos = 0, $maxLength = 100 ) {
399
- if ( strlen( $str ) > $maxLength ) {
400
- $excerpt = substr( $str, $startPos, $maxLength - 3 );
401
- $lastSpace = strrpos( $excerpt, ' ' );
402
- $excerpt = substr( $excerpt, 0, $lastSpace );
403
- $excerpt .= '...';
 
404
  } else {
405
  $excerpt = $str;
406
  }
@@ -419,16 +427,17 @@ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy212_Configurate {
419
  * @return array $wp_filter callbacks array by link
420
  * @throws Exception if key not exists
421
  */
422
- private function &getWPFilter( $key ) {
 
423
  global $wp_version, $wp_filter;
424
 
425
- if ( ! isset( $wp_filter[ $key ] ) ) {
426
- throw new Exception( 'key not exists' );
427
  }
428
- if ( version_compare( $wp_version, '4.7.0', '>=' ) ) {
429
- return $wp_filter[ $key ]->callbacks;
430
  } else {
431
- return $wp_filter[ $key ];
432
  }
433
  }
434
  }
11
  */
12
 
13
  // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
  exit;
16
  }
17
 
18
+ class WDN_ConfigHideNotices extends Wbcr_FactoryClearfy221_Configurate {
19
 
20
+ public function registerActionsAndFilters()
21
+ {
22
+ if( is_admin() ) {
23
+ $hide_notices_type = $this->getPopulateOption('hide_admin_notices');
24
 
25
+ if( $hide_notices_type != 'not_hide' ) {
26
+ add_action('admin_print_scripts', [$this, 'catchNotices'], 999);
27
 
28
+ if( empty($hide_notices_type) || $hide_notices_type == 'only_selected' ) {
29
+ add_action('admin_head', [$this, 'printNotices'], 999);
30
  }
31
 
32
+ if( !empty($hide_notices_type) ) {
33
+ add_action('admin_bar_menu', [$this, 'notificationsPanel'], 999);
34
+ add_action('admin_enqueue_scripts', [$this, 'notificationsPanelStyles']);
35
  }
36
  }
37
  }
38
  }
39
 
40
+ public function printNotices()
41
+ {
42
+ if( is_multisite() && is_network_admin() ) {
43
+ add_action('network_admin_notices', [$this, 'noticesCollection']);
44
  } else {
45
+ add_action('admin_notices', [$this, 'noticesCollection']);
46
  }
47
  }
48
 
49
 
50
+ public function notificationsPanelStyles()
51
+ {
52
+ if( !$this->getPopulateOption('show_notices_in_adminbar', false) && current_user_can('manage_network') ) {
53
  return;
54
  }
55
 
56
+ wp_enqueue_style('wbcr-notification-panel-styles', WDN_PLUGIN_URL . '/admin/assets/css/notifications-panel.css', [], $this->plugin->getPluginVersion());
57
+ wp_enqueue_script('wbcr-notification-panel-scripts', WDN_PLUGIN_URL . '/admin/assets/js/notifications-panel.js', [], $this->plugin->getPluginVersion());
58
  }
59
 
60
+ public function notificationsPanel(&$wp_admin_bar)
61
+ {
62
+ if( !$this->getPopulateOption('show_notices_in_adminbar', false) ) {
63
  return;
64
  }
65
 
66
+ if( current_user_can('manage_options') || current_user_can('manage_network') ) {
67
  $titles = [];
68
 
69
+ $notifications = get_user_meta(get_current_user_id(), WDN_Plugin::app()->getOptionName('hidden_notices'), true);
70
 
71
+ if( empty($notifications) ) {
72
  return;
73
  }
74
 
75
+ $cont_notifications = sizeof($notifications);
76
 
77
  // Add top menu
78
+ $wp_admin_bar->add_menu([
79
+ 'id' => 'wbcr-han-notify-panel',
80
  'parent' => 'top-secondary',
81
+ 'title' => sprintf(__('Notifications %s', 'disable-admin-notices'), '<span class="wbcr-han-adminbar-counter">' . $cont_notifications . '</span>'),
82
+ 'href' => false
83
+ ]);
84
 
85
  // loop
86
+ if( !empty($notifications) ) {
87
  $i = 0;
88
+ foreach($notifications as $notice_id => $message) {
89
+ $message = $this->getExcerpt(stripslashes($message), 0, 350);
90
  $message .= '<div class="wbcr-han-panel-restore-notify-line">';
91
+ $message .= '<a href="#" data-nonce="' . wp_create_nonce($this->plugin->getPluginName() . '_ajax_restore_notice_nonce');
92
+ $message .= '" data-notice-id="' . esc_attr($notice_id) . '" class="wbcr-han-panel-restore-notify-link">';
93
+ $message .= __('Restore notice', 'clearfy') . (isset($titles[$notice_id]) ? ' (' . $titles[$notice_id] . ')' : '');
94
  $message .= '</a></div>';
95
 
96
+ $wp_admin_bar->add_menu([
97
+ 'id' => 'wbcr-han-notify-panel-item-' . $i,
98
  'parent' => 'wbcr-han-notify-panel',
99
+ 'title' => $message,
100
+ 'href' => false,
101
+ 'meta' => [
102
  'class' => ''
103
  ]
104
+ ]);
105
 
106
+ $i++;
107
  }
108
  }
109
  }
110
  }
111
 
112
+ public function noticesCollection()
113
+ {
114
  global $wbcr_dan_plugin_all_notices;
115
 
116
+ if( empty($wbcr_dan_plugin_all_notices) ) {
117
  return;
118
  }
119
  ?>
120
+ <!-- Disable admin notices plugin (Clearfy tools) -->
121
+ <style>
122
+ .wbcr-dan-hide-notices {
123
+ position: initial;
124
+ padding: 5px 5px 0;
125
+ background: transparent;
126
+ }
127
+
128
+ .wbcr-dan-hide-notices > div {
129
+ margin: 0 !important;
130
+ }
131
+
132
+ .wbcr-dan-hide-notice-link {
133
+ display: block;
134
+ text-align: right;
135
+ margin: 5px 0 5px 5px;
136
+ font-weight: bold;
137
+ color: #F44336;
138
+ }
139
+
140
+ .is-dismissible .wbcr-dan-hide-notice-link {
141
+ margin-right: -30px;
142
+ }
143
+
144
+ .wbcr-dan-hide-notice-link:active, .wbcr-dan-hide-notice-link:focus {
145
+ box-shadow: none;
146
+ outline: none;
147
+ }
148
+ </style>
149
+ <!-- Disable admin notices plugin (Clearfy tools) -->
150
+ <script>
151
  jQuery(document).ready(function($) {
152
  $(document).on('click', '.wbcr-dan-hide-notice-link', function() {
153
  var self = $(this),
199
  return false;
200
  });
201
  });
202
+ </script>
203
  <?php
204
+ foreach($wbcr_dan_plugin_all_notices as $val) {
205
  echo $val;
206
  }
207
  }
208
 
209
+ public function catchNotices()
210
+ {
211
  global $wbcr_dan_plugin_all_notices;
212
 
213
  try {
214
+ if( is_multisite() && is_network_admin() ) {
215
+ $wp_filter_admin_notices = &$this->getWPFilter('network_admin_notices');
216
  } else {
217
+ $wp_filter_admin_notices = &$this->getWPFilter('admin_notices');
218
  }
219
  //todo: Доработать all admin notices
220
 
222
  $wp_filter_admin_notices = null;
223
  }
224
 
225
+ $hide_notices_type = $this->getPopulateOption('hide_admin_notices');
226
 
227
+ if( empty($hide_notices_type) || $hide_notices_type == 'only_selected' ) {
228
+ $get_hidden_notices = get_user_meta(get_current_user_id(), WDN_Plugin::app()->getOptionName('hidden_notices'), true);
229
 
230
  $content = [];
231
+ foreach((array)$wp_filter_admin_notices as $filters) {
232
+ foreach($filters as $callback_name => $callback) {
233
 
234
+ if( 'usof_hide_admin_notices_start' == $callback_name || 'usof_hide_admin_notices_end' == $callback_name ) {
235
  continue;
236
  }
237
 
239
 
240
  // #CLRF-140 fix bug for php7
241
  // when the developers forgot to delete the argument in the function of implementing the notification.
242
+ $args = [];
243
+ $accepted_args = isset($callback['accepted_args']) && !empty($callback['accepted_args']) ? $callback['accepted_args'] : 0;
244
 
245
+ if( $accepted_args > 0 ) {
246
+ for($i = 0; $i < (int)$accepted_args; $i++) {
247
  $args[] = null;
248
  }
249
  }
250
  //===========
251
 
252
+ call_user_func_array($callback['function'], $args);
253
  $cont = ob_get_clean();
254
 
255
+ if( empty($cont) ) {
256
  continue;
257
  }
258
 
259
+ $salt = is_multisite() ? get_current_blog_id() : '';
260
+ $uniq_id1 = md5($cont . $salt);
261
+ $uniq_id2 = md5($callback_name . $salt);
262
 
263
+ if( is_array($callback['function']) && sizeof($callback['function']) == 2 ) {
264
  $class = $callback['function'][0];
265
+ if( is_object($class) ) {
266
+ $class_name = get_class($class);
267
  $method_name = $callback['function'][1];
268
+ $uniq_id2 = md5($class_name . ':' . $method_name);
269
  }
270
  }
271
+
272
  //838339d1a188e17fec838c2df3058603
273
  //838339d1a188e17fec838c2df3058603
274
+ if( !empty($get_hidden_notices) ) {
275
 
276
  $skip_notice = true;
277
+ foreach((array)$get_hidden_notices as $key => $notice) {
278
+ $splited_notice_id = explode('_', $key);
279
+ if( empty($splited_notice_id) || sizeof($splited_notice_id) < 2 ) {
280
  continue;
281
  }
282
  $compare_notice_id_1 = $splited_notice_id[0];
283
  $compare_notice_id_2 = $splited_notice_id[1];
284
 
285
+ if( $compare_notice_id_1 == $uniq_id1 || $compare_notice_id_2 == $uniq_id2 ) {
286
  $skip_notice = false;
287
  }
288
  }
289
 
290
+ if( !$skip_notice ) {
291
  continue;
292
  }
293
  }
294
 
295
+ $hide_link = '<a href="#" data-nonce="' . wp_create_nonce($this->plugin->getPluginName() . '_ajax_hide_notices_nonce') . '" data-notice-id="' . $uniq_id1 . '_' . $uniq_id2 . '" class="wbcr-dan-hide-notice-link">[' . __('Hide notification forever', 'disable-admin-notices') . ']</a>';
296
 
297
  // Fix for Woocommerce membership
298
+ if( $cont != '<div class="js-wc-memberships-admin-notice-placeholder"></div>' ) {
299
+ $cont = preg_replace('/<(script|style)([^>]+)?>(.*?)<\/(script|style)>/is', '', $cont);
300
+ $cont = rtrim(trim($cont));
301
+ $cont = preg_replace('/^(<div[^>]+>)(.*?)(<\/div>)$/is', '$1<div class="wbcr-dan-hide-notices">$2' . $hide_link . '</div>$3', $cont);
302
  }
303
 
304
+ if( empty($cont) ) {
305
  continue;
306
  }
307
  $content[] = $cont;
312
  }
313
 
314
  try {
315
+ $wp_filter_user_admin_notices = &$this->getWPFilter('user_admin_notices');
316
  } catch( Exception $e ) {
317
  $wp_filter_user_admin_notices = null;
318
  }
319
 
320
  try {
321
+ $wp_filter_network_admin_notices = &$this->getWPFilter('network_admin_notices');
322
  } catch( Exception $e ) {
323
  $wp_filter_network_admin_notices = null;
324
  }
325
 
326
+ if( is_user_admin() && $wp_filter_user_admin_notices !== null ) {
327
  $wp_filter_user_admin_notices = null;
328
+ } else if( is_network_admin() && $wp_filter_network_admin_notices !== null ) {
329
  //unset($wp_filter['network_admin_notices']);
330
+ foreach($wp_filter_network_admin_notices as $f_key => $f) {
331
+ foreach($f as $c_name => $clback) {
332
+ if( is_array($clback['function']) && sizeof($clback['function']) == 2 ) {
333
  $class = $clback['function'][0];
334
+ if( is_object($class) ) {
335
+ $class_name = get_class($class);
336
  }
337
  }
338
 
339
+ unset($wp_filter_network_admin_notices[$f_key][$c_name]);
340
  }
341
  }
342
+ } else if( $wp_filter_admin_notices !== null ) {
343
+ foreach($wp_filter_admin_notices as $f_key => $f) {
344
+ foreach($f as $c_name => $clback) {
345
+ if( is_array($clback['function']) && sizeof($clback['function']) == 2 ) {
346
  $class = $clback['function'][0];
347
+ if( is_object($class) ) {
348
+ $class_name = get_class($class);
349
  }
350
  }
351
 
352
+ unset($wp_filter_admin_notices[$f_key][$c_name]);
353
  }
354
  }
355
 
356
+ unset($f_key);
357
+ unset($f);
358
  }
359
 
360
  try {
361
+ $wp_filter_all_admin_notices = &$this->getWPfilter('all_admin_notices');
362
  } catch( Exception $e ) {
363
  $wp_filter_all_admin_notices = null;
364
  }
365
 
366
+ if( $wp_filter_all_admin_notices !== null ) {
367
+ foreach($wp_filter_all_admin_notices as $f_key => $f) {
368
+ foreach($f as $c_name => $clback) {
369
+ if( is_array($clback['function']) && sizeof($clback['function']) == 2 ) {
370
  $class = $clback['function'][0];
371
+ if( is_object($class) ) {
372
+ $class_name = get_class($class);
373
 
374
+ #Fix for Learn dash && Woocommerce membership && YITH WooCommerce Gift Cards
375
+ if( $class_name == 'Learndash_Admin_Menus_Tabs' || $class_name == 'WC_Memberships_Admin' || $class_name == 'YIT_Plugin_Panel_WooCommerce' ) {
376
  continue;
377
  }
378
  }
379
  }
380
 
381
  #Fix for Divi theme
382
+ if( $c_name == 'et_pb_export_layouts_interface' ) {
383
  continue;
384
  }
385
 
386
+ unset($wp_filter_all_admin_notices[$f_key][$c_name]);
387
  }
388
  }
389
 
390
+ unset($f_key);
391
+ unset($f);
392
  }
393
  }
394
 
396
  /**
397
  * Get excerpt from string
398
  *
399
+ * @param String $str String to get an excerpt from
400
+ * @param Integer $startPos Position int string to start excerpt from
401
+ * @param Integer $maxLength Maximum length the excerpt may be
402
  *
403
  * @return String excerpt
404
  */
405
+ public function getExcerpt($str, $startPos = 0, $maxLength = 100)
406
+ {
407
+ if( strlen($str) > $maxLength ) {
408
+ $excerpt = substr($str, $startPos, $maxLength - 3);
409
+ $lastSpace = strrpos($excerpt, ' ');
410
+ $excerpt = substr($excerpt, 0, $lastSpace);
411
+ $excerpt .= '...';
412
  } else {
413
  $excerpt = $str;
414
  }
427
  * @return array $wp_filter callbacks array by link
428
  * @throws Exception if key not exists
429
  */
430
+ private function &getWPFilter($key)
431
+ {
432
  global $wp_version, $wp_filter;
433
 
434
+ if( !isset($wp_filter[$key]) ) {
435
+ throw new Exception('key not exists');
436
  }
437
+ if( version_compare($wp_version, '4.7.0', '>=') ) {
438
+ return $wp_filter[$key]->callbacks;
439
  } else {
440
+ return $wp_filter[$key];
441
  }
442
  }
443
  }
libs/factory/adverts/boot.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- use WBCR\Factory_Adverts_102\Base;
4
 
5
  /**
6
  * Factory Adverts
@@ -16,35 +16,35 @@ use WBCR\Factory_Adverts_102\Base;
16
  */
17
 
18
  // Exit if accessed directly
19
- if ( ! defined( 'ABSPATH' ) ) {
20
  exit;
21
  }
22
 
23
- if ( defined( 'FACTORY_ADVERTS_102_LOADED' ) || ( defined( 'FACTORY_ADVERTS_BLOCK' ) && FACTORY_ADVERTS_BLOCK ) ) {
24
  return;
25
  }
26
 
27
  # Устанавливаем константу, что модуль уже загружен
28
- define( 'FACTORY_ADVERTS_102_LOADED', true );
29
 
30
  # Устанавливаем версию модуля
31
- define( 'FACTORY_ADVERTS_102_VERSION', '1.0.2' );
32
 
33
  # Регистрируем тектовый домен, для интернализации интерфейса модуля
34
- load_plugin_textdomain( 'wbcr_factory_adverts_102', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
35
 
36
  # Устанавливаем директорию модуля
37
- define( 'FACTORY_ADVERTS_102_DIR', dirname( __FILE__ ) );
38
 
39
  # Устанавливаем url модуля
40
- define( 'FACTORY_ADVERTS_102_URL', plugins_url( null, __FILE__ ) );
41
 
42
- require_once( FACTORY_ADVERTS_102_DIR . '/includes/class-rest-request.php' );
43
- require_once( FACTORY_ADVERTS_102_DIR . '/includes/class-base.php' );
44
 
45
  /**
46
- * @param Wbcr_Factory420_Plugin $plugin
47
  */
48
- add_action( 'wbcr_factory_adverts_102_plugin_created', function ( $plugin ) {
49
- $plugin->set_adverts_manager( "WBCR\Factory_Adverts_102\Base" );
50
- } );
1
  <?php
2
 
3
+ use WBCR\Factory_Adverts_109\Base;
4
 
5
  /**
6
  * Factory Adverts
16
  */
17
 
18
  // Exit if accessed directly
19
+ if( !defined('ABSPATH') ) {
20
  exit;
21
  }
22
 
23
+ if( defined('FACTORY_ADVERTS_109_LOADED') || (defined('FACTORY_ADVERTS_BLOCK') && FACTORY_ADVERTS_BLOCK) ) {
24
  return;
25
  }
26
 
27
  # Устанавливаем константу, что модуль уже загружен
28
+ define('FACTORY_ADVERTS_109_LOADED', true);
29
 
30
  # Устанавливаем версию модуля
31
+ define('FACTORY_ADVERTS_109_VERSION', '1.0.9');
32
 
33
  # Регистрируем тектовый домен, для интернализации интерфейса модуля
34
+ load_plugin_textdomain('wbcr_factory_adverts_109', false, dirname(plugin_basename(__FILE__)) . '/langs');
35
 
36
  # Устанавливаем директорию модуля
37
+ define('FACTORY_ADVERTS_109_DIR', dirname(__FILE__));
38
 
39
  # Устанавливаем url модуля
40
+ define('FACTORY_ADVERTS_109_URL', plugins_url(null, __FILE__));
41
 
42
+ require_once(FACTORY_ADVERTS_109_DIR . '/includes/class-rest-request.php');
43
+ require_once(FACTORY_ADVERTS_109_DIR . '/includes/class-base.php');
44
 
45
  /**
46
+ * @param Wbcr_Factory429_Plugin $plugin
47
  */
48
+ add_action('wbcr_factory_adverts_109_plugin_created', function ($plugin) {
49
+ $plugin->set_adverts_manager("WBCR\Factory_Adverts_109\Base");
50
+ });
libs/factory/adverts/includes/class-base.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Adverts_102;
4
 
5
  // Exit if accessed directly
6
  if ( ! defined( 'ABSPATH' ) ) {
@@ -28,7 +28,7 @@ class Base {
28
  *
29
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
30
  * @since 1.0.1
31
- * @var \Wbcr_Factory420_Plugin
32
  */
33
  private $plugin;
34
 
@@ -53,7 +53,7 @@ class Base {
53
  *
54
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
55
  * @since 1.0.1
56
- * @var \WBCR\Factory_Adverts_102\Creative_Motion_API
57
  */
58
  private $api;
59
 
@@ -82,9 +82,9 @@ class Base {
82
  *
83
  * @since 1.0.0 Added
84
  *
85
- * @param \Wbcr_Factory420_Plugin $plugin
86
  */
87
- public function __construct( \Wbcr_Factory420_Plugin $plugin, $settings ) {
88
  $this->plugin = $plugin;
89
 
90
  $this->settings = wp_parse_args( $settings, [
@@ -257,7 +257,7 @@ class Base {
257
  $content = $this->get_debug_message( 'dashboard_widget' );
258
  }
259
 
260
- require_once FACTORY_ADVERTS_102_DIR . '/includes/class-dashboard-widget.php';
261
  new Dashboard_Widget( $this->plugin, $content );
262
  }
263
  }
1
  <?php
2
 
3
+ namespace WBCR\Factory_Adverts_109;
4
 
5
  // Exit if accessed directly
6
  if ( ! defined( 'ABSPATH' ) ) {
28
  *
29
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
30
  * @since 1.0.1
31
+ * @var \Wbcr_Factory429_Plugin
32
  */
33
  private $plugin;
34
 
53
  *
54
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
55
  * @since 1.0.1
56
+ * @var \WBCR\Factory_Adverts_109\Creative_Motion_API
57
  */
58
  private $api;
59
 
82
  *
83
  * @since 1.0.0 Added
84
  *
85
+ * @param \Wbcr_Factory429_Plugin $plugin
86
  */
87
+ public function __construct( \Wbcr_Factory429_Plugin $plugin, $settings ) {
88
  $this->plugin = $plugin;
89
 
90
  $this->settings = wp_parse_args( $settings, [
257
  $content = $this->get_debug_message( 'dashboard_widget' );
258
  }
259
 
260
+ require_once FACTORY_ADVERTS_109_DIR . '/includes/class-dashboard-widget.php';
261
  new Dashboard_Widget( $this->plugin, $content );
262
  }
263
  }
libs/factory/adverts/includes/class-dashboard-widget.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Adverts_102;
4
 
5
  // Exit if accessed directly
6
  if ( ! defined( 'ABSPATH' ) ) {
@@ -35,7 +35,7 @@ class Dashboard_Widget {
35
  *
36
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
37
  * @since 1.0.1
38
- * @var \Wbcr_Factory420_Plugin
39
  */
40
  private $plugin;
41
 
@@ -46,10 +46,10 @@ class Dashboard_Widget {
46
  *
47
  * @since 1.0.0 Added
48
  *
49
- * @param \Wbcr_Factory420_Plugin $plugin
50
  * @param string $content
51
  */
52
- public function __construct( \Wbcr_Factory420_Plugin $plugin, $content ) {
53
 
54
  $this->plugin = $plugin;
55
  $this->content = $content;
1
  <?php
2
 
3
+ namespace WBCR\Factory_Adverts_109;
4
 
5
  // Exit if accessed directly
6
  if ( ! defined( 'ABSPATH' ) ) {
35
  *
36
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
37
  * @since 1.0.1
38
+ * @var \Wbcr_Factory429_Plugin
39
  */
40
  private $plugin;
41
 
46
  *
47
  * @since 1.0.0 Added
48
  *
49
+ * @param \Wbcr_Factory429_Plugin $plugin
50
  * @param string $content
51
  */
52
+ public function __construct( \Wbcr_Factory429_Plugin $plugin, $content ) {
53
 
54
  $this->plugin = $plugin;
55
  $this->content = $content;
libs/factory/adverts/includes/class-rest-request.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Adverts_102;
4
 
5
  // Exit if accessed directly
6
- if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  }
9
 
@@ -65,7 +65,7 @@ class Creative_Motion_API {
65
  *
66
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
67
  * @since 1.0.1
68
- * @var \Wbcr_Factory420_Plugin
69
  */
70
  private $plugin;
71
 
@@ -75,32 +75,34 @@ class Creative_Motion_API {
75
  *
76
  * Variable initialization.
77
  *
 
78
  * @since 1.0.0 Added
79
  *
80
- * @param \Wbcr_Factory420_Plugin $plugin_name
81
  */
82
- public function __construct( \Wbcr_Factory420_Plugin $plugin ) {
 
83
  $this->plugin = $plugin;
84
  }
85
 
86
  /**
87
  * Get adverts content.
88
  *
89
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
90
- * @since 1.0.1
91
- *
92
  * @param $position
93
  *
94
  * @return string|\WP_Error
 
 
 
95
  */
96
- public function get_content( $position ) {
97
- $data = $this->get_cache( $position );
 
98
 
99
- if ( is_wp_error( $data ) ) {
100
  return $data;
101
  }
102
 
103
- return strip_tags( $data['content'], '<b>,<a>,<i>,<strong>,<img>,<ul>,<ol>,<li>' );
104
  }
105
 
106
  /**
@@ -108,47 +110,52 @@ class Creative_Motion_API {
108
  *
109
  * If data in the cache, not empty and not expired, then get data from cache. Or get data from server.
110
  *
111
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
112
- *
113
- * @since 1.0.1 Полностью переписан, с перехватом api ошибок
114
- * @since 1.0.0 Added
115
- *
116
  * @return mixed array(
117
  * 'plugin' => 'wbcr_insert_php',
118
  * 'content' => '<p></p>',
119
  * 'expires' => 1563542199,
120
  * );
 
 
 
 
 
121
  */
122
- private function get_cache( $position ) {
 
123
 
124
- if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
125
- return $this->do_api_request( $position );
126
  }
127
 
128
- $key = $this->plugin->getPrefix() . md5( $position . 'advert_transient_' );
 
 
 
 
129
 
130
- $cached = get_transient( $key );
131
 
132
- if ( $cached !== false ) {
133
- if ( isset( $cached['error_code'] ) && isset( $cached['error'] ) ) {
134
- return new \WP_Error( $cached['error_code'], $cached['error'] );
135
  }
136
 
137
  return $cached;
138
  }
139
 
140
- $data = $this->do_api_request( $position );
141
 
142
- if ( is_wp_error( $data ) ) {
143
- set_transient( $key, [
144
- 'error' => $data->get_error_message(),
145
  'error_code' => $data->get_error_code()
146
- ], self::SERVER_UNAVAILABLE_INTERVAL * HOUR_IN_SECONDS );
147
 
148
  return $data;
149
  }
150
 
151
- set_transient( $key, $data, $data['expires'] );
152
 
153
  return $data;
154
  }
@@ -159,39 +166,52 @@ class Creative_Motion_API {
159
  * In some case on the server (Apache) in the .htaccess must be set
160
  * RewriteRule ^wp-json/(.*)[?](.*) /?rest_route=/$1&$2 [L]
161
  *
162
- * @since 1.0.1 Добавлен перехват ошибок, рефакторинг кода.
163
- * @since 1.0.0 Added
164
- *
165
  * @return mixed array(
166
  * 'plugin' => 'wbcr_insert_php',
167
  * 'content' => '<p></p>',
168
  * 'expires' => 1563542199,
169
  * );
 
 
 
170
  */
171
- private function do_api_request( $position ) {
 
172
  $default_result = [
173
  'content' => '',
174
  'expires' => self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS,
175
  ];
176
 
177
- $url = untrailingslashit( self::SERVER_URL ) . '/wp-json' . self::REST_ROUTE;
178
- $url = add_query_arg( [ 'plugin' => $this->plugin->getPluginName(), 'position' => $position ], $url );
 
 
 
 
 
 
 
 
 
 
 
 
179
 
180
- $response = wp_remote_get( $url );
181
 
182
- $code = wp_remote_retrieve_response_code( $response );
183
- $body = wp_remote_retrieve_body( $response );
184
 
185
- $data = @json_decode( $body, true );
186
 
187
- if ( is_wp_error( $response ) ) {
188
  return $response;
189
  }
190
 
191
- if ( 200 !== $code ) {
192
- return new \WP_Error( 'http_request_error', 'Failed request to the remote server. Code: ' . $code );
193
  }
194
 
195
- return wp_parse_args( $data, $default_result );
196
  }
197
  }
1
  <?php
2
 
3
+ namespace WBCR\Factory_Adverts_109;
4
 
5
  // Exit if accessed directly
6
+ if( !defined('ABSPATH') ) {
7
  exit;
8
  }
9
 
65
  *
66
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
67
  * @since 1.0.1
68
+ * @var \Wbcr_Factory429_Plugin
69
  */
70
  private $plugin;
71
 
75
  *
76
  * Variable initialization.
77
  *
78
+ * @param \Wbcr_Factory429_Plugin $plugin_name
79
  * @since 1.0.0 Added
80
  *
 
81
  */
82
+ public function __construct(\Wbcr_Factory429_Plugin $plugin)
83
+ {
84
  $this->plugin = $plugin;
85
  }
86
 
87
  /**
88
  * Get adverts content.
89
  *
 
 
 
90
  * @param $position
91
  *
92
  * @return string|\WP_Error
93
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
94
+ * @since 1.0.1
95
+ *
96
  */
97
+ public function get_content($position)
98
+ {
99
+ $data = $this->get_cache($position);
100
 
101
+ if( is_wp_error($data) ) {
102
  return $data;
103
  }
104
 
105
+ return strip_tags($data['content'], '<b>,<a>,<i>,<strong>,<img>,<ul>,<ol>,<li>');
106
  }
107
 
108
  /**
110
  *
111
  * If data in the cache, not empty and not expired, then get data from cache. Or get data from server.
112
  *
 
 
 
 
 
113
  * @return mixed array(
114
  * 'plugin' => 'wbcr_insert_php',
115
  * 'content' => '<p></p>',
116
  * 'expires' => 1563542199,
117
  * );
118
+ * @since 1.0.1 Полностью переписан, с перехватом api ошибок
119
+ * @since 1.0.0 Added
120
+ *
121
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
122
+ *
123
  */
124
+ private function get_cache($position)
125
+ {
126
 
127
+ if( defined('FACTORY_ADVERTS_DEBUG') && FACTORY_ADVERTS_DEBUG ) {
128
+ return $this->do_api_request($position);
129
  }
130
 
131
+ $key = $this->plugin->getPrefix() . md5($position . 'adverts_transient_');
132
+
133
+ if( 'ru_RU' === get_locale() ) {
134
+ $key .= 'ru_';
135
+ }
136
 
137
+ $cached = get_transient($key);
138
 
139
+ if( $cached !== false ) {
140
+ if( isset($cached['error_code']) && isset($cached['error']) ) {
141
+ return new \WP_Error($cached['error_code'], $cached['error']);
142
  }
143
 
144
  return $cached;
145
  }
146
 
147
+ $data = $this->do_api_request($position);
148
 
149
+ if( is_wp_error($data) ) {
150
+ set_transient($key, [
151
+ 'error' => $data->get_error_message(),
152
  'error_code' => $data->get_error_code()
153
+ ], self::SERVER_UNAVAILABLE_INTERVAL * HOUR_IN_SECONDS);
154
 
155
  return $data;
156
  }
157
 
158
+ set_transient($key, $data, self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS);
159
 
160
  return $data;
161
  }
166
  * In some case on the server (Apache) in the .htaccess must be set
167
  * RewriteRule ^wp-json/(.*)[?](.*) /?rest_route=/$1&$2 [L]
168
  *
 
 
 
169
  * @return mixed array(
170
  * 'plugin' => 'wbcr_insert_php',
171
  * 'content' => '<p></p>',
172
  * 'expires' => 1563542199,
173
  * );
174
+ * @since 1.0.0 Added
175
+ *
176
+ * @since 1.0.1 Добавлен перехват ошибок, рефакторинг кода.
177
  */
178
+ private function do_api_request($position)
179
+ {
180
  $default_result = [
181
  'content' => '',
182
  'expires' => self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS,
183
  ];
184
 
185
+ $url = untrailingslashit(self::SERVER_URL) . '/wp-json' . self::REST_ROUTE;
186
+
187
+ $ads_ID = $this->plugin->getPluginName();
188
+
189
+ if( 'ru_RU' === get_locale() ) {
190
+ $ads_ID .= '-ru';
191
+ }
192
+
193
+ $url = add_query_arg([
194
+ 'plugin' => $ads_ID,
195
+ 'position' => $position,
196
+ 'plugin_title' => $this->plugin->getPluginTitle(),
197
+ 'lang' => get_locale()
198
+ ], $url);
199
 
200
+ $response = wp_remote_get($url);
201
 
202
+ $code = wp_remote_retrieve_response_code($response);
203
+ $body = wp_remote_retrieve_body($response);
204
 
205
+ $data = @json_decode($body, true);
206
 
207
+ if( is_wp_error($response) ) {
208
  return $response;
209
  }
210
 
211
+ if( 200 !== $code ) {
212
+ return new \WP_Error('http_request_error', 'Failed request to the remote server. Code: ' . $code);
213
  }
214
 
215
+ return wp_parse_args($data, $default_result);
216
  }
217
  }
libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.mo → wbcr_factory_adverts_109-ru_RU.mo} RENAMED
File without changes
libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.po → wbcr_factory_adverts_109-ru_RU.po} RENAMED
File without changes
libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .factory-accordion{margin:0 0 30px;border-top:1px solid #DDD;border-right:1px solid #DDD;border-left:1px solid #DDD;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.factory-bootstrap-421 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-421 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-421 .factory-accordion-item{display:none}.factory-bootstrap-421 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-421 .factory-accordion>h3.active:hover{cursor:default}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .factory-accordion{margin:0 0 30px;border-top:1px solid #DDD;border-right:1px solid #DDD;border-left:1px solid #DDD;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.factory-bootstrap-430 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-430 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-430 .factory-accordion-item{display:none}.factory-bootstrap-430 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-430 .factory-accordion>h3.active:hover{cursor:default}
libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .btn-primary{background:#e1a948;border-color:#d39323;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#e1a948;border-color:#d39323}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .btn-primary{background:#e1a948;border-color:#d39323;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:active{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-430 .btn-primary:disabled,.factory-bootstrap-430 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-430 .btn-group .btn.active.value{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{background-color:#e1a948;border-color:#d39323}
libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .btn-primary{background:#c7a589;border-color:#b78a66;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#c7a589;border-color:#b78a66}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .btn-primary{background:#c7a589;border-color:#b78a66;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:active{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-430 .btn-primary:disabled,.factory-bootstrap-430 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-430 .btn-group .btn.active.value{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{background-color:#c7a589;border-color:#b78a66}
libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css CHANGED
@@ -8,7 +8,7 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 article,.factory-bootstrap-421 aside,.factory-bootstrap-421 details,.factory-bootstrap-421 figcaption,.factory-bootstrap-421 figure,.factory-bootstrap-421 footer,.factory-bootstrap-421 header,.factory-bootstrap-421 hgroup,.factory-bootstrap-421 main,.factory-bootstrap-421 nav,.factory-bootstrap-421 section,.factory-bootstrap-421 summary{display:block}.factory-bootstrap-421 audio,.factory-bootstrap-421 canvas,.factory-bootstrap-421 video{display:inline-block}.factory-bootstrap-421 audio:not([controls]){display:none;height:0}.factory-bootstrap-421 [hidden],.factory-bootstrap-421 template{display:none}.factory-bootstrap-421 body{margin:0}.factory-bootstrap-421 a{background:0 0}.factory-bootstrap-421 a:focus{outline:thin dotted}.factory-bootstrap-421 a:active,.factory-bootstrap-421 a:hover{outline:0}.factory-bootstrap-421 h1{margin:.67em 0}.factory-bootstrap-421 b,.factory-bootstrap-421 strong{font-weight:700}.factory-bootstrap-421 dfn{font-style:italic}.factory-bootstrap-421 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-421 mark{color:#000;background:#ff0}.factory-bootstrap-421 code,.factory-bootstrap-421 kbd,.factory-bootstrap-421 pre,.factory-bootstrap-421 samp{font-size:1em}.factory-bootstrap-421 pre{white-space:pre-wrap}.factory-bootstrap-421 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-421 sub,.factory-bootstrap-421 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-421 sup{top:-.5em}.factory-bootstrap-421 sub{bottom:-.25em}.factory-bootstrap-421 img{border:0}.factory-bootstrap-421 svg:not(:root){overflow:hidden}.factory-bootstrap-421 figure{margin:0}.factory-bootstrap-421 button,.factory-bootstrap-421 input,.factory-bootstrap-421 select,.factory-bootstrap-421 textarea{margin:0}.factory-bootstrap-421 button,.factory-bootstrap-421 select{text-transform:none}.factory-bootstrap-421 select{padding-right:4px!important}.factory-bootstrap-421 button,.factory-bootstrap-421 input[type=reset],.factory-bootstrap-421 input[type=submit],html .factory-bootstrap-421 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-421 button[disabled],html .factory-bootstrap-421 input[disabled]{cursor:default}.factory-bootstrap-421 input[type=checkbox],.factory-bootstrap-421 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-421 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-421 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-421 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-421 button::-moz-focus-inner,.factory-bootstrap-421 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-421 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-421 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-421 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-421 a,.factory-bootstrap-421 a:visited{text-decoration:underline}.factory-bootstrap-421 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-421 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-421 a[href^="javascript:"]:after,.factory-bootstrap-421 a[href^="#"]:after{content:""}.factory-bootstrap-421 blockquote,.factory-bootstrap-421 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-421 thead{display:table-header-group}.factory-bootstrap-421 img,.factory-bootstrap-421 tr{page-break-inside:avoid}.factory-bootstrap-421 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-421 h2,.factory-bootstrap-421 h3,.factory-bootstrap-421 p{orphans:3;widows:3}.factory-bootstrap-421 h2,.factory-bootstrap-421 h3{page-break-after:avoid}.factory-bootstrap-421 select{background:#fff!important}.factory-bootstrap-421 .navbar{display:none}.factory-bootstrap-421 .table td,.factory-bootstrap-421 .table th{background-color:#fff!important}.factory-bootstrap-421 .btn>.caret,.factory-bootstrap-421 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-421 .label{border:1px solid #000}.factory-bootstrap-421 .table{border-collapse:collapse!important}.factory-bootstrap-421 .table-bordered td,.factory-bootstrap-421 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-421 *,.factory-bootstrap-421 :after,.factory-bootstrap-421 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-421{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-421 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-421 button,.factory-bootstrap-421 input,.factory-bootstrap-421 select,.factory-bootstrap-421 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-421 img{vertical-align:middle}.factory-bootstrap-421 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-421 .img-rounded{border-radius:6px}.factory-bootstrap-421 .img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-421 .img-circle{border-radius:50%}.factory-bootstrap-421 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-421 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-421 .h1,.factory-bootstrap-421 .h2,.factory-bootstrap-421 .h3,.factory-bootstrap-421 .h4,.factory-bootstrap-421 .h5,.factory-bootstrap-421 .h6,.factory-bootstrap-421 h1,.factory-bootstrap-421 h2,.factory-bootstrap-421 h3,.factory-bootstrap-421 h4,.factory-bootstrap-421 h5,.factory-bootstrap-421 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-421 .h1 .small,.factory-bootstrap-421 .h1 small,.factory-bootstrap-421 .h2 .small,.factory-bootstrap-421 .h2 small,.factory-bootstrap-421 .h3 .small,.factory-bootstrap-421 .h3 small,.factory-bootstrap-421 .h4 .small,.factory-bootstrap-421 .h4 small,.factory-bootstrap-421 .h5 .small,.factory-bootstrap-421 .h5 small,.factory-bootstrap-421 .h6 .small,.factory-bootstrap-421 .h6 small,.factory-bootstrap-421 h1 .small,.factory-bootstrap-421 h1 small,.factory-bootstrap-421 h2 .small,.factory-bootstrap-421 h2 small,.factory-bootstrap-421 h3 .small,.factory-bootstrap-421 h3 small,.factory-bootstrap-421 h4 .small,.factory-bootstrap-421 h4 small,.factory-bootstrap-421 h5 .small,.factory-bootstrap-421 h5 small,.factory-bootstrap-421 h6 .small,.factory-bootstrap-421 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-421 h1,.factory-bootstrap-421 h2,.factory-bootstrap-421 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-421 h1 .small,.factory-bootstrap-421 h1 small,.factory-bootstrap-421 h2 .small,.factory-bootstrap-421 h2 small,.factory-bootstrap-421 h3 .small,.factory-bootstrap-421 h3 small{font-size:65%}.factory-bootstrap-421 h4,.factory-bootstrap-421 h5,.factory-bootstrap-421 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-421 h4 .small,.factory-bootstrap-421 h4 small,.factory-bootstrap-421 h5 .small,.factory-bootstrap-421 h5 small,.factory-bootstrap-421 h6 .small,.factory-bootstrap-421 h6 small{font-size:75%}.factory-bootstrap-421 .h1,.factory-bootstrap-421 h1{font-size:36px}.factory-bootstrap-421 .h2,.factory-bootstrap-421 h2{font-size:30px}.factory-bootstrap-421 .h3,.factory-bootstrap-421 h3{font-size:24px}.factory-bootstrap-421 .h4,.factory-bootstrap-421 h4{font-size:18px}.factory-bootstrap-421 .h5,.factory-bootstrap-421 h5{font-size:14px}.factory-bootstrap-421 .h6,.factory-bootstrap-421 h6{font-size:12px}.factory-bootstrap-421 p{margin:0 0 10px}.factory-bootstrap-421 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-421 .small,.factory-bootstrap-421 small{font-size:85%}.factory-bootstrap-421 cite{font-style:normal}.factory-bootstrap-421 .text-muted{color:#999}.factory-bootstrap-421 .text-primary{color:#428bca}.factory-bootstrap-421 .text-primary:hover{color:#3071a9}.factory-bootstrap-421 .text-warning{color:#8a6d3b}.factory-bootstrap-421 .text-warning:hover{color:#66512c}.factory-bootstrap-421 .text-danger{color:#a94442}.factory-bootstrap-421 .text-danger:hover{color:#843534}.factory-bootstrap-421 .text-success{color:#3c763d}.factory-bootstrap-421 .text-success:hover{color:#2b542c}.factory-bootstrap-421 .text-info{color:#31708f}.factory-bootstrap-421 .text-info:hover{color:#245269}.factory-bootstrap-421 .text-left{text-align:left}.factory-bootstrap-421 .text-right{text-align:right}.factory-bootstrap-421 .text-center{text-align:center}.factory-bootstrap-421 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-421 ol,.factory-bootstrap-421 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-421 ol ol,.factory-bootstrap-421 ol ul,.factory-bootstrap-421 ul ol,.factory-bootstrap-421 ul ul{margin-bottom:0}.factory-bootstrap-421 .list-inline,.factory-bootstrap-421 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-421 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-421 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-421 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-421 dd,.factory-bootstrap-421 dt{line-height:1.428571429}.factory-bootstrap-421 dt{font-weight:700}.factory-bootstrap-421 dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:after,.dl-horizontal dd:before{display:table;content:" "}.dl-horizontal dd:after{clear:both}}.factory-bootstrap-421 abbr[data-original-title],.factory-bootstrap-421 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-421 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-421 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-421 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-421 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-421 blockquote .small,.factory-bootstrap-421 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-421 blockquote .small:before,.factory-bootstrap-421 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-421 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-421 blockquote.pull-right .small,.factory-bootstrap-421 blockquote.pull-right p,.factory-bootstrap-421 blockquote.pull-right small{text-align:right}.factory-bootstrap-421 blockquote.pull-right .small:before,.factory-bootstrap-421 blockquote.pull-right small:before{content:''}.factory-bootstrap-421 blockquote.pull-right .small:after,.factory-bootstrap-421 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-421 blockquote:after,.factory-bootstrap-421 blockquote:before{content:""}.factory-bootstrap-421 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-421 code,.factory-bootstrap-421 kbd,.factory-bootstrap-421 pre,.factory-bootstrap-421 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-421 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-421 pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-421 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-421 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-421 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-421 .container:after,.factory-bootstrap-421 .container:before{display:table;content:" "}.factory-bootstrap-421 .container:after{clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.factory-bootstrap-421 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-421 .row:after,.factory-bootstrap-421 .row:before{display:table;content:" "}.factory-bootstrap-421 .row:after{clear:both}.factory-bootstrap-421 .col-lg-1,.factory-bootstrap-421 .col-lg-10,.factory-bootstrap-421 .col-lg-11,.factory-bootstrap-421 .col-lg-12,.factory-bootstrap-421 .col-lg-2,.factory-bootstrap-421 .col-lg-3,.factory-bootstrap-421 .col-lg-4,.factory-bootstrap-421 .col-lg-5,.factory-bootstrap-421 .col-lg-6,.factory-bootstrap-421 .col-lg-7,.factory-bootstrap-421 .col-lg-8,.factory-bootstrap-421 .col-lg-9,.factory-bootstrap-421 .col-md-1,.factory-bootstrap-421 .col-md-10,.factory-bootstrap-421 .col-md-11,.factory-bootstrap-421 .col-md-12,.factory-bootstrap-421 .col-md-2,.factory-bootstrap-421 .col-md-3,.factory-bootstrap-421 .col-md-4,.factory-bootstrap-421 .col-md-5,.factory-bootstrap-421 .col-md-6,.factory-bootstrap-421 .col-md-7,.factory-bootstrap-421 .col-md-8,.factory-bootstrap-421 .col-md-9,.factory-bootstrap-421 .col-sm-1,.factory-bootstrap-421 .col-sm-10,.factory-bootstrap-421 .col-sm-11,.factory-bootstrap-421 .col-sm-12,.factory-bootstrap-421 .col-sm-2,.factory-bootstrap-421 .col-sm-3,.factory-bootstrap-421 .col-sm-4,.factory-bootstrap-421 .col-sm-5,.factory-bootstrap-421 .col-sm-6,.factory-bootstrap-421 .col-sm-7,.factory-bootstrap-421 .col-sm-8,.factory-bootstrap-421 .col-sm-9,.factory-bootstrap-421 .col-xs-1,.factory-bootstrap-421 .col-xs-10,.factory-bootstrap-421 .col-xs-11,.factory-bootstrap-421 .col-xs-12,.factory-bootstrap-421 .col-xs-2,.factory-bootstrap-421 .col-xs-3,.factory-bootstrap-421 .col-xs-4,.factory-bootstrap-421 .col-xs-5,.factory-bootstrap-421 .col-xs-6,.factory-bootstrap-421 .col-xs-7,.factory-bootstrap-421 .col-xs-8,.factory-bootstrap-421 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-421 .col-xs-1,.factory-bootstrap-421 .col-xs-10,.factory-bootstrap-421 .col-xs-11,.factory-bootstrap-421 .col-xs-12,.factory-bootstrap-421 .col-xs-2,.factory-bootstrap-421 .col-xs-3,.factory-bootstrap-421 .col-xs-4,.factory-bootstrap-421 .col-xs-5,.factory-bootstrap-421 .col-xs-6,.factory-bootstrap-421 .col-xs-7,.factory-bootstrap-421 .col-xs-8,.factory-bootstrap-421 .col-xs-9{float:left}.factory-bootstrap-421 .col-xs-12{width:100%}.factory-bootstrap-421 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-421 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-421 .col-xs-9{width:75%}.factory-bootstrap-421 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-421 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-421 .col-xs-6{width:50%}.factory-bootstrap-421 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-421 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-421 .col-xs-3{width:25%}.factory-bootstrap-421 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-421 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-421 .col-xs-pull-12{right:100%}.factory-bootstrap-421 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-421 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-421 .col-xs-pull-9{right:75%}.factory-bootstrap-421 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-421 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-421 .col-xs-pull-6{right:50%}.factory-bootstrap-421 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-421 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-421 .col-xs-pull-3{right:25%}.factory-bootstrap-421 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-421 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-421 .col-xs-pull-0{right:0}.factory-bootstrap-421 .col-xs-push-12{left:100%}.factory-bootstrap-421 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-421 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-421 .col-xs-push-9{left:75%}.factory-bootstrap-421 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-421 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-421 .col-xs-push-6{left:50%}.factory-bootstrap-421 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-421 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-421 .col-xs-push-3{left:25%}.factory-bootstrap-421 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-421 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-421 .col-xs-push-0{left:0}.factory-bootstrap-421 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-421 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-421 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-421 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-421 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-421 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-421 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-421 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-421 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-421 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-421 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-421 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-421 .col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}.factory-bootstrap-421 table{max-width:100%;background-color:transparent}.factory-bootstrap-421 th{text-align:left}.factory-bootstrap-421 .table{width:100%;margin-bottom:20px}.factory-bootstrap-421 .table>tbody>tr>td,.factory-bootstrap-421 .table>tbody>tr>th,.factory-bootstrap-421 .table>tfoot>tr>td,.factory-bootstrap-421 .table>tfoot>tr>th,.factory-bootstrap-421 .table>thead>tr>td,.factory-bootstrap-421 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-421 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-421 .table>caption+thead>tr:first-child>td,.factory-bootstrap-421 .table>caption+thead>tr:first-child>th,.factory-bootstrap-421 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-421 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-421 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-421 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-421 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-421 .table .table{background-color:#fff}.factory-bootstrap-421 .table-condensed>tbody>tr>td,.factory-bootstrap-421 .table-condensed>tbody>tr>th,.factory-bootstrap-421 .table-condensed>tfoot>tr>td,.factory-bootstrap-421 .table-condensed>tfoot>tr>th,.factory-bootstrap-421 .table-condensed>thead>tr>td,.factory-bootstrap-421 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-421 .table-bordered,.factory-bootstrap-421 .table-bordered>tbody>tr>td,.factory-bootstrap-421 .table-bordered>tbody>tr>th,.factory-bootstrap-421 .table-bordered>tfoot>tr>td,.factory-bootstrap-421 .table-bordered>tfoot>tr>th,.factory-bootstrap-421 .table-bordered>thead>tr>td,.factory-bootstrap-421 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-421 .table-bordered>thead>tr>td,.factory-bootstrap-421 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-421 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-421 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-421 .table-hover>tbody>tr:hover>td,.factory-bootstrap-421 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-421 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-421 table td[class*=col-],.factory-bootstrap-421 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-421 .table>tbody>.active>td,.factory-bootstrap-421 .table>tbody>.active>th,.factory-bootstrap-421 .table>tbody>tr>.active,.factory-bootstrap-421 .table>tfoot>.active>td,.factory-bootstrap-421 .table>tfoot>.active>th,.factory-bootstrap-421 .table>tfoot>tr>.active,.factory-bootstrap-421 .table>thead>.active>td,.factory-bootstrap-421 .table>thead>.active>th,.factory-bootstrap-421 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-421 .table-hover>tbody>.active:hover>td,.factory-bootstrap-421 .table-hover>tbody>.active:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-421 .table>tbody>.success>td,.factory-bootstrap-421 .table>tbody>.success>th,.factory-bootstrap-421 .table>tbody>tr>.success,.factory-bootstrap-421 .table>tfoot>.success>td,.factory-bootstrap-421 .table>tfoot>.success>th,.factory-bootstrap-421 .table>tfoot>tr>.success,.factory-bootstrap-421 .table>thead>.success>td,.factory-bootstrap-421 .table>thead>.success>th,.factory-bootstrap-421 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-421 .table-hover>tbody>.success:hover>td,.factory-bootstrap-421 .table-hover>tbody>.success:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-421 .table>tbody>.danger>td,.factory-bootstrap-421 .table>tbody>.danger>th,.factory-bootstrap-421 .table>tbody>tr>.danger,.factory-bootstrap-421 .table>tfoot>.danger>td,.factory-bootstrap-421 .table>tfoot>.danger>th,.factory-bootstrap-421 .table>tfoot>tr>.danger,.factory-bootstrap-421 .table>thead>.danger>td,.factory-bootstrap-421 .table>thead>.danger>th,.factory-bootstrap-421 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-421 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-421 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-421 .table>tbody>.warning>td,.factory-bootstrap-421 .table>tbody>.warning>th,.factory-bootstrap-421 .table>tbody>tr>.warning,.factory-bootstrap-421 .table>tfoot>.warning>td,.factory-bootstrap-421 .table>tfoot>.warning>th,.factory-bootstrap-421 .table>tfoot>tr>.warning,.factory-bootstrap-421 .table>thead>.warning>td,.factory-bootstrap-421 .table>thead>.warning>th,.factory-bootstrap-421 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-421 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-421 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.warning:hover{background-color:#faf2cc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.factory-bootstrap-421 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-421 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-421 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-421 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-421 input[type=checkbox],.factory-bootstrap-421 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-421 input[type=file]{display:block}.factory-bootstrap-421 select[multiple],.factory-bootstrap-421 select[size]{height:auto}.factory-bootstrap-421 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-421 input[type=checkbox]:focus,.factory-bootstrap-421 input[type=file]:focus,.factory-bootstrap-421 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-421 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-421 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-421 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-421 .form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.factory-bootstrap-421 .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-421 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-421 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-421 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-421 .form-control[disabled],.factory-bootstrap-421 .form-control[readonly],.factory-bootstrap-421 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-421 textarea.form-control{height:auto}.factory-bootstrap-421 .form-group{margin-bottom:15px}.factory-bootstrap-421 .checkbox,.factory-bootstrap-421 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-421 .checkbox label,.factory-bootstrap-421 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-421 .checkbox input[type=checkbox],.factory-bootstrap-421 .checkbox-inline input[type=checkbox],.factory-bootstrap-421 .radio input[type=radio],.factory-bootstrap-421 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-421 .checkbox+.checkbox,.factory-bootstrap-421 .radio+.radio{margin-top:-5px}.factory-bootstrap-421 .checkbox-inline,.factory-bootstrap-421 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-421 .checkbox-inline+.checkbox-inline,.factory-bootstrap-421 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-421 .checkbox-inline[disabled],.factory-bootstrap-421 .checkbox[disabled],.factory-bootstrap-421 .radio-inline[disabled],.factory-bootstrap-421 .radio[disabled],.factory-bootstrap-421 fieldset[disabled] .checkbox,.factory-bootstrap-421 fieldset[disabled] .checkbox-inline,.factory-bootstrap-421 fieldset[disabled] .radio,.factory-bootstrap-421 fieldset[disabled] .radio-inline,.factory-bootstrap-421 fieldset[disabled] input[type=checkbox],.factory-bootstrap-421 fieldset[disabled] input[type=radio],.factory-bootstrap-421 input[type=checkbox][disabled],.factory-bootstrap-421 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-421 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-421 textarea.input-sm{height:auto}.factory-bootstrap-421 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-421 textarea.input-lg{height:auto}.factory-bootstrap-421 .has-warning .checkbox,.factory-bootstrap-421 .has-warning .checkbox-inline,.factory-bootstrap-421 .has-warning .control-label,.factory-bootstrap-421 .has-warning .help-block,.factory-bootstrap-421 .has-warning .radio,.factory-bootstrap-421 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-421 .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.factory-bootstrap-421 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-421 .has-error .checkbox,.factory-bootstrap-421 .has-error .checkbox-inline,.factory-bootstrap-421 .has-error .control-label,.factory-bootstrap-421 .has-error .help-block,.factory-bootstrap-421 .has-error .radio,.factory-bootstrap-421 .has-error .radio-inline{color:#a94442}.factory-bootstrap-421 .controls{display:block}.factory-bootstrap-421 .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.factory-bootstrap-421 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-421 .has-success .checkbox,.factory-bootstrap-421 .has-success .checkbox-inline,.factory-bootstrap-421 .has-success .control-label,.factory-bootstrap-421 .has-success .help-block,.factory-bootstrap-421 .has-success .radio,.factory-bootstrap-421 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-421 .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.factory-bootstrap-421 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-421 .form-control-static{margin-bottom:0}.factory-bootstrap-421 .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373;font-weight:400}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}}.factory-bootstrap-421 .form-horizontal .checkbox,.factory-bootstrap-421 .form-horizontal .checkbox-inline,.factory-bootstrap-421 .form-horizontal .control-label,.factory-bootstrap-421 .form-horizontal .radio,.factory-bootstrap-421 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-421 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-421 .form-horizontal .checkbox,.factory-bootstrap-421 .form-horizontal .radio{min-height:27px}.factory-bootstrap-421 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-421 .form-horizontal .form-group:after,.factory-bootstrap-421 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-421 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-421 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-421 .btn{display:inline-block;padding:5px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.factory-bootstrap-421 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-421 .btn{text-decoration:none}.factory-bootstrap-421 .btn:focus,.factory-bootstrap-421 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-421 .btn.disabled,.factory-bootstrap-421 .btn[disabled],.factory-bootstrap-421 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .btn-default:focus,.factory-bootstrap-421 .btn-default:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-421 .btn-default.disabled,.factory-bootstrap-421 .btn-default.disabled.active,.factory-bootstrap-421 .btn-default.disabled:active,.factory-bootstrap-421 .btn-default.disabled:focus,.factory-bootstrap-421 .btn-default.disabled:hover,.factory-bootstrap-421 .btn-default[disabled],.factory-bootstrap-421 .btn-default[disabled].active,.factory-bootstrap-421 .btn-default[disabled]:active,.factory-bootstrap-421 .btn-default[disabled]:focus,.factory-bootstrap-421 .btn-default[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-default,.factory-bootstrap-421 fieldset[disabled] .btn-default.active,.factory-bootstrap-421 fieldset[disabled] .btn-default:active,.factory-bootstrap-421 fieldset[disabled] .btn-default:focus,.factory-bootstrap-421 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-421 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-421 .btn-primary.disabled,.factory-bootstrap-421 .btn-primary.disabled.active,.factory-bootstrap-421 .btn-primary.disabled:active,.factory-bootstrap-421 .btn-primary.disabled:focus,.factory-bootstrap-421 .btn-primary.disabled:hover,.factory-bootstrap-421 .btn-primary[disabled],.factory-bootstrap-421 .btn-primary[disabled].active,.factory-bootstrap-421 .btn-primary[disabled]:active,.factory-bootstrap-421 .btn-primary[disabled]:focus,.factory-bootstrap-421 .btn-primary[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-primary,.factory-bootstrap-421 fieldset[disabled] .btn-primary.active,.factory-bootstrap-421 fieldset[disabled] .btn-primary:active,.factory-bootstrap-421 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-421 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-421 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-421 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active,.factory-bootstrap-421 .btn-warning:focus,.factory-bootstrap-421 .btn-warning:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-421 .btn-warning.disabled,.factory-bootstrap-421 .btn-warning.disabled.active,.factory-bootstrap-421 .btn-warning.disabled:active,.factory-bootstrap-421 .btn-warning.disabled:focus,.factory-bootstrap-421 .btn-warning.disabled:hover,.factory-bootstrap-421 .btn-warning[disabled],.factory-bootstrap-421 .btn-warning[disabled].active,.factory-bootstrap-421 .btn-warning[disabled]:active,.factory-bootstrap-421 .btn-warning[disabled]:focus,.factory-bootstrap-421 .btn-warning[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-warning,.factory-bootstrap-421 fieldset[disabled] .btn-warning.active,.factory-bootstrap-421 fieldset[disabled] .btn-warning:active,.factory-bootstrap-421 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-421 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-421 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-421 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .btn-success:focus,.factory-bootstrap-421 .btn-success:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-421 .btn-success.disabled,.factory-bootstrap-421 .btn-success.disabled.active,.factory-bootstrap-421 .btn-success.disabled:active,.factory-bootstrap-421 .btn-success.disabled:focus,.factory-bootstrap-421 .btn-success.disabled:hover,.factory-bootstrap-421 .btn-success[disabled],.factory-bootstrap-421 .btn-success[disabled].active,.factory-bootstrap-421 .btn-success[disabled]:active,.factory-bootstrap-421 .btn-success[disabled]:focus,.factory-bootstrap-421 .btn-success[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-success,.factory-bootstrap-421 fieldset[disabled] .btn-success.active,.factory-bootstrap-421 fieldset[disabled] .btn-success:active,.factory-bootstrap-421 fieldset[disabled] .btn-success:focus,.factory-bootstrap-421 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-421 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-421 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .btn-info:focus,.factory-bootstrap-421 .btn-info:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-421 .btn-info.disabled,.factory-bootstrap-421 .btn-info.disabled.active,.factory-bootstrap-421 .btn-info.disabled:active,.factory-bootstrap-421 .btn-info.disabled:focus,.factory-bootstrap-421 .btn-info.disabled:hover,.factory-bootstrap-421 .btn-info[disabled],.factory-bootstrap-421 .btn-info[disabled].active,.factory-bootstrap-421 .btn-info[disabled]:active,.factory-bootstrap-421 .btn-info[disabled]:focus,.factory-bootstrap-421 .btn-info[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-info,.factory-bootstrap-421 fieldset[disabled] .btn-info.active,.factory-bootstrap-421 fieldset[disabled] .btn-info:active,.factory-bootstrap-421 fieldset[disabled] .btn-info:focus,.factory-bootstrap-421 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-421 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-421 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-421 .btn-link,.factory-bootstrap-421 .btn-link:active,.factory-bootstrap-421 .btn-link[disabled],.factory-bootstrap-421 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-link,.factory-bootstrap-421 .btn-link:active,.factory-bootstrap-421 .btn-link:focus,.factory-bootstrap-421 .btn-link:hover{border-color:transparent}.factory-bootstrap-421 .btn-link:focus,.factory-bootstrap-421 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-421 .btn-link[disabled]:focus,.factory-bootstrap-421 .btn-link[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-link:focus,.factory-bootstrap-421 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-421 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-421 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-421 input[type=button].btn-block,.factory-bootstrap-421 input[type=reset].btn-block,.factory-bootstrap-421 input[type=submit].btn-block{width:100%}.factory-bootstrap-421 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-421 .fade.in{opacity:1}.factory-bootstrap-421 .collapse{display:none}.factory-bootstrap-421 .collapse.in{display:block}.factory-bootstrap-421 .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.factory-bootstrap-421 .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.factory-bootstrap-421 .glyphicon:empty{width:1em}.factory-bootstrap-421 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-421 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-421 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-421 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-421 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-421 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-421 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-421 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-421 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-421 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-421 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-421 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-421 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-421 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-421 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-421 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-421 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-421 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-421 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-421 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-421 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-421 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-421 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-421 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-421 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-421 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-421 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-421 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-421 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-421 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-421 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-421 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-421 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-421 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-421 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-421 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-421 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-421 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-421 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-421 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-421 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-421 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-421 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-421 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-421 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-421 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-421 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-421 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-421 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-421 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-421 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-421 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-421 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-421 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-421 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-421 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-421 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-421 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-421 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-421 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-421 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-421 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-421 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-421 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-421 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-421 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-421 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-421 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-421 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-421 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-421 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-421 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-421 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-421 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-421 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-421 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-421 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-421 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-421 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-421 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-421 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-421 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-421 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-421 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-421 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-421 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-421 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-421 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-421 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-421 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-421 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-421 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-421 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-421 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-421 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-421 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-421 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-421 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-421 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-421 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-421 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-421 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-421 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-421 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-421 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-421 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-421 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-421 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-421 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-421 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-421 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-421 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-421 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-421 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-421 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-421 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-421 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-421 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-421 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-421 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-421 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-421 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-421 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-421 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-421 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-421 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-421 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-421 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-421 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-421 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-421 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-421 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-421 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-421 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-421 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-421 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-421 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-421 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-421 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-421 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-421 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-421 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-421 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-421 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-421 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-421 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-421 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-421 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-421 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-421 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-421 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-421 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-421 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-421 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-421 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-421 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-421 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-421 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-421 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-421 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-421 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-421 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-421 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-421 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-421 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-421 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-421 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-421 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-421 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-421 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-421 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-421 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-421 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-421 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-421 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-421 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-421 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-421 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-421 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-421 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-421 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-421 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-421 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-421 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-421 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-421 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-421 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-421 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-421 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-421 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-421 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-421 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-421 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-421 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-421 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-421 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-421 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-421 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-421 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-421 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-421 .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.factory-bootstrap-421 .dropdown{position:relative}.factory-bootstrap-421 .dropdown-toggle:focus{outline:0}.factory-bootstrap-421 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.factory-bootstrap-421 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-421 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-421 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.factory-bootstrap-421 .dropdown-menu>li>a:focus,.factory-bootstrap-421 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-421 .dropdown-menu>.active>a,.factory-bootstrap-421 .dropdown-menu>.active>a:focus,.factory-bootstrap-421 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-421 .dropdown-menu>.disabled>a,.factory-bootstrap-421 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-421 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-421 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-421 .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .open>.dropdown-menu{display:block}.factory-bootstrap-421 .open>a{outline:0}.factory-bootstrap-421 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-421 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-421 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-421 .dropup .caret,.factory-bootstrap-421 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-421 .dropup .dropdown-menu,.factory-bootstrap-421 .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.factory-bootstrap-421 .btn-group,.factory-bootstrap-421 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-421 .btn-group-vertical>.btn,.factory-bootstrap-421 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-421 .btn-group-vertical>.btn.active,.factory-bootstrap-421 .btn-group-vertical>.btn:active,.factory-bootstrap-421 .btn-group-vertical>.btn:focus,.factory-bootstrap-421 .btn-group-vertical>.btn:hover,.factory-bootstrap-421 .btn-group>.btn.active,.factory-bootstrap-421 .btn-group>.btn:active,.factory-bootstrap-421 .btn-group>.btn:focus,.factory-bootstrap-421 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-421 .btn-group-vertical>.btn:focus,.factory-bootstrap-421 .btn-group>.btn:focus{outline:0}.factory-bootstrap-421 .btn-group .btn+.btn,.factory-bootstrap-421 .btn-group .btn+.btn-group,.factory-bootstrap-421 .btn-group .btn-group+.btn,.factory-bootstrap-421 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-421 .btn-toolbar:after,.factory-bootstrap-421 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-421 .btn-toolbar:after{clear:both}.factory-bootstrap-421 .btn-toolbar .btn-group{float:left}.factory-bootstrap-421 .btn-toolbar>.btn+.btn,.factory-bootstrap-421 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-421 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-421 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-421 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-421 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-421 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-421 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group>.btn-group{float:left}.factory-bootstrap-421 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-421 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-421 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group .dropdown-toggle:active,.factory-bootstrap-421 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-421 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-421 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-421 .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.factory-bootstrap-421 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-421 .btn-group .btn.active.value{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-421 .btn .caret{margin-left:0}.factory-bootstrap-421 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-421 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-421 .btn-group-vertical>.btn,.factory-bootstrap-421 .btn-group-vertical>.btn-group,.factory-bootstrap-421 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-421 .btn-group-vertical>.btn-group:after,.factory-bootstrap-421 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-421 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-421 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-421 .btn-group-vertical>.btn+.btn,.factory-bootstrap-421 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-421 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-421 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-421 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-421 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-421 .btn-group-justified>.btn,.factory-bootstrap-421 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-421 .btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.factory-bootstrap-421 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-421 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-421 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-421 .input-group-lg>.form-control,.factory-bootstrap-421 .input-group-lg>.input-group-addon,.factory-bootstrap-421 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 select.input-group-lg>.form-control,.factory-bootstrap-421 select.input-group-lg>.input-group-addon,.factory-bootstrap-421 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-421 textarea.input-group-lg>.form-control,.factory-bootstrap-421 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-421 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-421 .input-group-sm>.form-control,.factory-bootstrap-421 .input-group-sm>.input-group-addon,.factory-bootstrap-421 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 select.input-group-sm>.form-control,.factory-bootstrap-421 select.input-group-sm>.input-group-addon,.factory-bootstrap-421 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-421 textarea.input-group-sm>.form-control,.factory-bootstrap-421 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-421 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-421 .input-group .form-control,.factory-bootstrap-421 .input-group-addon,.factory-bootstrap-421 .input-group-btn{display:table-cell}.factory-bootstrap-421 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-421 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-421 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-421 .input-group-addon,.factory-bootstrap-421 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-421 .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-421 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-421 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-421 .input-group-addon input[type=checkbox],.factory-bootstrap-421 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-421 .input-group .form-control:first-child,.factory-bootstrap-421 .input-group-addon:first-child,.factory-bootstrap-421 .input-group-btn:first-child>.btn,.factory-bootstrap-421 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-421 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .input-group-addon:first-child{border-right:0}.factory-bootstrap-421 .input-group .form-control:last-child,.factory-bootstrap-421 .input-group-addon:last-child,.factory-bootstrap-421 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-421 .input-group-btn:last-child>.btn,.factory-bootstrap-421 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .input-group-addon:last-child{border-left:0}.factory-bootstrap-421 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-421 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-421 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-421 .input-group-btn>.btn{position:relative}.factory-bootstrap-421 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-421 .input-group-btn>.btn:active,.factory-bootstrap-421 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-421 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-421 .nav:after,.factory-bootstrap-421 .nav:before{display:table;content:" "}.factory-bootstrap-421 .nav:after{clear:both}.factory-bootstrap-421 .nav>li{position:relative;display:block}.factory-bootstrap-421 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-421 .nav>li>a:focus,.factory-bootstrap-421 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-421 .nav>li.disabled>a{color:#999}.factory-bootstrap-421 .nav>li.disabled>a:focus,.factory-bootstrap-421 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-421 .nav .open>a,.factory-bootstrap-421 .nav .open>a:focus,.factory-bootstrap-421 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-421 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-421 .nav>li>a>img{max-width:none}.factory-bootstrap-421 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-421 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-421 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-421 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-421 .nav-tabs>li.active>a,.factory-bootstrap-421 .nav-tabs>li.active>a:focus,.factory-bootstrap-421 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-421 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-421 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-421 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-421 .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-421 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-421 .nav-pills>li{float:left}.factory-bootstrap-421 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-421 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-421 .nav-pills>li.active>a,.factory-bootstrap-421 .nav-pills>li.active>a:focus,.factory-bootstrap-421 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-421 .nav-stacked>li{float:none}.factory-bootstrap-421 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-421 .nav-justified{width:100%}.factory-bootstrap-421 .nav-justified>li{float:none}.factory-bootstrap-421 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-421 .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-421 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-421 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-421 .nav-tabs-justified>.active>a,.factory-bootstrap-421 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-421 .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-421 .tab-content>.tab-pane{display:none}.factory-bootstrap-421 .tab-content>.active{display:block}.factory-bootstrap-421 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-421 .navbar:after,.factory-bootstrap-421 .navbar:before{display:table;content:" "}.factory-bootstrap-421 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-421 .navbar-header:after,.factory-bootstrap-421 .navbar-header:before{display:table;content:" "}.factory-bootstrap-421 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-421 .navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.factory-bootstrap-421 .navbar-collapse:after,.factory-bootstrap-421 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-421 .navbar-collapse:after{clear:both}.factory-bootstrap-421 .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.factory-bootstrap-421 .container>.navbar-collapse,.factory-bootstrap-421 .container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.factory-bootstrap-421 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-421 .navbar-fixed-bottom,.factory-bootstrap-421 .navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.factory-bootstrap-421 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-421 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-421 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-421 .navbar-brand:focus,.factory-bootstrap-421 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-421 .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-421 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-421 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-421 .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.factory-bootstrap-421 .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.factory-bootstrap-421 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-421 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-421 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-421 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-421 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-421 .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.factory-bootstrap-421 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-421 .navbar-default .navbar-brand:focus,.factory-bootstrap-421 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-nav>li>a,.factory-bootstrap-421 .navbar-default .navbar-text{color:#777}.factory-bootstrap-421 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-421 .navbar-default .navbar-toggle:focus,.factory-bootstrap-421 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-421 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-421 .navbar-default .navbar-collapse,.factory-bootstrap-421 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.factory-bootstrap-421 .navbar-default .navbar-link{color:#777}.factory-bootstrap-421 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-421 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-421 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-421 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-421 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-421 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-421 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-421 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-421 .navbar-inverse .navbar-collapse,.factory-bootstrap-421 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.factory-bootstrap-421 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-421 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-421 .breadcrumb>li{display:inline-block}.factory-bootstrap-421 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-421 .breadcrumb>.active{color:#999}.factory-bootstrap-421 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-421 .pagination>li{display:inline}.factory-bootstrap-421 .pagination>li>a,.factory-bootstrap-421 .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-421 .pagination>li:first-child>a,.factory-bootstrap-421 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-421 .pagination>li:last-child>a,.factory-bootstrap-421 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-421 .pagination>li>a:focus,.factory-bootstrap-421 .pagination>li>a:hover,.factory-bootstrap-421 .pagination>li>span:focus,.factory-bootstrap-421 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-421 .pagination>.disabled>a,.factory-bootstrap-421 .pagination>.disabled>a:focus,.factory-bootstrap-421 .pagination>.disabled>a:hover,.factory-bootstrap-421 .pagination>.disabled>span,.factory-bootstrap-421 .pagination>.disabled>span:focus,.factory-bootstrap-421 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-421 .pagination-lg>li>a,.factory-bootstrap-421 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-421 .pagination-lg>li:first-child>a,.factory-bootstrap-421 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-421 .pagination-lg>li:last-child>a,.factory-bootstrap-421 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-421 .pagination-sm>li>a,.factory-bootstrap-421 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-421 .pagination-sm>li:first-child>a,.factory-bootstrap-421 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-421 .pagination-sm>li:last-child>a,.factory-bootstrap-421 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-421 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-421 .pager:after,.factory-bootstrap-421 .pager:before{display:table;content:" "}.factory-bootstrap-421 .pager:after{clear:both}.factory-bootstrap-421 .pager li{display:inline}.factory-bootstrap-421 .pager li>a,.factory-bootstrap-421 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-421 .pager li>a:focus,.factory-bootstrap-421 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-421 .pager .next>a,.factory-bootstrap-421 .pager .next>span{float:right}.factory-bootstrap-421 .pager .previous>a,.factory-bootstrap-421 .pager .previous>span{float:left}.factory-bootstrap-421 .pager .disabled>a,.factory-bootstrap-421 .pager .disabled>a:focus,.factory-bootstrap-421 .pager .disabled>a:hover,.factory-bootstrap-421 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-421 .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.factory-bootstrap-421 .label[href]:focus,.factory-bootstrap-421 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-421 .label:empty{display:none}.factory-bootstrap-421 .btn .label{position:relative;top:-1px}.factory-bootstrap-421 .label-default{background-color:#999}.factory-bootstrap-421 .label-default[href]:focus,.factory-bootstrap-421 .label-default[href]:hover{background-color:gray}.factory-bootstrap-421 .label-primary{background-color:#428bca}.factory-bootstrap-421 .label-primary[href]:focus,.factory-bootstrap-421 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-421 .label-success{background-color:#5cb85c}.factory-bootstrap-421 .label-success[href]:focus,.factory-bootstrap-421 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-421 .label-info{background-color:#5bc0de}.factory-bootstrap-421 .label-info[href]:focus,.factory-bootstrap-421 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-421 .label-warning{background-color:#f0ad4e}.factory-bootstrap-421 .label-warning[href]:focus,.factory-bootstrap-421 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-421 .label-danger{background-color:#d9534f}.factory-bootstrap-421 .label-danger[href]:focus,.factory-bootstrap-421 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-421 .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.factory-bootstrap-421 .badge:empty{display:none}.factory-bootstrap-421 .btn .badge{position:relative;top:-1px}.factory-bootstrap-421 a.badge:focus,.factory-bootstrap-421 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-421 .nav-pills>.active>a>.badge,.factory-bootstrap-421 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-421 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-421 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-421 .jumbotron .h1,.factory-bootstrap-421 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-421 .jumbotron p{line-height:1.4}.factory-bootstrap-421 .container .jumbotron{border-radius:6px}.factory-bootstrap-421 .jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.factory-bootstrap-421 .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-421 .thumbnail a>img,.factory-bootstrap-421 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-421 a.thumbnail.active,.factory-bootstrap-421 a.thumbnail:focus,.factory-bootstrap-421 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-421 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-421 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-421 .alert .alert-link{font-weight:700}.factory-bootstrap-421 .alert>p,.factory-bootstrap-421 .alert>ul{margin-bottom:0}.factory-bootstrap-421 .alert>p+p{margin-top:5px}.factory-bootstrap-421 .alert-dismissable{padding-right:35px}.factory-bootstrap-421 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-421 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-421 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-421 .alert-info .alert-link{color:#245269}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.factory-bootstrap-421 .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.factory-bootstrap-421 .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#2ea2cc;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.factory-bootstrap-421 .progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.factory-bootstrap-421 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-421 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-421 .progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-421 .progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-421 .progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-421 .progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .media,.factory-bootstrap-421 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-421 .media,.factory-bootstrap-421 .media .media{margin-top:15px}.factory-bootstrap-421 .media:first-child{margin-top:0}.factory-bootstrap-421 .media-object{display:block}.factory-bootstrap-421 .media-heading{margin:0 0 5px}.factory-bootstrap-421 .media>.pull-left{margin-right:10px}.factory-bootstrap-421 .media>.pull-right{margin-left:10px}.factory-bootstrap-421 .media-list{padding-left:0;list-style:none}.factory-bootstrap-421 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-421 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-421 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-421 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-421 .list-group-item>.badge{float:right}.factory-bootstrap-421 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-421 a.list-group-item{color:#555}.factory-bootstrap-421 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-421 a.list-group-item:focus,.factory-bootstrap-421 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-421 a.list-group-item.active,.factory-bootstrap-421 a.list-group-item.active:focus,.factory-bootstrap-421 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-421 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-421 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-421 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-421 a.list-group-item.active .list-group-item-text,.factory-bootstrap-421 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-421 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-421 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-421 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-421 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .panel-body{padding:15px}.factory-bootstrap-421 .panel-body:after,.factory-bootstrap-421 .panel-body:before{display:table;content:" "}.factory-bootstrap-421 .panel-body:after{clear:both}.factory-bootstrap-421 .panel>.list-group{margin-bottom:0}.factory-bootstrap-421 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-421 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-421 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-421 .panel>.table,.factory-bootstrap-421 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-421 .panel>.panel-body+.table,.factory-bootstrap-421 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-421 .panel>.table>tbody:first-child td,.factory-bootstrap-421 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-421 .panel>.table-bordered,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-421 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-421 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-421 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-421 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-421 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-421 .panel-title>a{color:inherit}.factory-bootstrap-421 .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.factory-bootstrap-421 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-421 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-421 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-421 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-421 .panel-group .panel-footer{border-top:0}.factory-bootstrap-421 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-421 .panel-default{border-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-421 .panel-primary{border-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-421 .panel-success{border-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-421 .panel-warning{border-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-421 .panel-danger{border-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-421 .panel-info{border-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-421 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-421 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-421 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-421 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-421 .close{float:right;font-size:14px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.3;filter:alpha(opacity=30)}.factory-bootstrap-421 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-421 .close:focus,.factory-bootstrap-421 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-421 .modal-open{overflow:hidden}.factory-bootstrap-421 .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll;width:auto;margin-left:0;background-color:transparent;border:0}.factory-bootstrap-421 .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.factory-bootstrap-421 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-421 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-421 .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box}.factory-bootstrap-421 .modal-backdrop,.factory-bootstrap-421-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-421 .modal-backdrop.fade,.factory-bootstrap-421-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-421 .modal-backdrop.in,.factory-bootstrap-421-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-421 .modal-header .close{margin-top:-2px}.factory-bootstrap-421 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-421 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-421 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-421 .modal-footer:after,.factory-bootstrap-421 .modal-footer:before{display:table;content:" "}.factory-bootstrap-421 .modal-footer:after{clear:both}.factory-bootstrap-421 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-421 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-421 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-421 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-421 .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.factory-bootstrap-421 .tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.factory-bootstrap-421 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-421 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-421 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-421 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-421 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-421 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-421 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-421 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-421 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-421 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.factory-bootstrap-421 .popover.top{margin-top:-10px}.factory-bootstrap-421 .popover.right{margin-left:10px}.factory-bootstrap-421 .popover.bottom{margin-top:10px}.factory-bootstrap-421 .popover.left{margin-left:-10px}.factory-bootstrap-421 .popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.factory-bootstrap-421 .popover-content{padding:9px 14px}.factory-bootstrap-421 .popover .arrow,.factory-bootstrap-421 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-421 .popover .arrow{border-width:11px}.factory-bootstrap-421 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-421 .popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.factory-bootstrap-421 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-421 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.factory-bootstrap-421 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-421 .popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.factory-bootstrap-421 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-421 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.factory-bootstrap-421 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-421 .carousel{position:relative}.factory-bootstrap-421 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-421 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-421 .carousel-inner>.item>a>img,.factory-bootstrap-421 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-421 .carousel-inner>.active,.factory-bootstrap-421 .carousel-inner>.next,.factory-bootstrap-421 .carousel-inner>.prev{display:block}.factory-bootstrap-421 .carousel-inner>.active{left:0}.factory-bootstrap-421 .carousel-inner>.next,.factory-bootstrap-421 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-421 .carousel-inner>.next{left:100%}.factory-bootstrap-421 .carousel-inner>.prev{left:-100%}.factory-bootstrap-421 .carousel-inner>.next.left,.factory-bootstrap-421 .carousel-inner>.prev.right{left:0}.factory-bootstrap-421 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-421 .carousel-inner>.active.right{left:100%}.factory-bootstrap-421 .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 .carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.factory-bootstrap-421 .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.factory-bootstrap-421 .carousel-control:focus,.factory-bootstrap-421 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-421 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-421 .carousel-control .icon-next,.factory-bootstrap-421 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-421 .carousel-control .icon-prev{left:50%}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-421 .carousel-control .icon-next{right:50%}.factory-bootstrap-421 .carousel-control .icon-next,.factory-bootstrap-421 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-421 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-421 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-421 .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.factory-bootstrap-421 .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.factory-bootstrap-421 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-421 .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.factory-bootstrap-421 .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.factory-bootstrap-421 .clearfix:after,.factory-bootstrap-421 .clearfix:before{display:table;content:" "}.factory-bootstrap-421 .clearfix:after{clear:both}.factory-bootstrap-421 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-421 .pull-right{float:right!important}.factory-bootstrap-421 .pull-left{float:left!important}.factory-bootstrap-421 .hide{display:none!important}.factory-bootstrap-421 .show{display:block!important}.factory-bootstrap-421 .invisible{visibility:hidden}.factory-bootstrap-421 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-421 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-421 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-421 .visible-lg,.factory-bootstrap-421 .visible-md,.factory-bootstrap-421 .visible-sm,.factory-bootstrap-421 .visible-xs,.factory-bootstrap-421 td.visible-lg,.factory-bootstrap-421 td.visible-md,.factory-bootstrap-421 td.visible-sm,.factory-bootstrap-421 td.visible-xs,.factory-bootstrap-421 th.visible-lg,.factory-bootstrap-421 th.visible-md,.factory-bootstrap-421 th.visible-sm,.factory-bootstrap-421 th.visible-xs,.factory-bootstrap-421 tr.visible-lg,.factory-bootstrap-421 tr.visible-md,.factory-bootstrap-421 tr.visible-sm,.factory-bootstrap-421 tr.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.factory-bootstrap-421 .hidden-xs{display:block!important}.factory-bootstrap-421 table.hidden-xs{display:table}.factory-bootstrap-421 tr.hidden-xs{display:table-row!important}.factory-bootstrap-421 td.hidden-xs,.factory-bootstrap-421 th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-sm{display:block!important}.factory-bootstrap-421 table.hidden-sm{display:table}.factory-bootstrap-421 tr.hidden-sm{display:table-row!important}.factory-bootstrap-421 td.hidden-sm,.factory-bootstrap-421 th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-md{display:block!important}.factory-bootstrap-421 table.hidden-md{display:table}.factory-bootstrap-421 tr.hidden-md{display:table-row!important}.factory-bootstrap-421 td.hidden-md,.factory-bootstrap-421 th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-lg{display:block!important}.factory-bootstrap-421 table.hidden-lg{display:table}.factory-bootstrap-421 tr.hidden-lg{display:table-row!important}.factory-bootstrap-421 td.hidden-lg,.factory-bootstrap-421 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-421 .hidden-lg.hidden-xs,.factory-bootstrap-421 td.hidden-lg.hidden-xs,.factory-bootstrap-421 th.hidden-lg.hidden-xs,.factory-bootstrap-421 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-421 .hidden-lg.hidden-sm,.factory-bootstrap-421 td.hidden-lg.hidden-sm,.factory-bootstrap-421 th.hidden-lg.hidden-sm,.factory-bootstrap-421 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-421 .hidden-lg.hidden-md,.factory-bootstrap-421 td.hidden-lg.hidden-md,.factory-bootstrap-421 th.hidden-lg.hidden-md,.factory-bootstrap-421 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-421 .hidden-lg,.factory-bootstrap-421 td.hidden-lg,.factory-bootstrap-421 th.hidden-lg,.factory-bootstrap-421 tr.hidden-lg{display:none!important}}.factory-bootstrap-421 .visible-print,.factory-bootstrap-421 td.visible-print,.factory-bootstrap-421 th.visible-print,.factory-bootstrap-421 tr.visible-print{display:none!important}@media print{.factory-bootstrap-421 .visible-print{display:block!important}.factory-bootstrap-421 table.visible-print{display:table}.factory-bootstrap-421 tr.visible-print{display:table-row!important}.factory-bootstrap-421 td.visible-print,.factory-bootstrap-421 th.visible-print{display:table-cell!important}.factory-bootstrap-421 .hidden-print,.factory-bootstrap-421 td.hidden-print,.factory-bootstrap-421 th.hidden-print,.factory-bootstrap-421 tr.hidden-print{display:none!important}}/*!
12
  * Factory Default Bootstrap Theme
13
  *
14
  * The code is based on Bootstrap v2.1.1
@@ -22,4 +22,4 @@
22
  *
23
  * @package factory-bootstrap
24
  * @since 1.0.0
25
- */.factory-bootstrap-421 .btn-danger,.factory-bootstrap-421 .btn-default,.factory-bootstrap-421 .btn-info,.factory-bootstrap-421 .btn-primary,.factory-bootstrap-421 .btn-success,.factory-bootstrap-421 .btn-warning{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .btn-danger.active,.factory-bootstrap-421 .btn-danger:active,.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.factory-bootstrap-421 .btn.active,.factory-bootstrap-421 .btn:active{background-image:none}.factory-bootstrap-421 .btn-default{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-421 .btn-gold{font-weight:700;padding:7px 12px;cursor:pointer;line-height:16px;display:inline-block;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:#e3e3e3 0 1px 1px;-moz-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);-webkit-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);text-shadow:1px 1px 0 #ffe8b2;color:#7c5d1b;border:1px solid #d6a437;background:#feeb80}.factory-bootstrap-421 .btn-gold:focus,.factory-bootstrap-421 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-421 .btn-gold.active,.factory-bootstrap-421 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-421 .btn-primary{background:#2ea2cc;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#fff;text-decoration:none}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#1e8cbe;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.6);box-shadow:inset 0 1px 0 rgba(120,200,230,.6);color:#fff}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-421 .btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-success:focus,.factory-bootstrap-421 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-421 .btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-warning:focus,.factory-bootstrap-421 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-421 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-421 .btn-danger.active,.factory-bootstrap-421 .btn-danger:active,.factory-bootstrap-421 .btn-danger:focus,.factory-bootstrap-421 .btn-danger:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-421 .btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-info:focus,.factory-bootstrap-421 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-421 .img-thumbnail,.factory-bootstrap-421 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-421 .dropdown-menu>li>a:focus,.factory-bootstrap-421 .dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-421 .dropdown-menu>.active>a,.factory-bootstrap-421 .dropdown-menu>.active>a:focus,.factory-bootstrap-421 .dropdown-menu>.active>a:hover{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-421 .navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.factory-bootstrap-421 .navbar-brand,.factory-bootstrap-421 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-421 .navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.factory-bootstrap-421 .navbar-inverse .navbar-brand,.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-421 .navbar-fixed-bottom,.factory-bootstrap-421 .navbar-fixed-top,.factory-bootstrap-421 .navbar-static-top{border-radius:0}.factory-bootstrap-421 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-421 .alert .actions{padding-top:10px}.factory-bootstrap-421 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-421 .alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0)}.factory-bootstrap-421 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-421 .alert-normal,.factory-bootstrap-421 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-421 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-421 .alert-danger a:not(.btn),.factory-bootstrap-421 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-421 .progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.factory-bootstrap-421 .progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.factory-bootstrap-421 .progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.factory-bootstrap-421 .progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.factory-bootstrap-421 .progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.factory-bootstrap-421 .progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.factory-bootstrap-421 .list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-421 .list-group-item.active,.factory-bootstrap-421 .list-group-item.active:focus,.factory-bootstrap-421 .list-group-item.active:hover{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0)}.factory-bootstrap-421 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-421 .panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-421 .panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-421 .panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.factory-bootstrap-421 .panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.factory-bootstrap-421 .panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.factory-bootstrap-421 .panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.factory-bootstrap-421 .well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.factory-bootstrap-421 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-421 .factory-hidden{display:none}.factory-bootstrap-421 .factory-ajax-loader{width:25px;height:25px;background:url(../assets/images/loader-sm-tr.gif)}.factory-control-error{background-color:rgba(0,0,0,.8);white-space:normal;z-index:10;font-weight:400;line-height:150%;border-radius:4px;color:#fff;font-size:13px;margin-top:5px;padding:4px 10px 3px;max-width:500px;display:inline-block}.factory-control-error i{margin:0 7px 0 1px}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 article,.factory-bootstrap-430 aside,.factory-bootstrap-430 details,.factory-bootstrap-430 figcaption,.factory-bootstrap-430 figure,.factory-bootstrap-430 footer,.factory-bootstrap-430 header,.factory-bootstrap-430 hgroup,.factory-bootstrap-430 main,.factory-bootstrap-430 nav,.factory-bootstrap-430 section,.factory-bootstrap-430 summary{display:block}.factory-bootstrap-430 audio,.factory-bootstrap-430 canvas,.factory-bootstrap-430 video{display:inline-block}.factory-bootstrap-430 audio:not([controls]){display:none;height:0}.factory-bootstrap-430 [hidden],.factory-bootstrap-430 template{display:none}.factory-bootstrap-430 body{margin:0}.factory-bootstrap-430 a{background:0 0}.factory-bootstrap-430 a:focus{outline:thin dotted}.factory-bootstrap-430 a:active,.factory-bootstrap-430 a:hover{outline:0}.factory-bootstrap-430 h1{margin:.67em 0}.factory-bootstrap-430 b,.factory-bootstrap-430 strong{font-weight:700}.factory-bootstrap-430 dfn{font-style:italic}.factory-bootstrap-430 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-430 mark{color:#000;background:#ff0}.factory-bootstrap-430 code,.factory-bootstrap-430 kbd,.factory-bootstrap-430 pre,.factory-bootstrap-430 samp{font-size:1em}.factory-bootstrap-430 pre{white-space:pre-wrap}.factory-bootstrap-430 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-430 sub,.factory-bootstrap-430 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-430 sup{top:-.5em}.factory-bootstrap-430 sub{bottom:-.25em}.factory-bootstrap-430 img{border:0}.factory-bootstrap-430 svg:not(:root){overflow:hidden}.factory-bootstrap-430 figure{margin:0}.factory-bootstrap-430 button,.factory-bootstrap-430 input,.factory-bootstrap-430 select,.factory-bootstrap-430 textarea{margin:0}.factory-bootstrap-430 button,.factory-bootstrap-430 select{text-transform:none}.factory-bootstrap-430 select{padding-right:4px!important}.factory-bootstrap-430 button,.factory-bootstrap-430 input[type=reset],.factory-bootstrap-430 input[type=submit],html .factory-bootstrap-430 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-430 button[disabled],html .factory-bootstrap-430 input[disabled]{cursor:default}.factory-bootstrap-430 input[type=checkbox],.factory-bootstrap-430 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-430 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-430 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-430 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-430 button::-moz-focus-inner,.factory-bootstrap-430 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-430 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-430 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-430 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-430 a,.factory-bootstrap-430 a:visited{text-decoration:underline}.factory-bootstrap-430 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-430 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-430 a[href^="javascript:"]:after,.factory-bootstrap-430 a[href^="#"]:after{content:""}.factory-bootstrap-430 blockquote,.factory-bootstrap-430 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-430 thead{display:table-header-group}.factory-bootstrap-430 img,.factory-bootstrap-430 tr{page-break-inside:avoid}.factory-bootstrap-430 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-430 h2,.factory-bootstrap-430 h3,.factory-bootstrap-430 p{orphans:3;widows:3}.factory-bootstrap-430 h2,.factory-bootstrap-430 h3{page-break-after:avoid}.factory-bootstrap-430 select{background:#fff!important}.factory-bootstrap-430 .navbar{display:none}.factory-bootstrap-430 .table td,.factory-bootstrap-430 .table th{background-color:#fff!important}.factory-bootstrap-430 .btn>.caret,.factory-bootstrap-430 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-430 .label{border:1px solid #000}.factory-bootstrap-430 .table{border-collapse:collapse!important}.factory-bootstrap-430 .table-bordered td,.factory-bootstrap-430 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-430 *,.factory-bootstrap-430 :after,.factory-bootstrap-430 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-430{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-430 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-430 button,.factory-bootstrap-430 input,.factory-bootstrap-430 select,.factory-bootstrap-430 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-430 img{vertical-align:middle}.factory-bootstrap-430 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-430 .img-rounded{border-radius:6px}.factory-bootstrap-430 .img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-430 .img-circle{border-radius:50%}.factory-bootstrap-430 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-430 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-430 .h1,.factory-bootstrap-430 .h2,.factory-bootstrap-430 .h3,.factory-bootstrap-430 .h4,.factory-bootstrap-430 .h5,.factory-bootstrap-430 .h6,.factory-bootstrap-430 h1,.factory-bootstrap-430 h2,.factory-bootstrap-430 h3,.factory-bootstrap-430 h4,.factory-bootstrap-430 h5,.factory-bootstrap-430 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-430 .h1 .small,.factory-bootstrap-430 .h1 small,.factory-bootstrap-430 .h2 .small,.factory-bootstrap-430 .h2 small,.factory-bootstrap-430 .h3 .small,.factory-bootstrap-430 .h3 small,.factory-bootstrap-430 .h4 .small,.factory-bootstrap-430 .h4 small,.factory-bootstrap-430 .h5 .small,.factory-bootstrap-430 .h5 small,.factory-bootstrap-430 .h6 .small,.factory-bootstrap-430 .h6 small,.factory-bootstrap-430 h1 .small,.factory-bootstrap-430 h1 small,.factory-bootstrap-430 h2 .small,.factory-bootstrap-430 h2 small,.factory-bootstrap-430 h3 .small,.factory-bootstrap-430 h3 small,.factory-bootstrap-430 h4 .small,.factory-bootstrap-430 h4 small,.factory-bootstrap-430 h5 .small,.factory-bootstrap-430 h5 small,.factory-bootstrap-430 h6 .small,.factory-bootstrap-430 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-430 h1,.factory-bootstrap-430 h2,.factory-bootstrap-430 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-430 h1 .small,.factory-bootstrap-430 h1 small,.factory-bootstrap-430 h2 .small,.factory-bootstrap-430 h2 small,.factory-bootstrap-430 h3 .small,.factory-bootstrap-430 h3 small{font-size:65%}.factory-bootstrap-430 h4,.factory-bootstrap-430 h5,.factory-bootstrap-430 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-430 h4 .small,.factory-bootstrap-430 h4 small,.factory-bootstrap-430 h5 .small,.factory-bootstrap-430 h5 small,.factory-bootstrap-430 h6 .small,.factory-bootstrap-430 h6 small{font-size:75%}.factory-bootstrap-430 .h1,.factory-bootstrap-430 h1{font-size:36px}.factory-bootstrap-430 .h2,.factory-bootstrap-430 h2{font-size:30px}.factory-bootstrap-430 .h3,.factory-bootstrap-430 h3{font-size:24px}.factory-bootstrap-430 .h4,.factory-bootstrap-430 h4{font-size:18px}.factory-bootstrap-430 .h5,.factory-bootstrap-430 h5{font-size:14px}.factory-bootstrap-430 .h6,.factory-bootstrap-430 h6{font-size:12px}.factory-bootstrap-430 p{margin:0 0 10px}.factory-bootstrap-430 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-430 .small,.factory-bootstrap-430 small{font-size:85%}.factory-bootstrap-430 cite{font-style:normal}.factory-bootstrap-430 .text-muted{color:#999}.factory-bootstrap-430 .text-primary{color:#428bca}.factory-bootstrap-430 .text-primary:hover{color:#3071a9}.factory-bootstrap-430 .text-warning{color:#8a6d3b}.factory-bootstrap-430 .text-warning:hover{color:#66512c}.factory-bootstrap-430 .text-danger{color:#a94442}.factory-bootstrap-430 .text-danger:hover{color:#843534}.factory-bootstrap-430 .text-success{color:#3c763d}.factory-bootstrap-430 .text-success:hover{color:#2b542c}.factory-bootstrap-430 .text-info{color:#31708f}.factory-bootstrap-430 .text-info:hover{color:#245269}.factory-bootstrap-430 .text-left{text-align:left}.factory-bootstrap-430 .text-right{text-align:right}.factory-bootstrap-430 .text-center{text-align:center}.factory-bootstrap-430 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-430 ol,.factory-bootstrap-430 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-430 ol ol,.factory-bootstrap-430 ol ul,.factory-bootstrap-430 ul ol,.factory-bootstrap-430 ul ul{margin-bottom:0}.factory-bootstrap-430 .list-inline,.factory-bootstrap-430 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-430 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-430 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-430 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-430 dd,.factory-bootstrap-430 dt{line-height:1.428571429}.factory-bootstrap-430 dt{font-weight:700}.factory-bootstrap-430 dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:after,.dl-horizontal dd:before{display:table;content:" "}.dl-horizontal dd:after{clear:both}}.factory-bootstrap-430 abbr[data-original-title],.factory-bootstrap-430 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-430 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-430 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-430 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-430 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-430 blockquote .small,.factory-bootstrap-430 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-430 blockquote .small:before,.factory-bootstrap-430 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-430 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-430 blockquote.pull-right .small,.factory-bootstrap-430 blockquote.pull-right p,.factory-bootstrap-430 blockquote.pull-right small{text-align:right}.factory-bootstrap-430 blockquote.pull-right .small:before,.factory-bootstrap-430 blockquote.pull-right small:before{content:''}.factory-bootstrap-430 blockquote.pull-right .small:after,.factory-bootstrap-430 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-430 blockquote:after,.factory-bootstrap-430 blockquote:before{content:""}.factory-bootstrap-430 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-430 code,.factory-bootstrap-430 kbd,.factory-bootstrap-430 pre,.factory-bootstrap-430 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-430 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-430 pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-430 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-430 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-430 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-430 .container:after,.factory-bootstrap-430 .container:before{display:table;content:" "}.factory-bootstrap-430 .container:after{clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.factory-bootstrap-430 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-430 .row:after,.factory-bootstrap-430 .row:before{display:table;content:" "}.factory-bootstrap-430 .row:after{clear:both}.factory-bootstrap-430 .col-lg-1,.factory-bootstrap-430 .col-lg-10,.factory-bootstrap-430 .col-lg-11,.factory-bootstrap-430 .col-lg-12,.factory-bootstrap-430 .col-lg-2,.factory-bootstrap-430 .col-lg-3,.factory-bootstrap-430 .col-lg-4,.factory-bootstrap-430 .col-lg-5,.factory-bootstrap-430 .col-lg-6,.factory-bootstrap-430 .col-lg-7,.factory-bootstrap-430 .col-lg-8,.factory-bootstrap-430 .col-lg-9,.factory-bootstrap-430 .col-md-1,.factory-bootstrap-430 .col-md-10,.factory-bootstrap-430 .col-md-11,.factory-bootstrap-430 .col-md-12,.factory-bootstrap-430 .col-md-2,.factory-bootstrap-430 .col-md-3,.factory-bootstrap-430 .col-md-4,.factory-bootstrap-430 .col-md-5,.factory-bootstrap-430 .col-md-6,.factory-bootstrap-430 .col-md-7,.factory-bootstrap-430 .col-md-8,.factory-bootstrap-430 .col-md-9,.factory-bootstrap-430 .col-sm-1,.factory-bootstrap-430 .col-sm-10,.factory-bootstrap-430 .col-sm-11,.factory-bootstrap-430 .col-sm-12,.factory-bootstrap-430 .col-sm-2,.factory-bootstrap-430 .col-sm-3,.factory-bootstrap-430 .col-sm-4,.factory-bootstrap-430 .col-sm-5,.factory-bootstrap-430 .col-sm-6,.factory-bootstrap-430 .col-sm-7,.factory-bootstrap-430 .col-sm-8,.factory-bootstrap-430 .col-sm-9,.factory-bootstrap-430 .col-xs-1,.factory-bootstrap-430 .col-xs-10,.factory-bootstrap-430 .col-xs-11,.factory-bootstrap-430 .col-xs-12,.factory-bootstrap-430 .col-xs-2,.factory-bootstrap-430 .col-xs-3,.factory-bootstrap-430 .col-xs-4,.factory-bootstrap-430 .col-xs-5,.factory-bootstrap-430 .col-xs-6,.factory-bootstrap-430 .col-xs-7,.factory-bootstrap-430 .col-xs-8,.factory-bootstrap-430 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-430 .col-xs-1,.factory-bootstrap-430 .col-xs-10,.factory-bootstrap-430 .col-xs-11,.factory-bootstrap-430 .col-xs-12,.factory-bootstrap-430 .col-xs-2,.factory-bootstrap-430 .col-xs-3,.factory-bootstrap-430 .col-xs-4,.factory-bootstrap-430 .col-xs-5,.factory-bootstrap-430 .col-xs-6,.factory-bootstrap-430 .col-xs-7,.factory-bootstrap-430 .col-xs-8,.factory-bootstrap-430 .col-xs-9{float:left}.factory-bootstrap-430 .col-xs-12{width:100%}.factory-bootstrap-430 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-430 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-430 .col-xs-9{width:75%}.factory-bootstrap-430 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-430 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-430 .col-xs-6{width:50%}.factory-bootstrap-430 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-430 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-430 .col-xs-3{width:25%}.factory-bootstrap-430 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-430 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-430 .col-xs-pull-12{right:100%}.factory-bootstrap-430 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-430 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-430 .col-xs-pull-9{right:75%}.factory-bootstrap-430 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-430 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-430 .col-xs-pull-6{right:50%}.factory-bootstrap-430 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-430 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-430 .col-xs-pull-3{right:25%}.factory-bootstrap-430 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-430 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-430 .col-xs-pull-0{right:0}.factory-bootstrap-430 .col-xs-push-12{left:100%}.factory-bootstrap-430 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-430 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-430 .col-xs-push-9{left:75%}.factory-bootstrap-430 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-430 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-430 .col-xs-push-6{left:50%}.factory-bootstrap-430 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-430 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-430 .col-xs-push-3{left:25%}.factory-bootstrap-430 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-430 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-430 .col-xs-push-0{left:0}.factory-bootstrap-430 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-430 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-430 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-430 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-430 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-430 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-430 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-430 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-430 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-430 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-430 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-430 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-430 .col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}.factory-bootstrap-430 table{max-width:100%;background-color:transparent}.factory-bootstrap-430 th{text-align:left}.factory-bootstrap-430 .table{width:100%;margin-bottom:20px}.factory-bootstrap-430 .table>tbody>tr>td,.factory-bootstrap-430 .table>tbody>tr>th,.factory-bootstrap-430 .table>tfoot>tr>td,.factory-bootstrap-430 .table>tfoot>tr>th,.factory-bootstrap-430 .table>thead>tr>td,.factory-bootstrap-430 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-430 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-430 .table>caption+thead>tr:first-child>td,.factory-bootstrap-430 .table>caption+thead>tr:first-child>th,.factory-bootstrap-430 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-430 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-430 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-430 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-430 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-430 .table .table{background-color:#fff}.factory-bootstrap-430 .table-condensed>tbody>tr>td,.factory-bootstrap-430 .table-condensed>tbody>tr>th,.factory-bootstrap-430 .table-condensed>tfoot>tr>td,.factory-bootstrap-430 .table-condensed>tfoot>tr>th,.factory-bootstrap-430 .table-condensed>thead>tr>td,.factory-bootstrap-430 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-430 .table-bordered,.factory-bootstrap-430 .table-bordered>tbody>tr>td,.factory-bootstrap-430 .table-bordered>tbody>tr>th,.factory-bootstrap-430 .table-bordered>tfoot>tr>td,.factory-bootstrap-430 .table-bordered>tfoot>tr>th,.factory-bootstrap-430 .table-bordered>thead>tr>td,.factory-bootstrap-430 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-430 .table-bordered>thead>tr>td,.factory-bootstrap-430 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-430 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-430 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-430 .table-hover>tbody>tr:hover>td,.factory-bootstrap-430 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-430 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-430 table td[class*=col-],.factory-bootstrap-430 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-430 .table>tbody>.active>td,.factory-bootstrap-430 .table>tbody>.active>th,.factory-bootstrap-430 .table>tbody>tr>.active,.factory-bootstrap-430 .table>tfoot>.active>td,.factory-bootstrap-430 .table>tfoot>.active>th,.factory-bootstrap-430 .table>tfoot>tr>.active,.factory-bootstrap-430 .table>thead>.active>td,.factory-bootstrap-430 .table>thead>.active>th,.factory-bootstrap-430 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-430 .table-hover>tbody>.active:hover>td,.factory-bootstrap-430 .table-hover>tbody>.active:hover>th,.factory-bootstrap-430 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-430 .table>tbody>.success>td,.factory-bootstrap-430 .table>tbody>.success>th,.factory-bootstrap-430 .table>tbody>tr>.success,.factory-bootstrap-430 .table>tfoot>.success>td,.factory-bootstrap-430 .table>tfoot>.success>th,.factory-bootstrap-430 .table>tfoot>tr>.success,.factory-bootstrap-430 .table>thead>.success>td,.factory-bootstrap-430 .table>thead>.success>th,.factory-bootstrap-430 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-430 .table-hover>tbody>.success:hover>td,.factory-bootstrap-430 .table-hover>tbody>.success:hover>th,.factory-bootstrap-430 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-430 .table>tbody>.danger>td,.factory-bootstrap-430 .table>tbody>.danger>th,.factory-bootstrap-430 .table>tbody>tr>.danger,.factory-bootstrap-430 .table>tfoot>.danger>td,.factory-bootstrap-430 .table>tfoot>.danger>th,.factory-bootstrap-430 .table>tfoot>tr>.danger,.factory-bootstrap-430 .table>thead>.danger>td,.factory-bootstrap-430 .table>thead>.danger>th,.factory-bootstrap-430 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-430 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-430 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-430 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-430 .table>tbody>.warning>td,.factory-bootstrap-430 .table>tbody>.warning>th,.factory-bootstrap-430 .table>tbody>tr>.warning,.factory-bootstrap-430 .table>tfoot>.warning>td,.factory-bootstrap-430 .table>tfoot>.warning>th,.factory-bootstrap-430 .table>tfoot>tr>.warning,.factory-bootstrap-430 .table>thead>.warning>td,.factory-bootstrap-430 .table>thead>.warning>th,.factory-bootstrap-430 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-430 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-430 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-430 .table-hover>tbody>tr>.warning:hover{background-color:#faf2cc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.factory-bootstrap-430 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-430 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-430 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-430 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-430 input[type=checkbox],.factory-bootstrap-430 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-430 input[type=file]{display:block}.factory-bootstrap-430 select[multiple],.factory-bootstrap-430 select[size]{height:auto}.factory-bootstrap-430 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-430 input[type=checkbox]:focus,.factory-bootstrap-430 input[type=file]:focus,.factory-bootstrap-430 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-430 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-430 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-430 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-430 .form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.factory-bootstrap-430 .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-430 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-430 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-430 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-430 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-430 .form-control[disabled],.factory-bootstrap-430 .form-control[readonly],.factory-bootstrap-430 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-430 textarea.form-control{height:auto}.factory-bootstrap-430 .form-group{margin-bottom:15px}.factory-bootstrap-430 .checkbox,.factory-bootstrap-430 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-430 .checkbox label,.factory-bootstrap-430 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-430 .checkbox input[type=checkbox],.factory-bootstrap-430 .checkbox-inline input[type=checkbox],.factory-bootstrap-430 .radio input[type=radio],.factory-bootstrap-430 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-430 .checkbox+.checkbox,.factory-bootstrap-430 .radio+.radio{margin-top:-5px}.factory-bootstrap-430 .checkbox-inline,.factory-bootstrap-430 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-430 .checkbox-inline+.checkbox-inline,.factory-bootstrap-430 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-430 .checkbox-inline[disabled],.factory-bootstrap-430 .checkbox[disabled],.factory-bootstrap-430 .radio-inline[disabled],.factory-bootstrap-430 .radio[disabled],.factory-bootstrap-430 fieldset[disabled] .checkbox,.factory-bootstrap-430 fieldset[disabled] .checkbox-inline,.factory-bootstrap-430 fieldset[disabled] .radio,.factory-bootstrap-430 fieldset[disabled] .radio-inline,.factory-bootstrap-430 fieldset[disabled] input[type=checkbox],.factory-bootstrap-430 fieldset[disabled] input[type=radio],.factory-bootstrap-430 input[type=checkbox][disabled],.factory-bootstrap-430 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-430 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-430 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-430 textarea.input-sm{height:auto}.factory-bootstrap-430 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-430 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-430 textarea.input-lg{height:auto}.factory-bootstrap-430 .has-warning .checkbox,.factory-bootstrap-430 .has-warning .checkbox-inline,.factory-bootstrap-430 .has-warning .control-label,.factory-bootstrap-430 .has-warning .help-block,.factory-bootstrap-430 .has-warning .radio,.factory-bootstrap-430 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-430 .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-430 .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.factory-bootstrap-430 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-430 .has-error .checkbox,.factory-bootstrap-430 .has-error .checkbox-inline,.factory-bootstrap-430 .has-error .control-label,.factory-bootstrap-430 .has-error .help-block,.factory-bootstrap-430 .has-error .radio,.factory-bootstrap-430 .has-error .radio-inline{color:#a94442}.factory-bootstrap-430 .controls{display:block}.factory-bootstrap-430 .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-430 .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.factory-bootstrap-430 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-430 .has-success .checkbox,.factory-bootstrap-430 .has-success .checkbox-inline,.factory-bootstrap-430 .has-success .control-label,.factory-bootstrap-430 .has-success .help-block,.factory-bootstrap-430 .has-success .radio,.factory-bootstrap-430 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-430 .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-430 .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.factory-bootstrap-430 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-430 .form-control-static{margin-bottom:0}.factory-bootstrap-430 .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373;font-weight:400}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}}.factory-bootstrap-430 .form-horizontal .checkbox,.factory-bootstrap-430 .form-horizontal .checkbox-inline,.factory-bootstrap-430 .form-horizontal .control-label,.factory-bootstrap-430 .form-horizontal .radio,.factory-bootstrap-430 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-430 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-430 .form-horizontal .checkbox,.factory-bootstrap-430 .form-horizontal .radio{min-height:27px}.factory-bootstrap-430 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-430 .form-horizontal .form-group:after,.factory-bootstrap-430 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-430 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-430 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-430 .btn{display:inline-block;padding:5px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.factory-bootstrap-430 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-430 .btn{text-decoration:none}.factory-bootstrap-430 .btn:focus,.factory-bootstrap-430 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-430 .btn.disabled,.factory-bootstrap-430 .btn[disabled],.factory-bootstrap-430 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-430 .btn-default.active,.factory-bootstrap-430 .btn-default:active,.factory-bootstrap-430 .btn-default:focus,.factory-bootstrap-430 .btn-default:hover,.factory-bootstrap-430 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-430 .btn-default.active,.factory-bootstrap-430 .btn-default:active,.factory-bootstrap-430 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-430 .btn-default.disabled,.factory-bootstrap-430 .btn-default.disabled.active,.factory-bootstrap-430 .btn-default.disabled:active,.factory-bootstrap-430 .btn-default.disabled:focus,.factory-bootstrap-430 .btn-default.disabled:hover,.factory-bootstrap-430 .btn-default[disabled],.factory-bootstrap-430 .btn-default[disabled].active,.factory-bootstrap-430 .btn-default[disabled]:active,.factory-bootstrap-430 .btn-default[disabled]:focus,.factory-bootstrap-430 .btn-default[disabled]:hover,.factory-bootstrap-430 fieldset[disabled] .btn-default,.factory-bootstrap-430 fieldset[disabled] .btn-default.active,.factory-bootstrap-430 fieldset[disabled] .btn-default:active,.factory-bootstrap-430 fieldset[disabled] .btn-default:focus,.factory-bootstrap-430 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-430 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-430 .btn-primary.active,.factory-bootstrap-430 .btn-primary:active,.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover,.factory-bootstrap-430 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-430 .btn-primary.active,.factory-bootstrap-430 .btn-primary:active,.factory-bootstrap-430 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-430 .btn-primary.disabled,.factory-bootstrap-430 .btn-primary.disabled.active,.factory-bootstrap-430 .btn-primary.disabled:active,.factory-bootstrap-430 .btn-primary.disabled:focus,.factory-bootstrap-430 .btn-primary.disabled:hover,.factory-bootstrap-430 .btn-primary[disabled],.factory-bootstrap-430 .btn-primary[disabled].active,.factory-bootstrap-430 .btn-primary[disabled]:active,.factory-bootstrap-430 .btn-primary[disabled]:focus,.factory-bootstrap-430 .btn-primary[disabled]:hover,.factory-bootstrap-430 fieldset[disabled] .btn-primary,.factory-bootstrap-430 fieldset[disabled] .btn-primary.active,.factory-bootstrap-430 fieldset[disabled] .btn-primary:active,.factory-bootstrap-430 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-430 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-430 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-430 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-430 .btn-warning.active,.factory-bootstrap-430 .btn-warning:active,.factory-bootstrap-430 .btn-warning:focus,.factory-bootstrap-430 .btn-warning:hover,.factory-bootstrap-430 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-430 .btn-warning.active,.factory-bootstrap-430 .btn-warning:active,.factory-bootstrap-430 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-430 .btn-warning.disabled,.factory-bootstrap-430 .btn-warning.disabled.active,.factory-bootstrap-430 .btn-warning.disabled:active,.factory-bootstrap-430 .btn-warning.disabled:focus,.factory-bootstrap-430 .btn-warning.disabled:hover,.factory-bootstrap-430 .btn-warning[disabled],.factory-bootstrap-430 .btn-warning[disabled].active,.factory-bootstrap-430 .btn-warning[disabled]:active,.factory-bootstrap-430 .btn-warning[disabled]:focus,.factory-bootstrap-430 .btn-warning[disabled]:hover,.factory-bootstrap-430 fieldset[disabled] .btn-warning,.factory-bootstrap-430 fieldset[disabled] .btn-warning.active,.factory-bootstrap-430 fieldset[disabled] .btn-warning:active,.factory-bootstrap-430 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-430 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-430 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-430 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-430 .btn-success.active,.factory-bootstrap-430 .btn-success:active,.factory-bootstrap-430 .btn-success:focus,.factory-bootstrap-430 .btn-success:hover,.factory-bootstrap-430 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-430 .btn-success.active,.factory-bootstrap-430 .btn-success:active,.factory-bootstrap-430 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-430 .btn-success.disabled,.factory-bootstrap-430 .btn-success.disabled.active,.factory-bootstrap-430 .btn-success.disabled:active,.factory-bootstrap-430 .btn-success.disabled:focus,.factory-bootstrap-430 .btn-success.disabled:hover,.factory-bootstrap-430 .btn-success[disabled],.factory-bootstrap-430 .btn-success[disabled].active,.factory-bootstrap-430 .btn-success[disabled]:active,.factory-bootstrap-430 .btn-success[disabled]:focus,.factory-bootstrap-430 .btn-success[disabled]:hover,.factory-bootstrap-430 fieldset[disabled] .btn-success,.factory-bootstrap-430 fieldset[disabled] .btn-success.active,.factory-bootstrap-430 fieldset[disabled] .btn-success:active,.factory-bootstrap-430 fieldset[disabled] .btn-success:focus,.factory-bootstrap-430 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-430 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-430 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-430 .btn-info.active,.factory-bootstrap-430 .btn-info:active,.factory-bootstrap-430 .btn-info:focus,.factory-bootstrap-430 .btn-info:hover,.factory-bootstrap-430 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-430 .btn-info.active,.factory-bootstrap-430 .btn-info:active,.factory-bootstrap-430 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-430 .btn-info.disabled,.factory-bootstrap-430 .btn-info.disabled.active,.factory-bootstrap-430 .btn-info.disabled:active,.factory-bootstrap-430 .btn-info.disabled:focus,.factory-bootstrap-430 .btn-info.disabled:hover,.factory-bootstrap-430 .btn-info[disabled],.factory-bootstrap-430 .btn-info[disabled].active,.factory-bootstrap-430 .btn-info[disabled]:active,.factory-bootstrap-430 .btn-info[disabled]:focus,.factory-bootstrap-430 .btn-info[disabled]:hover,.factory-bootstrap-430 fieldset[disabled] .btn-info,.factory-bootstrap-430 fieldset[disabled] .btn-info.active,.factory-bootstrap-430 fieldset[disabled] .btn-info:active,.factory-bootstrap-430 fieldset[disabled] .btn-info:focus,.factory-bootstrap-430 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-430 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-430 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-430 .btn-link,.factory-bootstrap-430 .btn-link:active,.factory-bootstrap-430 .btn-link[disabled],.factory-bootstrap-430 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-430 .btn-link,.factory-bootstrap-430 .btn-link:active,.factory-bootstrap-430 .btn-link:focus,.factory-bootstrap-430 .btn-link:hover{border-color:transparent}.factory-bootstrap-430 .btn-link:focus,.factory-bootstrap-430 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-430 .btn-link[disabled]:focus,.factory-bootstrap-430 .btn-link[disabled]:hover,.factory-bootstrap-430 fieldset[disabled] .btn-link:focus,.factory-bootstrap-430 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-430 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-430 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-430 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-430 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-430 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-430 input[type=button].btn-block,.factory-bootstrap-430 input[type=reset].btn-block,.factory-bootstrap-430 input[type=submit].btn-block{width:100%}.factory-bootstrap-430 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-430 .fade.in{opacity:1}.factory-bootstrap-430 .collapse{display:none}.factory-bootstrap-430 .collapse.in{display:block}.factory-bootstrap-430 .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.factory-bootstrap-430 .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.factory-bootstrap-430 .glyphicon:empty{width:1em}.factory-bootstrap-430 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-430 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-430 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-430 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-430 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-430 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-430 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-430 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-430 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-430 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-430 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-430 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-430 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-430 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-430 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-430 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-430 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-430 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-430 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-430 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-430 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-430 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-430 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-430 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-430 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-430 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-430 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-430 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-430 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-430 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-430 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-430 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-430 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-430 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-430 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-430 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-430 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-430 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-430 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-430 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-430 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-430 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-430 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-430 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-430 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-430 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-430 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-430 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-430 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-430 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-430 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-430 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-430 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-430 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-430 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-430 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-430 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-430 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-430 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-430 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-430 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-430 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-430 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-430 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-430 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-430 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-430 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-430 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-430 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-430 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-430 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-430 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-430 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-430 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-430 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-430 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-430 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-430 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-430 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-430 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-430 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-430 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-430 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-430 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-430 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-430 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-430 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-430 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-430 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-430 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-430 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-430 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-430 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-430 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-430 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-430 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-430 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-430 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-430 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-430 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-430 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-430 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-430 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-430 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-430 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-430 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-430 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-430 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-430 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-430 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-430 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-430 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-430 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-430 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-430 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-430 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-430 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-430 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-430 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-430 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-430 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-430 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-430 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-430 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-430 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-430 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-430 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-430 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-430 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-430 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-430 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-430 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-430 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-430 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-430 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-430 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-430 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-430 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-430 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-430 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-430 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-430 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-430 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-430 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-430 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-430 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-430 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-430 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-430 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-430 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-430 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-430 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-430 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-430 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-430 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-430 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-430 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-430 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-430 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-430 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-430 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-430 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-430 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-430 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-430 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-430 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-430 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-430 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-430 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-430 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-430 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-430 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-430 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-430 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-430 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-430 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-430 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-430 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-430 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-430 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-430 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-430 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-430 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-430 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-430 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-430 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-430 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-430 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-430 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-430 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-430 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-430 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-430 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-430 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-430 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-430 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-430 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-430 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-430 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-430 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-430 .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.factory-bootstrap-430 .dropdown{position:relative}.factory-bootstrap-430 .dropdown-toggle:focus{outline:0}.factory-bootstrap-430 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.factory-bootstrap-430 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-430 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-430 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.factory-bootstrap-430 .dropdown-menu>li>a:focus,.factory-bootstrap-430 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-430 .dropdown-menu>.active>a,.factory-bootstrap-430 .dropdown-menu>.active>a:focus,.factory-bootstrap-430 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-430 .dropdown-menu>.disabled>a,.factory-bootstrap-430 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-430 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-430 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-430 .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-430 .open>.dropdown-menu{display:block}.factory-bootstrap-430 .open>a{outline:0}.factory-bootstrap-430 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-430 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-430 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-430 .dropup .caret,.factory-bootstrap-430 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-430 .dropup .dropdown-menu,.factory-bootstrap-430 .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.factory-bootstrap-430 .btn-group,.factory-bootstrap-430 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-430 .btn-group-vertical>.btn,.factory-bootstrap-430 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-430 .btn-group-vertical>.btn.active,.factory-bootstrap-430 .btn-group-vertical>.btn:active,.factory-bootstrap-430 .btn-group-vertical>.btn:focus,.factory-bootstrap-430 .btn-group-vertical>.btn:hover,.factory-bootstrap-430 .btn-group>.btn.active,.factory-bootstrap-430 .btn-group>.btn:active,.factory-bootstrap-430 .btn-group>.btn:focus,.factory-bootstrap-430 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-430 .btn-group-vertical>.btn:focus,.factory-bootstrap-430 .btn-group>.btn:focus{outline:0}.factory-bootstrap-430 .btn-group .btn+.btn,.factory-bootstrap-430 .btn-group .btn+.btn-group,.factory-bootstrap-430 .btn-group .btn-group+.btn,.factory-bootstrap-430 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-430 .btn-toolbar:after,.factory-bootstrap-430 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-430 .btn-toolbar:after{clear:both}.factory-bootstrap-430 .btn-toolbar .btn-group{float:left}.factory-bootstrap-430 .btn-toolbar>.btn+.btn,.factory-bootstrap-430 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-430 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-430 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-430 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-430 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-430 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-430 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-430 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-430 .btn-group>.btn-group{float:left}.factory-bootstrap-430 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-430 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-430 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-430 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-430 .btn-group .dropdown-toggle:active,.factory-bootstrap-430 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-430 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-430 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-430 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-430 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-430 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-430 .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.factory-bootstrap-430 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-430 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-430 .btn-group .btn.active.value{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-430 .btn .caret{margin-left:0}.factory-bootstrap-430 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-430 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-430 .btn-group-vertical>.btn,.factory-bootstrap-430 .btn-group-vertical>.btn-group,.factory-bootstrap-430 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-430 .btn-group-vertical>.btn-group:after,.factory-bootstrap-430 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-430 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-430 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-430 .btn-group-vertical>.btn+.btn,.factory-bootstrap-430 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-430 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-430 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-430 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-430 .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-430 .btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.factory-bootstrap-430 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-430 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-430 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-430 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-430 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-430 .btn-group-justified>.btn,.factory-bootstrap-430 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-430 .btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.factory-bootstrap-430 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-430 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-430 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-430 .input-group-lg>.form-control,.factory-bootstrap-430 .input-group-lg>.input-group-addon,.factory-bootstrap-430 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-430 select.input-group-lg>.form-control,.factory-bootstrap-430 select.input-group-lg>.input-group-addon,.factory-bootstrap-430 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-430 textarea.input-group-lg>.form-control,.factory-bootstrap-430 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-430 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-430 .input-group-sm>.form-control,.factory-bootstrap-430 .input-group-sm>.input-group-addon,.factory-bootstrap-430 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-430 select.input-group-sm>.form-control,.factory-bootstrap-430 select.input-group-sm>.input-group-addon,.factory-bootstrap-430 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-430 textarea.input-group-sm>.form-control,.factory-bootstrap-430 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-430 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-430 .input-group .form-control,.factory-bootstrap-430 .input-group-addon,.factory-bootstrap-430 .input-group-btn{display:table-cell}.factory-bootstrap-430 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-430 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-430 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-430 .input-group-addon,.factory-bootstrap-430 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-430 .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-430 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-430 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-430 .input-group-addon input[type=checkbox],.factory-bootstrap-430 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-430 .input-group .form-control:first-child,.factory-bootstrap-430 .input-group-addon:first-child,.factory-bootstrap-430 .input-group-btn:first-child>.btn,.factory-bootstrap-430 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-430 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-430 .input-group-addon:first-child{border-right:0}.factory-bootstrap-430 .input-group .form-control:last-child,.factory-bootstrap-430 .input-group-addon:last-child,.factory-bootstrap-430 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-430 .input-group-btn:last-child>.btn,.factory-bootstrap-430 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-430 .input-group-addon:last-child{border-left:0}.factory-bootstrap-430 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-430 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-430 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-430 .input-group-btn>.btn{position:relative}.factory-bootstrap-430 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-430 .input-group-btn>.btn:active,.factory-bootstrap-430 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-430 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-430 .nav:after,.factory-bootstrap-430 .nav:before{display:table;content:" "}.factory-bootstrap-430 .nav:after{clear:both}.factory-bootstrap-430 .nav>li{position:relative;display:block}.factory-bootstrap-430 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-430 .nav>li>a:focus,.factory-bootstrap-430 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-430 .nav>li.disabled>a{color:#999}.factory-bootstrap-430 .nav>li.disabled>a:focus,.factory-bootstrap-430 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-430 .nav .open>a,.factory-bootstrap-430 .nav .open>a:focus,.factory-bootstrap-430 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-430 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-430 .nav>li>a>img{max-width:none}.factory-bootstrap-430 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-430 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-430 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-430 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-430 .nav-tabs>li.active>a,.factory-bootstrap-430 .nav-tabs>li.active>a:focus,.factory-bootstrap-430 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-430 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-430 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-430 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-430 .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-430 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-430 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-430 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-430 .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-430 .nav-pills>li{float:left}.factory-bootstrap-430 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-430 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-430 .nav-pills>li.active>a,.factory-bootstrap-430 .nav-pills>li.active>a:focus,.factory-bootstrap-430 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-430 .nav-stacked>li{float:none}.factory-bootstrap-430 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-430 .nav-justified{width:100%}.factory-bootstrap-430 .nav-justified>li{float:none}.factory-bootstrap-430 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-430 .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-430 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-430 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-430 .nav-tabs-justified>.active>a,.factory-bootstrap-430 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-430 .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-430 .tab-content>.tab-pane{display:none}.factory-bootstrap-430 .tab-content>.active{display:block}.factory-bootstrap-430 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-430 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-430 .navbar:after,.factory-bootstrap-430 .navbar:before{display:table;content:" "}.factory-bootstrap-430 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-430 .navbar-header:after,.factory-bootstrap-430 .navbar-header:before{display:table;content:" "}.factory-bootstrap-430 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-430 .navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.factory-bootstrap-430 .navbar-collapse:after,.factory-bootstrap-430 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-430 .navbar-collapse:after{clear:both}.factory-bootstrap-430 .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.factory-bootstrap-430 .container>.navbar-collapse,.factory-bootstrap-430 .container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.factory-bootstrap-430 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-430 .navbar-fixed-bottom,.factory-bootstrap-430 .navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.factory-bootstrap-430 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-430 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-430 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-430 .navbar-brand:focus,.factory-bootstrap-430 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-430 .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.factory-bootstrap-430 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-430 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-430 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-430 .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.factory-bootstrap-430 .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.factory-bootstrap-430 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-430 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-430 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-430 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-430 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-430 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-430 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-430 .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.factory-bootstrap-430 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-430 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-430 .navbar-default .navbar-brand:focus,.factory-bootstrap-430 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-430 .navbar-default .navbar-nav>li>a,.factory-bootstrap-430 .navbar-default .navbar-text{color:#777}.factory-bootstrap-430 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-430 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-430 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-430 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-430 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-430 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-430 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-430 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-430 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-430 .navbar-default .navbar-toggle:focus,.factory-bootstrap-430 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-430 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-430 .navbar-default .navbar-collapse,.factory-bootstrap-430 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-430 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-430 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-430 .navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.factory-bootstrap-430 .navbar-default .navbar-link{color:#777}.factory-bootstrap-430 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-430 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-430 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-430 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-430 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-430 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-430 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-430 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-430 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-430 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-430 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-430 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-430 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-430 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-430 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-430 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-430 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-430 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-430 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-430 .navbar-inverse .navbar-collapse,.factory-bootstrap-430 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-430 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-430 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-430 .navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.factory-bootstrap-430 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-430 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-430 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-430 .breadcrumb>li{display:inline-block}.factory-bootstrap-430 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-430 .breadcrumb>.active{color:#999}.factory-bootstrap-430 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-430 .pagination>li{display:inline}.factory-bootstrap-430 .pagination>li>a,.factory-bootstrap-430 .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-430 .pagination>li:first-child>a,.factory-bootstrap-430 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-430 .pagination>li:last-child>a,.factory-bootstrap-430 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-430 .pagination>li>a:focus,.factory-bootstrap-430 .pagination>li>a:hover,.factory-bootstrap-430 .pagination>li>span:focus,.factory-bootstrap-430 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-430 .pagination>.disabled>a,.factory-bootstrap-430 .pagination>.disabled>a:focus,.factory-bootstrap-430 .pagination>.disabled>a:hover,.factory-bootstrap-430 .pagination>.disabled>span,.factory-bootstrap-430 .pagination>.disabled>span:focus,.factory-bootstrap-430 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-430 .pagination-lg>li>a,.factory-bootstrap-430 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-430 .pagination-lg>li:first-child>a,.factory-bootstrap-430 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-430 .pagination-lg>li:last-child>a,.factory-bootstrap-430 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-430 .pagination-sm>li>a,.factory-bootstrap-430 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-430 .pagination-sm>li:first-child>a,.factory-bootstrap-430 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-430 .pagination-sm>li:last-child>a,.factory-bootstrap-430 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-430 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-430 .pager:after,.factory-bootstrap-430 .pager:before{display:table;content:" "}.factory-bootstrap-430 .pager:after{clear:both}.factory-bootstrap-430 .pager li{display:inline}.factory-bootstrap-430 .pager li>a,.factory-bootstrap-430 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-430 .pager li>a:focus,.factory-bootstrap-430 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-430 .pager .next>a,.factory-bootstrap-430 .pager .next>span{float:right}.factory-bootstrap-430 .pager .previous>a,.factory-bootstrap-430 .pager .previous>span{float:left}.factory-bootstrap-430 .pager .disabled>a,.factory-bootstrap-430 .pager .disabled>a:focus,.factory-bootstrap-430 .pager .disabled>a:hover,.factory-bootstrap-430 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-430 .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.factory-bootstrap-430 .label[href]:focus,.factory-bootstrap-430 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-430 .label:empty{display:none}.factory-bootstrap-430 .btn .label{position:relative;top:-1px}.factory-bootstrap-430 .label-default{background-color:#999}.factory-bootstrap-430 .label-default[href]:focus,.factory-bootstrap-430 .label-default[href]:hover{background-color:gray}.factory-bootstrap-430 .label-primary{background-color:#428bca}.factory-bootstrap-430 .label-primary[href]:focus,.factory-bootstrap-430 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-430 .label-success{background-color:#5cb85c}.factory-bootstrap-430 .label-success[href]:focus,.factory-bootstrap-430 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-430 .label-info{background-color:#5bc0de}.factory-bootstrap-430 .label-info[href]:focus,.factory-bootstrap-430 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-430 .label-warning{background-color:#f0ad4e}.factory-bootstrap-430 .label-warning[href]:focus,.factory-bootstrap-430 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-430 .label-danger{background-color:#d9534f}.factory-bootstrap-430 .label-danger[href]:focus,.factory-bootstrap-430 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-430 .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.factory-bootstrap-430 .badge:empty{display:none}.factory-bootstrap-430 .btn .badge{position:relative;top:-1px}.factory-bootstrap-430 a.badge:focus,.factory-bootstrap-430 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-430 .nav-pills>.active>a>.badge,.factory-bootstrap-430 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-430 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-430 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-430 .jumbotron .h1,.factory-bootstrap-430 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-430 .jumbotron p{line-height:1.4}.factory-bootstrap-430 .container .jumbotron{border-radius:6px}.factory-bootstrap-430 .jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.factory-bootstrap-430 .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-430 .thumbnail a>img,.factory-bootstrap-430 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-430 a.thumbnail.active,.factory-bootstrap-430 a.thumbnail:focus,.factory-bootstrap-430 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-430 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-430 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-430 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-430 .alert .alert-link{font-weight:700}.factory-bootstrap-430 .alert>p,.factory-bootstrap-430 .alert>ul{margin-bottom:0}.factory-bootstrap-430 .alert>p+p{margin-top:5px}.factory-bootstrap-430 .alert-dismissable{padding-right:35px}.factory-bootstrap-430 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-430 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-430 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-430 .alert-info .alert-link{color:#245269}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.factory-bootstrap-430 .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.factory-bootstrap-430 .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#2ea2cc;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.factory-bootstrap-430 .progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.factory-bootstrap-430 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-430 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-430 .progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-430 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-430 .progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-430 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-430 .progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-430 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-430 .progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-430 .media,.factory-bootstrap-430 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-430 .media,.factory-bootstrap-430 .media .media{margin-top:15px}.factory-bootstrap-430 .media:first-child{margin-top:0}.factory-bootstrap-430 .media-object{display:block}.factory-bootstrap-430 .media-heading{margin:0 0 5px}.factory-bootstrap-430 .media>.pull-left{margin-right:10px}.factory-bootstrap-430 .media>.pull-right{margin-left:10px}.factory-bootstrap-430 .media-list{padding-left:0;list-style:none}.factory-bootstrap-430 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-430 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-430 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-430 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-430 .list-group-item>.badge{float:right}.factory-bootstrap-430 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-430 a.list-group-item{color:#555}.factory-bootstrap-430 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-430 a.list-group-item:focus,.factory-bootstrap-430 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-430 a.list-group-item.active,.factory-bootstrap-430 a.list-group-item.active:focus,.factory-bootstrap-430 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-430 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-430 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-430 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-430 a.list-group-item.active .list-group-item-text,.factory-bootstrap-430 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-430 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-430 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-430 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-430 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-430 .panel-body{padding:15px}.factory-bootstrap-430 .panel-body:after,.factory-bootstrap-430 .panel-body:before{display:table;content:" "}.factory-bootstrap-430 .panel-body:after{clear:both}.factory-bootstrap-430 .panel>.list-group{margin-bottom:0}.factory-bootstrap-430 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-430 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-430 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-430 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-430 .panel>.table,.factory-bootstrap-430 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-430 .panel>.panel-body+.table,.factory-bootstrap-430 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-430 .panel>.table>tbody:first-child td,.factory-bootstrap-430 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-430 .panel>.table-bordered,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-430 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-430 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-430 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-430 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-430 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-430 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-430 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-430 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-430 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-430 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-430 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-430 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-430 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-430 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-430 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-430 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-430 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-430 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-430 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-430 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-430 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-430 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-430 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-430 .panel-title>a{color:inherit}.factory-bootstrap-430 .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.factory-bootstrap-430 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-430 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-430 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-430 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-430 .panel-group .panel-footer{border-top:0}.factory-bootstrap-430 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-430 .panel-default{border-color:#ddd}.factory-bootstrap-430 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-430 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-430 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-430 .panel-primary{border-color:#428bca}.factory-bootstrap-430 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-430 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-430 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-430 .panel-success{border-color:#d6e9c6}.factory-bootstrap-430 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-430 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-430 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-430 .panel-warning{border-color:#faebcc}.factory-bootstrap-430 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-430 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-430 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-430 .panel-danger{border-color:#ebccd1}.factory-bootstrap-430 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-430 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-430 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-430 .panel-info{border-color:#bce8f1}.factory-bootstrap-430 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-430 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-430 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-430 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-430 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-430 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-430 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-430 .close{float:right;font-size:14px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.3;filter:alpha(opacity=30)}.factory-bootstrap-430 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-430 .close:focus,.factory-bootstrap-430 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-430 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-430 .modal-open{overflow:hidden}.factory-bootstrap-430 .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll;width:auto;margin-left:0;background-color:transparent;border:0}.factory-bootstrap-430 .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.factory-bootstrap-430 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-430 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-430 .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box}.factory-bootstrap-430 .modal-backdrop,.factory-bootstrap-430-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-430 .modal-backdrop.fade,.factory-bootstrap-430-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-430 .modal-backdrop.in,.factory-bootstrap-430-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-430 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-430 .modal-header .close{margin-top:-2px}.factory-bootstrap-430 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-430 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-430 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-430 .modal-footer:after,.factory-bootstrap-430 .modal-footer:before{display:table;content:" "}.factory-bootstrap-430 .modal-footer:after{clear:both}.factory-bootstrap-430 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-430 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-430 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-430 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-430 .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.factory-bootstrap-430 .tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.factory-bootstrap-430 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-430 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-430 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-430 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-430 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-430 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-430 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-430 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-430 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-430 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-430 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-430 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-430 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-430 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-430 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-430 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.factory-bootstrap-430 .popover.top{margin-top:-10px}.factory-bootstrap-430 .popover.right{margin-left:10px}.factory-bootstrap-430 .popover.bottom{margin-top:10px}.factory-bootstrap-430 .popover.left{margin-left:-10px}.factory-bootstrap-430 .popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.factory-bootstrap-430 .popover-content{padding:9px 14px}.factory-bootstrap-430 .popover .arrow,.factory-bootstrap-430 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-430 .popover .arrow{border-width:11px}.factory-bootstrap-430 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-430 .popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.factory-bootstrap-430 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-430 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.factory-bootstrap-430 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-430 .popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.factory-bootstrap-430 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-430 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.factory-bootstrap-430 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-430 .carousel{position:relative}.factory-bootstrap-430 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-430 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-430 .carousel-inner>.item>a>img,.factory-bootstrap-430 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-430 .carousel-inner>.active,.factory-bootstrap-430 .carousel-inner>.next,.factory-bootstrap-430 .carousel-inner>.prev{display:block}.factory-bootstrap-430 .carousel-inner>.active{left:0}.factory-bootstrap-430 .carousel-inner>.next,.factory-bootstrap-430 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-430 .carousel-inner>.next{left:100%}.factory-bootstrap-430 .carousel-inner>.prev{left:-100%}.factory-bootstrap-430 .carousel-inner>.next.left,.factory-bootstrap-430 .carousel-inner>.prev.right{left:0}.factory-bootstrap-430 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-430 .carousel-inner>.active.right{left:100%}.factory-bootstrap-430 .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-430 .carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.factory-bootstrap-430 .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.factory-bootstrap-430 .carousel-control:focus,.factory-bootstrap-430 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-430 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-430 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-430 .carousel-control .icon-next,.factory-bootstrap-430 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-430 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-430 .carousel-control .icon-prev{left:50%}.factory-bootstrap-430 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-430 .carousel-control .icon-next{right:50%}.factory-bootstrap-430 .carousel-control .icon-next,.factory-bootstrap-430 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-430 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-430 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-430 .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.factory-bootstrap-430 .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.factory-bootstrap-430 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-430 .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.factory-bootstrap-430 .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.factory-bootstrap-430 .clearfix:after,.factory-bootstrap-430 .clearfix:before{display:table;content:" "}.factory-bootstrap-430 .clearfix:after{clear:both}.factory-bootstrap-430 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-430 .pull-right{float:right!important}.factory-bootstrap-430 .pull-left{float:left!important}.factory-bootstrap-430 .hide{display:none!important}.factory-bootstrap-430 .show{display:block!important}.factory-bootstrap-430 .invisible{visibility:hidden}.factory-bootstrap-430 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-430 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-430 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-430 .visible-lg,.factory-bootstrap-430 .visible-md,.factory-bootstrap-430 .visible-sm,.factory-bootstrap-430 .visible-xs,.factory-bootstrap-430 td.visible-lg,.factory-bootstrap-430 td.visible-md,.factory-bootstrap-430 td.visible-sm,.factory-bootstrap-430 td.visible-xs,.factory-bootstrap-430 th.visible-lg,.factory-bootstrap-430 th.visible-md,.factory-bootstrap-430 th.visible-sm,.factory-bootstrap-430 th.visible-xs,.factory-bootstrap-430 tr.visible-lg,.factory-bootstrap-430 tr.visible-md,.factory-bootstrap-430 tr.visible-sm,.factory-bootstrap-430 tr.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.factory-bootstrap-430 .hidden-xs{display:block!important}.factory-bootstrap-430 table.hidden-xs{display:table}.factory-bootstrap-430 tr.hidden-xs{display:table-row!important}.factory-bootstrap-430 td.hidden-xs,.factory-bootstrap-430 th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.factory-bootstrap-430 .hidden-sm{display:block!important}.factory-bootstrap-430 table.hidden-sm{display:table}.factory-bootstrap-430 tr.hidden-sm{display:table-row!important}.factory-bootstrap-430 td.hidden-sm,.factory-bootstrap-430 th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.factory-bootstrap-430 .hidden-md{display:block!important}.factory-bootstrap-430 table.hidden-md{display:table}.factory-bootstrap-430 tr.hidden-md{display:table-row!important}.factory-bootstrap-430 td.hidden-md,.factory-bootstrap-430 th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.factory-bootstrap-430 .hidden-lg{display:block!important}.factory-bootstrap-430 table.hidden-lg{display:table}.factory-bootstrap-430 tr.hidden-lg{display:table-row!important}.factory-bootstrap-430 td.hidden-lg,.factory-bootstrap-430 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-430 .hidden-lg.hidden-xs,.factory-bootstrap-430 td.hidden-lg.hidden-xs,.factory-bootstrap-430 th.hidden-lg.hidden-xs,.factory-bootstrap-430 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-430 .hidden-lg.hidden-sm,.factory-bootstrap-430 td.hidden-lg.hidden-sm,.factory-bootstrap-430 th.hidden-lg.hidden-sm,.factory-bootstrap-430 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-430 .hidden-lg.hidden-md,.factory-bootstrap-430 td.hidden-lg.hidden-md,.factory-bootstrap-430 th.hidden-lg.hidden-md,.factory-bootstrap-430 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-430 .hidden-lg,.factory-bootstrap-430 td.hidden-lg,.factory-bootstrap-430 th.hidden-lg,.factory-bootstrap-430 tr.hidden-lg{display:none!important}}.factory-bootstrap-430 .visible-print,.factory-bootstrap-430 td.visible-print,.factory-bootstrap-430 th.visible-print,.factory-bootstrap-430 tr.visible-print{display:none!important}@media print{.factory-bootstrap-430 .visible-print{display:block!important}.factory-bootstrap-430 table.visible-print{display:table}.factory-bootstrap-430 tr.visible-print{display:table-row!important}.factory-bootstrap-430 td.visible-print,.factory-bootstrap-430 th.visible-print{display:table-cell!important}.factory-bootstrap-430 .hidden-print,.factory-bootstrap-430 td.hidden-print,.factory-bootstrap-430 th.hidden-print,.factory-bootstrap-430 tr.hidden-print{display:none!important}}/*!
12
  * Factory Default Bootstrap Theme
13
  *
14
  * The code is based on Bootstrap v2.1.1
22
  *
23
  * @package factory-bootstrap
24
  * @since 1.0.0
25
+ */.factory-bootstrap-430 .btn-danger,.factory-bootstrap-430 .btn-default,.factory-bootstrap-430 .btn-info,.factory-bootstrap-430 .btn-primary,.factory-bootstrap-430 .btn-success,.factory-bootstrap-430 .btn-warning{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-430 .btn-danger.active,.factory-bootstrap-430 .btn-danger:active,.factory-bootstrap-430 .btn-default.active,.factory-bootstrap-430 .btn-default:active,.factory-bootstrap-430 .btn-info.active,.factory-bootstrap-430 .btn-info:active,.factory-bootstrap-430 .btn-primary.active,.factory-bootstrap-430 .btn-primary:active,.factory-bootstrap-430 .btn-success.active,.factory-bootstrap-430 .btn-success:active,.factory-bootstrap-430 .btn-warning.active,.factory-bootstrap-430 .btn-warning:active{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.factory-bootstrap-430 .btn.active,.factory-bootstrap-430 .btn:active{background-image:none}.factory-bootstrap-430 .btn-default{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top}.factory-bootstrap-430 .btn-default.active,.factory-bootstrap-430 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-430 .btn-gold{font-weight:700;padding:7px 12px;cursor:pointer;line-height:16px;display:inline-block;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:#e3e3e3 0 1px 1px;-moz-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);-webkit-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);text-shadow:1px 1px 0 #ffe8b2;color:#7c5d1b;border:1px solid #d6a437;background:#feeb80}.factory-bootstrap-430 .btn-gold:focus,.factory-bootstrap-430 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-430 .btn-gold.active,.factory-bootstrap-430 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-430 .btn-primary{background:#2ea2cc;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#fff;text-decoration:none}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#1e8cbe;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.6);box-shadow:inset 0 1px 0 rgba(120,200,230,.6);color:#fff}.factory-bootstrap-430 .btn-primary.active,.factory-bootstrap-430 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-430 .btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-430 .btn-success:focus,.factory-bootstrap-430 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-430 .btn-success.active,.factory-bootstrap-430 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-430 .btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-430 .btn-warning:focus,.factory-bootstrap-430 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-430 .btn-warning.active,.factory-bootstrap-430 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-430 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-430 .btn-danger.active,.factory-bootstrap-430 .btn-danger:active,.factory-bootstrap-430 .btn-danger:focus,.factory-bootstrap-430 .btn-danger:hover,.factory-bootstrap-430 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-430 .btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-430 .btn-info:focus,.factory-bootstrap-430 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-430 .btn-info.active,.factory-bootstrap-430 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-430 .img-thumbnail,.factory-bootstrap-430 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-430 .dropdown-menu>li>a:focus,.factory-bootstrap-430 .dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-430 .dropdown-menu>.active>a,.factory-bootstrap-430 .dropdown-menu>.active>a:focus,.factory-bootstrap-430 .dropdown-menu>.active>a:hover{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-430 .navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.factory-bootstrap-430 .navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.factory-bootstrap-430 .navbar-brand,.factory-bootstrap-430 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-430 .navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-430 .navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.factory-bootstrap-430 .navbar-inverse .navbar-brand,.factory-bootstrap-430 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-430 .navbar-fixed-bottom,.factory-bootstrap-430 .navbar-fixed-top,.factory-bootstrap-430 .navbar-static-top{border-radius:0}.factory-bootstrap-430 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-430 .alert .actions{padding-top:10px}.factory-bootstrap-430 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-430 .alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0)}.factory-bootstrap-430 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-430 .alert-normal,.factory-bootstrap-430 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-430 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-430 .alert-danger a:not(.btn),.factory-bootstrap-430 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-430 .progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.factory-bootstrap-430 .progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.factory-bootstrap-430 .progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.factory-bootstrap-430 .progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.factory-bootstrap-430 .progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.factory-bootstrap-430 .progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.factory-bootstrap-430 .list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-430 .list-group-item.active,.factory-bootstrap-430 .list-group-item.active:focus,.factory-bootstrap-430 .list-group-item.active:hover{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0)}.factory-bootstrap-430 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-430 .panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-430 .panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-430 .panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.factory-bootstrap-430 .panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.factory-bootstrap-430 .panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.factory-bootstrap-430 .panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.factory-bootstrap-430 .well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.factory-bootstrap-430 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-430 .factory-hidden{display:none}.factory-bootstrap-430 .factory-ajax-loader{width:25px;height:25px;background:url(../assets/images/loader-sm-tr.gif)}.factory-control-error{background-color:rgba(0,0,0,.8);white-space:normal;z-index:10;font-weight:400;line-height:150%;border-radius:4px;color:#fff;font-size:13px;margin-top:5px;padding:4px 10px 3px;max-width:500px;display:inline-block}.factory-control-error i{margin:0 7px 0 1px}
libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .btn-primary{background:#a3b745;border-color:#839237;color:#fff;-webkit-box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#a3b745;border-color:#839237}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .btn-primary{background:#a3b745;border-color:#839237;color:#fff;-webkit-box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:active{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-430 .btn-primary:disabled,.factory-bootstrap-430 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-430 .btn-group .btn.active.value{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{background-color:#a3b745;border-color:#839237}
libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-421 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-421 .factory-form-group .factory-hint-icon{display:block;width:16px;height:16px;line-height:13px;padding:0;font-size:11px;text-align:center;position:absolute;top:-5px;right:-3px;color:#fff;background:#E91E63;border-radius:3px}.factory-bootstrap-421 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-421 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-421 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-421 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-421 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-421 .factory-form-group legend+.control-group{margin-top:0}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-430 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-430 .factory-form-group .factory-hint-icon{display:block;width:16px;height:16px;line-height:13px;padding:0;font-size:11px;text-align:center;position:absolute;top:-5px;right:-3px;color:#fff;background:#E91E63;border-radius:3px}.factory-bootstrap-430 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-430 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-430 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-430 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-430 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-430 .factory-form-group legend+.control-group{margin-top:0}
libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .btn-primary{background:#04a4cc;border-color:#037c9a;color:#fff;-webkit-box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#04a4cc;border-color:#037c9a}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .btn-primary{background:#04a4cc;border-color:#037c9a;color:#fff;-webkit-box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:active{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-430 .btn-primary:disabled,.factory-bootstrap-430 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-430 .btn-group .btn.active.value{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{background-color:#04a4cc;border-color:#037c9a}
libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .btn-primary{background:#e14d43;border-color:#d02a21;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#e14d43;border-color:#d02a21}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .btn-primary{background:#e14d43;border-color:#d02a21;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:active{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-430 .btn-primary:disabled,.factory-bootstrap-430 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-430 .btn-group .btn.active.value{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{background-color:#e14d43;border-color:#d02a21}
libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .btn-primary{background:#9ebaa0;border-color:#80a583;color:#fff;-webkit-box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#9ebaa0;border-color:#80a583}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .btn-primary{background:#9ebaa0;border-color:#80a583;color:#fff;-webkit-box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:active{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-430 .btn-primary:disabled,.factory-bootstrap-430 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-430 .btn-group .btn.active.value{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{background-color:#9ebaa0;border-color:#80a583}
libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .factory-separator{border-bottom:1px solid #f9f9f9;border-top:1px solid #d1d1d1;margin-bottom:25px}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .factory-separator{border-bottom:1px solid #f9f9f9;border-top:1px solid #d1d1d1;margin-bottom:25px}
libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .btn-primary{background:#dd823b;border-color:#c36822;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#dd823b;border-color:#c36822}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .btn-primary{background:#dd823b;border-color:#c36822;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:focus,.factory-bootstrap-430 .btn-primary:hover{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-430 .btn-primary:active{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-430 .btn-primary:disabled,.factory-bootstrap-430 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-430 .btn-group .btn.active.value{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-430 .pagination>.active>a,.factory-bootstrap-430 .pagination>.active>a:focus,.factory-bootstrap-430 .pagination>.active>a:hover,.factory-bootstrap-430 .pagination>.active>span,.factory-bootstrap-430 .pagination>.active>span:focus,.factory-bootstrap-430 .pagination>.active>span:hover{background-color:#dd823b;border-color:#c36822}
libs/factory/bootstrap/assets/css-min/control.checkbox.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- #side-sortables .factory-bootstrap-421 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-421 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-421 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-421 .factory-buttons-way .factory-on.active{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-421 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-421 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}
8
  */
9
 
10
 
11
+ #side-sortables .factory-bootstrap-430 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-430 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-430 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-430 .factory-buttons-way .factory-on.active{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-430 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-430 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-430 .factory-buttons-way .factory-on.active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-430 .factory-buttons-way .factory-on.active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-430 .factory-buttons-way .factory-on.active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-430 .factory-buttons-way .factory-on.active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-430 .factory-buttons-way .factory-on.active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-430 .factory-buttons-way .factory-on.active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-430 .factory-buttons-way .factory-on.active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}
libs/factory/bootstrap/assets/css-min/control.dropdown.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-421 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-421 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way .dd-selected{padding:8px 12px 8px 11px!important}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-430 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-430 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-430 .factory-dropdown.factory-buttons-way .active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-430 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-430 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-430 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-430 .factory-dropdown.factory-ddslick-way .dd-selected{padding:8px 12px 8px 11px!important}
libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-421 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-421 .factory-mtextbox-item .factory-mtextbox-remove-item{position:absolute;top:0;right:0;bottom:0;width:40px;border-radius:0 3px 3px 0;outline:0}.factory-bootstrap-421 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-421 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-421 .factory-mtextbox-add-item{display:block;margin-top:10px}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-430 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-430 .factory-mtextbox-item .factory-mtextbox-remove-item{position:absolute;top:0;right:0;bottom:0;width:40px;border-radius:0 3px 3px 0;outline:0}.factory-bootstrap-430 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-430 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-430 .factory-mtextbox-add-item{display:block;margin-top:10px}
libs/factory/bootstrap/assets/css-min/holder.more-link.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-421 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-421 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-421 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-421 .factory-tab .factory-more-link-hide{position:absolute;margin-top:-35px;background-color:#fff;padding:0 5px;right:20px;color:#bbb;text-decoration:none}.factory-bootstrap-421 .factory-tab .factory-more-link-hide:hover{color:#999}
8
  */
9
 
10
 
11
+ .factory-bootstrap-430 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-430 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-430 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-430 .factory-tab .factory-more-link-hide{position:absolute;margin-top:-35px;background-color:#fff;padding:0 5px;right:20px;color:#bbb;text-decoration:none}.factory-bootstrap-430 .factory-tab .factory-more-link-hide:hover{color:#999}
libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js CHANGED
@@ -7,4 +7,4 @@
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
- +function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=factory-dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}},a.fn.factoryBootstrap421_dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.factoryBootstrap421_dropdown.Constructor=f,a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ +function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=factory-dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}},a.fn.factoryBootstrap430_dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.factoryBootstrap430_dropdown.Constructor=f,a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery);
libs/factory/bootstrap/assets/js-min/control.checkbox.min.js CHANGED
@@ -7,4 +7,4 @@
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
- !function(a){var b=function(b){var c=this;this.$element=a(b),this.$result=this.$element.find(".factory-result"),this.$on=this.$element.find(".factory-on"),this.$off=this.$element.find(".factory-off");var d=this.$element.is(".factory-tumbler"),e=this.$element.is(".factory-has-tumbler-hint"),f=this.$element.data("tumbler-function"),g=this.$element.data("tumbler-delay");g||(g=3e3),this.callByPath=function(a,b){for(var c=a.split("."),d=window,e=0;e<c.length;e++)d=d[c[e]];d.apply(d,b)},this.$on.click(function(){return c.$off.removeClass("active"),c.$on.addClass("active"),d?setTimeout(function(){c.$on.removeClass("active"),c.$off.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.attr("checked","checked"),c.$result.val(1),c.$result.trigger("change")),!1}),this.$off.click(function(){return c.$on.removeClass("active"),c.$off.addClass("active"),d?setTimeout(function(){c.$off.removeClass("active"),c.$on.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.removeAttr("checked"),c.$result.val(0),c.$result.trigger("change")),!1}),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){(void 0!==window.__factory_checkbox_control_events_off_data||void 0!==window.__factory_checkbox_control_events_on_data)&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.prop("checked"),f=window.__factory_checkbox_control_events_on_data[d],g=window.__factory_checkbox_control_events_off_data[d];if(f||g){var h,i;void 0===window.__factory_checkbox_control_detach_elements&&(window.__factory_checkbox_control_detach_elements={}),h=window.__factory_checkbox_control_detach_elements,i=e?f:g;for(var j in i)if(i.hasOwnProperty(j)){var k,l=i[j];a.isArray(l)||(k=c.hashCode(d+l));var m;switch(j){case"hide":"string"==typeof l&&a(l).hide(0);break;case"show":"string"==typeof l&&a(l).fadeIn(200);break;case"detach":"string"==typeof l&&a(l).each(function(b){h[k]||(h[k]={}),h[k][b]||(h[k][b]={}),h[k][b].recovery_contanier=a(this).parent(),h[k][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(h[k]){for(var n in h[k])h[k].hasOwnProperty(n)&&h[k][n].recovery_contanier&&h[k][n].element&&h[k][n].recovery_contanier.append(h[k][n].element);delete h[k]}break;case"removeClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).removeClass(l[m]);break;case"addClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).addClass(l[m]);break;case"setValue":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&void 0!==l[m]&&null!==l[m]&&(console.log(l[m]),a(m).val(l[m]))}}}},this.executeEvents(this.$result)};a.fn.factoryBootstrap421_checkboxControl=function(c){if("string"==typeof c){var d=a(this).data("factory.checkbox.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.checkbox.control");d||c.data("factory.checkbox.control",d=new b(this))})},a.fn.factoryBootstrap421_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-421 .factory-checkbox.factory-buttons-way").factoryBootstrap421_checkboxControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){var b=function(b){var c=this;this.$element=a(b),this.$result=this.$element.find(".factory-result"),this.$on=this.$element.find(".factory-on"),this.$off=this.$element.find(".factory-off");var d=this.$element.is(".factory-tumbler"),e=this.$element.is(".factory-has-tumbler-hint"),f=this.$element.data("tumbler-function"),g=this.$element.data("tumbler-delay");g||(g=3e3),this.callByPath=function(a,b){for(var c=a.split("."),d=window,e=0;e<c.length;e++)d=d[c[e]];d.apply(d,b)},this.$on.click(function(){return c.$off.removeClass("active"),c.$on.addClass("active"),d?setTimeout(function(){c.$on.removeClass("active"),c.$off.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.attr("checked","checked"),c.$result.val(1),c.$result.trigger("change")),!1}),this.$off.click(function(){return c.$on.removeClass("active"),c.$off.addClass("active"),d?setTimeout(function(){c.$off.removeClass("active"),c.$on.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.removeAttr("checked"),c.$result.val(0),c.$result.trigger("change")),!1}),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){(void 0!==window.__factory_checkbox_control_events_off_data||void 0!==window.__factory_checkbox_control_events_on_data)&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.prop("checked"),f=window.__factory_checkbox_control_events_on_data[d],g=window.__factory_checkbox_control_events_off_data[d];if(f||g){var h,i;void 0===window.__factory_checkbox_control_detach_elements&&(window.__factory_checkbox_control_detach_elements={}),h=window.__factory_checkbox_control_detach_elements,i=e?f:g;for(var j in i)if(i.hasOwnProperty(j)){var k,l=i[j];a.isArray(l)||(k=c.hashCode(d+l));var m;switch(j){case"hide":"string"==typeof l&&a(l).hide(0);break;case"show":"string"==typeof l&&a(l).fadeIn(200);break;case"detach":"string"==typeof l&&a(l).each(function(b){h[k]||(h[k]={}),h[k][b]||(h[k][b]={}),h[k][b].recovery_contanier=a(this).parent(),h[k][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(h[k]){for(var n in h[k])h[k].hasOwnProperty(n)&&h[k][n].recovery_contanier&&h[k][n].element&&h[k][n].recovery_contanier.append(h[k][n].element);delete h[k]}break;case"removeClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).removeClass(l[m]);break;case"addClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).addClass(l[m]);break;case"setValue":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&void 0!==l[m]&&null!==l[m]&&(console.log(l[m]),a(m).val(l[m]))}}}},this.executeEvents(this.$result)};a.fn.factoryBootstrap430_checkboxControl=function(c){if("string"==typeof c){var d=a(this).data("factory.checkbox.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.checkbox.control");d||c.data("factory.checkbox.control",d=new b(this))})},a.fn.factoryBootstrap430_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-430 .factory-checkbox.factory-buttons-way").factoryBootstrap430_checkboxControl()})}(jQuery);
libs/factory/bootstrap/assets/js-min/control.dropdown.min.js CHANGED
@@ -7,4 +7,4 @@
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
- !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name")||this.$element.attr("name"),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){void 0!==window.factory_dropdown_control_events_data&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.val(),f=window.factory_dropdown_control_events_data[d];if(f&&f[e]){var g;void 0===window.__factory_dropdown_control_detach_elements&&(window.__factory_dropdown_control_detach_elements={}),g=window.__factory_dropdown_control_detach_elements;for(var h in f[e])if(f[e].hasOwnProperty(h)){var i,j=f[e][h];switch(a.isArray(j)||(i=c.hashCode(d+j)),h){case"hide":"string"==typeof j&&a(j).hide(0);break;case"show":"string"==typeof j&&a(j).fadeIn(200);break;case"detach":"string"==typeof j&&a(j).each(function(b){g[i]||(g[i]={}),g[i][b]||(g[i][b]={}),g[i][b].recovery_contanier=a(this).parent(),g[i][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(g[i]){for(var k in g[i])g[i].hasOwnProperty(k)&&g[i][k].recovery_contanier&&g[i][k].element&&g[i][k].recovery_contanier.append(g[i][k].element);delete g[i]}break;case"removeClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).removeClass(j[l]);break;case"addClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).addClass(j[l])}}}},"buttons"===this.way)this.$result=this.$element.find(".factory-result"),this.$hints=this.$element.find(".factory-hints"),this.$buttons=this.$element.find(".btn"),c.executeEvents(this.$result),this.$buttons.click(function(){var b=a(this).data("value");return c.$buttons.removeClass("active"),a(this).addClass("active"),c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+b).fadeIn(),c.$result.val(b),c.$result.trigger("change"),!1});else if("ddslick"===this.way){c.executeEvents(c.$element.find(".factory-result"));var d=window["factory_"+this.name+"_data"],e=this.$element.find(".factory-ddslick"),f=this.$element.data("width")||300,g=this.$element.data("align")||"right";a(d).each(function(){return this.imageHoverSrc?void(a("<img/>")[0].src=this.imageHoverSrc):!0}),e.ddslick({data:d,width:f,imagePosition:g,selectText:"- select -",onSelected:function(a){a.selectedData.imageHoverSrc&&c.$element.find(".dd-selected-image").attr("src",a.selectedData.imageHoverSrc);var b=c.$element.find(".factory-result").val(a.selectedData.value);b.change()}})}else{c.executeEvents(this.$element),this.$hints=this.$element.next(),this.$hints.hasClass("factory-hints")&&(this.$element.change(function(){return c.updateHints(),!1}),this.updateHints=function(){var a=c.$element.val();c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+a).show()},c.updateHints()),this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(a){console&&console.log&&console.log(a.responseText),c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length)for(var d in a){var e=a[d];c.addListItem(e)}else this.$element.append("<option>"+b.emptyList+"</li>");this.$element.trigger("factory-loaded")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<option />").attr("value",b.value).text(b.title).appendTo(this.$element),e=c.getAjaxData();e.selected&&e.selected==b.value&&d.attr("selected","selected")},this.showError=function(b){this.clearList();var d=a("<div class='factory-control-error'></div>").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),e=c.getAjaxData();this.$element.append("<option>"+e.emptyList+"</li>"),this.$element.after(d),this.$element.addClass("factory-has-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var h=this.$element.data("ajax");h&&this.loadData()}};a.fn.factoryBootstrap421_dropdownControl=function(c){if("string"==typeof c){var d=a(this).data("factory.dropdown.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.dropdown.control");d||c.data("factory.dropdown.control",d=new b(this))})},a.fn.factoryBootstrap421_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-421 .factory-dropdown").factoryBootstrap421_dropdownControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name")||this.$element.attr("name"),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){void 0!==window.factory_dropdown_control_events_data&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.val(),f=window.factory_dropdown_control_events_data[d];if(f&&f[e]){var g;void 0===window.__factory_dropdown_control_detach_elements&&(window.__factory_dropdown_control_detach_elements={}),g=window.__factory_dropdown_control_detach_elements;for(var h in f[e])if(f[e].hasOwnProperty(h)){var i,j=f[e][h];switch(a.isArray(j)||(i=c.hashCode(d+j)),h){case"hide":"string"==typeof j&&a(j).hide(0);break;case"show":"string"==typeof j&&a(j).fadeIn(200);break;case"detach":"string"==typeof j&&a(j).each(function(b){g[i]||(g[i]={}),g[i][b]||(g[i][b]={}),g[i][b].recovery_contanier=a(this).parent(),g[i][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(g[i]){for(var k in g[i])g[i].hasOwnProperty(k)&&g[i][k].recovery_contanier&&g[i][k].element&&g[i][k].recovery_contanier.append(g[i][k].element);delete g[i]}break;case"removeClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).removeClass(j[l]);break;case"addClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).addClass(j[l])}}}},"buttons"===this.way)this.$result=this.$element.find(".factory-result"),this.$hints=this.$element.find(".factory-hints"),this.$buttons=this.$element.find(".btn"),c.executeEvents(this.$result),this.$buttons.click(function(){var b=a(this).data("value");return c.$buttons.removeClass("active"),a(this).addClass("active"),c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+b).fadeIn(),c.$result.val(b),c.$result.trigger("change"),!1});else if("ddslick"===this.way){c.executeEvents(c.$element.find(".factory-result"));var d=window["factory_"+this.name+"_data"],e=this.$element.find(".factory-ddslick"),f=this.$element.data("width")||300,g=this.$element.data("align")||"right";a(d).each(function(){return this.imageHoverSrc?void(a("<img/>")[0].src=this.imageHoverSrc):!0}),e.ddslick({data:d,width:f,imagePosition:g,selectText:"- select -",onSelected:function(a){a.selectedData.imageHoverSrc&&c.$element.find(".dd-selected-image").attr("src",a.selectedData.imageHoverSrc);var b=c.$element.find(".factory-result").val(a.selectedData.value);b.change()}})}else{c.executeEvents(this.$element),this.$hints=this.$element.next(),this.$hints.hasClass("factory-hints")&&(this.$element.change(function(){return c.updateHints(),!1}),this.updateHints=function(){var a=c.$element.val();c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+a).show()},c.updateHints()),this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(a){console&&console.log&&console.log(a.responseText),c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length)for(var d in a){var e=a[d];c.addListItem(e)}else this.$element.append("<option>"+b.emptyList+"</li>");this.$element.trigger("factory-loaded")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<option />").attr("value",b.value).text(b.title).appendTo(this.$element),e=c.getAjaxData();e.selected&&e.selected==b.value&&d.attr("selected","selected")},this.showError=function(b){this.clearList();var d=a("<div class='factory-control-error'></div>").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),e=c.getAjaxData();this.$element.append("<option>"+e.emptyList+"</li>"),this.$element.after(d),this.$element.addClass("factory-has-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var h=this.$element.data("ajax");h&&this.loadData()}};a.fn.factoryBootstrap430_dropdownControl=function(c){if("string"==typeof c){var d=a(this).data("factory.dropdown.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.dropdown.control");d||c.data("factory.dropdown.control",d=new b(this))})},a.fn.factoryBootstrap430_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-430 .factory-dropdown").factoryBootstrap430_dropdownControl()})}(jQuery);
libs/factory/bootstrap/assets/js-min/control.list.min.js CHANGED
@@ -7,4 +7,4 @@
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
- !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name"),"checklist"===this.way){this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(){c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length){this.$element.removeClass("factory-empty");for(var d in a){var e=a[d];c.addListItem(e)}}else this.$element.addClass("factory-empty"),this.$element.append("<li>"+b.emptyList+"</li>")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<li>"),e=a("<label>").attr("for","factory-checklist-"+c.name+"-"+b.value).appendTo(d),f=a("<span>").appendTo(e),g=a("<input />").attr("type","checkbox").attr("name",c.name+"[]").val(b.value).attr("id","factory-checklist-"+c.name+"-"+b.value).appendTo(f),h=(a("<span>"+b.title+"</span>").appendTo(e),c.getAjaxData());h.selected.length&&a.inArray(b.value,h.selected)>=0&&g.attr("checked","checked"),this.$element.append(d)},this.showError=function(b){this.$element.html("").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),this.$element.addClass("factory-list-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var d=this.$element.data("ajax");d&&this.loadData()}};a.fn.factoryBootstrap421_listControl=function(c){if("string"==typeof c){var d=a(this).data("factory.list.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.list.control");d||c.data("factory.list.control",d=new b(this))})},a.fn.factoryBootstrap421_listControl.Constructor=b,a(function(){a(".factory-bootstrap-421 .factory-list").factoryBootstrap421_listControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name"),"checklist"===this.way){this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(){c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length){this.$element.removeClass("factory-empty");for(var d in a){var e=a[d];c.addListItem(e)}}else this.$element.addClass("factory-empty"),this.$element.append("<li>"+b.emptyList+"</li>")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<li>"),e=a("<label>").attr("for","factory-checklist-"+c.name+"-"+b.value).appendTo(d),f=a("<span>").appendTo(e),g=a("<input />").attr("type","checkbox").attr("name",c.name+"[]").val(b.value).attr("id","factory-checklist-"+c.name+"-"+b.value).appendTo(f),h=(a("<span>"+b.title+"</span>").appendTo(e),c.getAjaxData());h.selected.length&&a.inArray(b.value,h.selected)>=0&&g.attr("checked","checked"),this.$element.append(d)},this.showError=function(b){this.$element.html("").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),this.$element.addClass("factory-list-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var d=this.$element.data("ajax");d&&this.loadData()}};a.fn.factoryBootstrap430_listControl=function(c){if("string"==typeof c){var d=a(this).data("factory.list.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.list.control");d||c.data("factory.list.control",d=new b(this))})},a.fn.factoryBootstrap430_listControl.Constructor=b,a(function(){a(".factory-bootstrap-430 .factory-list").factoryBootstrap430_listControl()})}(jQuery);
libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js CHANGED
@@ -7,4 +7,4 @@
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
- !function(a){"use strict";var b=function(b){this.$element=a(b);var c=a(".factory-mtextbox-item",this.$element).eq(0).clone(!0);a(".factory-mtextbox-add-item",this.$element).on("click",function(){var b=a(this).closest(".factory-multiple-textbox-group").find(".factory-mtextbox-items"),d=c.clone(!0),e=a('<button class="btn btn-default btn-small factory-mtextbox-remove-item"><i class="fa fa-times" aria-hidden="true"></i></button>');return b.append(d.append(e)),d.find('input[type="text"]').val("").focus(),!1}),a(document).on("click",".factory-mtextbox-remove-item",function(){return a(this).closest(".factory-mtextbox-item").remove(),!1})};a.fn.factoryBootstrap421_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-421 .factory-multiple-textbox-group").factoryBootstrap421_MultipleTextboxControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){"use strict";var b=function(b){this.$element=a(b);var c=a(".factory-mtextbox-item",this.$element).eq(0).clone(!0);a(".factory-mtextbox-add-item",this.$element).on("click",function(){var b=a(this).closest(".factory-multiple-textbox-group").find(".factory-mtextbox-items"),d=c.clone(!0),e=a('<button class="btn btn-default btn-small factory-mtextbox-remove-item"><i class="fa fa-times" aria-hidden="true"></i></button>');return b.append(d.append(e)),d.find('input[type="text"]').val("").focus(),!1}),a(document).on("click",".factory-mtextbox-remove-item",function(){return a(this).closest(".factory-mtextbox-item").remove(),!1})};a.fn.factoryBootstrap430_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-430 .factory-multiple-textbox-group").factoryBootstrap430_MultipleTextboxControl()})}(jQuery);
libs/factory/bootstrap/boot.php CHANGED
@@ -10,37 +10,37 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
  // module provides function only for the admin area
18
- if ( ! is_admin() ) {
19
  return;
20
  }
21
 
22
- if ( defined( 'FACTORY_BOOTSTRAP_421_LOADED' ) ) {
23
  return;
24
  }
25
 
26
- define( 'FACTORY_BOOTSTRAP_421_VERSION', '4.2.1' );
27
- define( 'FACTORY_BOOTSTRAP_421_LOADED', true );
28
 
29
- if ( ! defined( 'FACTORY_FLAT_ADMIN' ) ) {
30
- define( 'FACTORY_FLAT_ADMIN', true );
31
  }
32
 
33
- define( 'FACTORY_BOOTSTRAP_421_DIR', dirname( __FILE__ ) );
34
- define( 'FACTORY_BOOTSTRAP_421_URL', plugins_url( null, __FILE__ ) );
35
 
36
- require_once( FACTORY_BOOTSTRAP_421_DIR . '/includes/functions.php' );
37
 
38
  /**
39
- * @param Wbcr_Factory420_Plugin $plugin
40
  */
41
- add_action( 'wbcr_factory_bootstrap_421_plugin_created', function ( $plugin ) {
42
- $manager = new Wbcr_FactoryBootstrap421_Manager( $plugin );
43
- $plugin->setBootstap( $manager );
44
- } );
45
 
46
 
10
  */
11
 
12
  // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
 
17
  // module provides function only for the admin area
18
+ if( !is_admin() ) {
19
  return;
20
  }
21
 
22
+ if( defined('FACTORY_BOOTSTRAP_430_LOADED') ) {
23
  return;
24
  }
25
 
26
+ define('FACTORY_BOOTSTRAP_430_VERSION', '4.3.0');
27
+ define('FACTORY_BOOTSTRAP_430_LOADED', true);
28
 
29
+ if( !defined('FACTORY_FLAT_ADMIN') ) {
30
+ define('FACTORY_FLAT_ADMIN', true);
31
  }
32
 
33
+ define('FACTORY_BOOTSTRAP_430_DIR', dirname(__FILE__));
34
+ define('FACTORY_BOOTSTRAP_430_URL', plugins_url(null, __FILE__));
35
 
36
+ require_once(FACTORY_BOOTSTRAP_430_DIR . '/includes/functions.php');
37
 
38
  /**
39
+ * @param Wbcr_Factory429_Plugin $plugin
40
  */
41
+ add_action('wbcr_factory_bootstrap_430_plugin_created', function ($plugin) {
42
+ $manager = new Wbcr_FactoryBootstrap430_Manager($plugin);
43
+ $plugin->setBootstap($manager);
44
+ });
45
 
46
 
libs/factory/bootstrap/includes/functions.php CHANGED
@@ -20,13 +20,13 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  *
21
  * @since 3.2.0
22
  */
23
- class Wbcr_FactoryBootstrap421_Manager {
24
 
25
  /**
26
  * A plugin for which the manager was created.
27
  *
28
  * @since 3.2.0
29
- * @var Wbcr_Factory420_Plugin
30
  */
31
  public $plugin;
32
 
@@ -51,7 +51,7 @@ class Wbcr_FactoryBootstrap421_Manager {
51
  *
52
  * @since 1.0.0
53
  */
54
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
55
  $this->plugin = $plugin;
56
 
57
  add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
@@ -111,8 +111,8 @@ class Wbcr_FactoryBootstrap421_Manager {
111
  */
112
  public function loadAssets( $hook ) {
113
 
114
- do_action( 'wbcr_factory_420_bootstrap_enqueue_scripts', $hook );
115
- do_action( 'wbcr_factory_420_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook );
116
 
117
  $dependencies = [];
118
  if ( ! empty( $this->scripts ) ) {
@@ -137,64 +137,14 @@ class Wbcr_FactoryBootstrap421_Manager {
137
  if ( ! empty( $this->styles ) ) {
138
  $this->enqueueScripts( $this->styles, 'css', $dependencies );
139
  }
140
-
141
- $user_id = get_current_user_id();
142
- $color_name = get_user_meta( $user_id, 'admin_color', true );
143
-
144
- if ( $color_name !== 'fresh' ) {
145
- if ( file_exists( FACTORY_BOOTSTRAP_421_DIR . '/assets/flat/css/bootstrap.' . $color_name . '.css' ) ) {
146
- wp_enqueue_style( 'wbcr-factory-bootstrap-421-colors', FACTORY_BOOTSTRAP_421_URL . '/assets/flat/css/bootstrap.' . $color_name . '.css' );
147
- }
148
- }
149
-
150
- if ( $color_name == 'light' ) {
151
- $primary_dark = '#037c9a';
152
- $primary_light = '#04a4cc';
153
- } else if ( $color_name == 'blue' ) {
154
- $primary_dark = '#d39323';
155
- $primary_light = '#e1a948';
156
- } else if ( $color_name == 'coffee' ) {
157
- $primary_dark = '#b78a66';
158
- $primary_light = '#c7a589';
159
- } else if ( $color_name == 'ectoplasm' ) {
160
- $primary_dark = '#839237';
161
- $primary_light = '#a3b745';
162
- } else if ( $color_name == 'ocean' ) {
163
- $primary_dark = '#80a583';
164
- $primary_light = '#9ebaa0';
165
- } else if ( $color_name == 'midnight' ) {
166
- $primary_dark = '#d02a21';
167
- $primary_light = '#e14d43';
168
- } else if ( $color_name == 'sunrise' ) {
169
- $primary_dark = '#c36822';
170
- $primary_light = '#dd823b';
171
- } else {
172
- $primary_dark = '#0074a2';
173
- $primary_light = '#2ea2cc';
174
- }
175
-
176
- ?>
177
- <script>
178
- if( !window.factory ) {
179
- window.factory = {};
180
- }
181
- if( !window.factory.factoryBootstrap421 ) {
182
- window.factory.factoryBootstrap421 = {};
183
- }
184
- window.factory.factoryBootstrap421.colors = {
185
- primaryDark: '<?php echo $primary_dark ?>',
186
- primaryLight: '<?php echo $primary_light ?>'
187
- };
188
- </script>
189
- <?php
190
  }
191
 
192
  /**
193
- * @param array $sripts
194
  * @param string $type
195
  * @param array $dependencies
196
  */
197
- protected function enqueueScripts( array $sripts, $type = 'js', array $dependencies ) {
198
 
199
  $is_first = true;
200
 
@@ -206,8 +156,8 @@ class Wbcr_FactoryBootstrap421_Manager {
206
  $cache_enable = apply_filters( 'wbcr/factory/bootstrap/cache_enable', true );
207
 
208
  $cache_id = md5( implode( ',', $this->scripts ) . $type . $this->plugin->getPluginVersion() );
209
- $cache_dir_path = FACTORY_BOOTSTRAP_421_DIR . '/assets/cache/';
210
- $cache_dir_url = FACTORY_BOOTSTRAP_421_URL . '/assets/cache/';
211
 
212
  $cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
213
  $cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
@@ -231,10 +181,10 @@ class Wbcr_FactoryBootstrap421_Manager {
231
  }
232
 
233
  $concat_files = [];
234
- foreach ( $sripts as $script_to_load ) {
235
  $script_to_load = sanitize_text_field( $script_to_load );
236
  if ( $cache_enable && $cache_dir_exists ) {
237
- $fname = FACTORY_BOOTSTRAP_421_DIR . "/assets/$type-min/$script_to_load.min." . $type;
238
  if ( file_exists( $fname ) ) {
239
  $f = @fopen( $fname, 'r' );
240
  $concat_files[] = @fread( $f, filesize( $fname ) );
@@ -242,9 +192,9 @@ class Wbcr_FactoryBootstrap421_Manager {
242
  }
243
  } else {
244
  if ( $type == 'js' ) {
245
- wp_enqueue_script( md5( $script_to_load ), FACTORY_BOOTSTRAP_421_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first ? $dependencies : false, $this->plugin->getPluginVersion() );
246
  } else {
247
- wp_enqueue_style( md5( $script_to_load ), FACTORY_BOOTSTRAP_421_URL . "/assets/$type-min/$script_to_load.min." . $type, [], $this->plugin->getPluginVersion() );
248
  }
249
  $is_first = false;
250
  }
20
  *
21
  * @since 3.2.0
22
  */
23
+ class Wbcr_FactoryBootstrap430_Manager {
24
 
25
  /**
26
  * A plugin for which the manager was created.
27
  *
28
  * @since 3.2.0
29
+ * @var Wbcr_Factory429_Plugin
30
  */
31
  public $plugin;
32
 
51
  *
52
  * @since 1.0.0
53
  */
54
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
55
  $this->plugin = $plugin;
56
 
57
  add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
111
  */
112
  public function loadAssets( $hook ) {
113
 
114
+ do_action( 'wbcr_factory_429_bootstrap_enqueue_scripts', $hook );
115
+ do_action( 'wbcr_factory_429_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook );
116
 
117
  $dependencies = [];
118
  if ( ! empty( $this->scripts ) ) {
137
  if ( ! empty( $this->styles ) ) {
138
  $this->enqueueScripts( $this->styles, 'css', $dependencies );
139
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  }
141
 
142
  /**
143
+ * @param array $scripts
144
  * @param string $type
145
  * @param array $dependencies
146
  */
147
+ protected function enqueueScripts( array $scripts, $type, array $dependencies ) {
148
 
149
  $is_first = true;
150
 
156
  $cache_enable = apply_filters( 'wbcr/factory/bootstrap/cache_enable', true );
157
 
158
  $cache_id = md5( implode( ',', $this->scripts ) . $type . $this->plugin->getPluginVersion() );
159
+ $cache_dir_path = FACTORY_BOOTSTRAP_430_DIR . '/assets/cache/';
160
+ $cache_dir_url = FACTORY_BOOTSTRAP_430_URL . '/assets/cache/';
161
 
162
  $cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
163
  $cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
181
  }
182
 
183
  $concat_files = [];
184
+ foreach ( $scripts as $script_to_load ) {
185
  $script_to_load = sanitize_text_field( $script_to_load );
186
  if ( $cache_enable && $cache_dir_exists ) {
187
+ $fname = FACTORY_BOOTSTRAP_430_DIR . "/assets/$type-min/$script_to_load.min." . $type;
188
  if ( file_exists( $fname ) ) {
189
  $f = @fopen( $fname, 'r' );
190
  $concat_files[] = @fread( $f, filesize( $fname ) );
192
  }
193
  } else {
194
  if ( $type == 'js' ) {
195
+ wp_enqueue_script( md5( $script_to_load ), FACTORY_BOOTSTRAP_430_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first ? $dependencies : false, $this->plugin->getPluginVersion() );
196
  } else {
197
+ wp_enqueue_style( md5( $script_to_load ), FACTORY_BOOTSTRAP_430_URL . "/assets/$type-min/$script_to_load.min." . $type, [], $this->plugin->getPluginVersion() );
198
  }
199
  $is_first = false;
200
  }
libs/factory/clearfy/assets/css/clearfy-base.css CHANGED
@@ -5,18 +5,18 @@
5
  * @copyright Webcraftic 06.10.2018
6
  * @sicne 2.0.5
7
  */
8
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion {
9
  padding: 30px 80px;
10
  }
11
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion h3 {
12
  margin: 0 0 20px;
13
  }
14
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-inner-contanier {
15
  border: 2px dashed #8bc34a;
16
  background: #fff;
17
  padding: 20px;
18
  }
19
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium {
20
  display: inline-block;
21
  cursor: pointer;
22
  line-height: 16px;
@@ -35,16 +35,16 @@
35
  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
36
  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
37
  }
38
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium:active {
39
  box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
40
  -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
41
  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
42
  }
43
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium:focus {
44
  outline: none;
45
  border: 0;
46
  }
47
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium {
48
  display: inline-block;
49
  cursor: pointer;
50
  line-height: 16px;
@@ -63,22 +63,22 @@
63
  -moz-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
64
  -webkit-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
65
  }
66
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium:active {
67
  box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
68
  -moz-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
69
  -webkit-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
70
  }
71
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium:focus {
72
  outline: none;
73
  border: 0;
74
  }
75
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion {
76
  background: #fff;
77
  color: #353535;
78
  font-weight: 600;
79
  border: 2px dashed #8bc34a;
80
  }
81
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion h3 {
82
  margin: 0 0 20px;
83
  padding: 10px 0;
84
  text-align: center;
@@ -89,16 +89,16 @@
89
  vertical-align: middle;
90
  text-transform: uppercase;
91
  }
92
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul {
93
  position: relative;
94
  margin-bottom: 20px;
95
  }
96
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li {
97
  font-size: 15px;
98
  padding: 7px;
99
  padding-left: 20px;
100
  }
101
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li:before {
102
  content: " ";
103
  display: inline-block;
104
  width: 0.4em;
@@ -112,7 +112,7 @@
112
  -o-transform: rotate(45deg);
113
  transform: rotate(45deg);
114
  }
115
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium {
116
  display: block;
117
  cursor: pointer;
118
  line-height: 16px;
@@ -131,44 +131,44 @@
131
  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
132
  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
133
  }
134
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium:active {
135
  box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
136
  -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
137
  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
138
  }
139
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium:focus {
140
  outline: none;
141
  border: 0;
142
  }
143
  @media screen and (max-width: 1550px) {
144
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-pro-suggetion {
145
  padding: 10px 80px;
146
  }
147
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion {
148
  padding: 10px;
149
  }
150
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion h3 {
151
  margin: 0 0 20px;
152
  padding: 10px 0;
153
  font-size: 13px;
154
  font-weight: 600;
155
  }
156
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul {
157
  margin-bottom: 20px;
158
  }
159
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li {
160
  font-size: 13px;
161
  padding: 2px;
162
  padding-left: 10px;
163
  }
164
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li:before {
165
  width: 0.4em;
166
  height: 0.7em;
167
  border-width: 0 0.2em 0.2em 0;
168
  left: 0;
169
  margin-right: 10px;
170
  }
171
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium {
172
  font-weight: 700;
173
  line-height: 16px;
174
  font-size: 12px;
5
  * @copyright Webcraftic 06.10.2018
6
  * @sicne 2.0.5
7
  */
8
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion {
9
  padding: 30px 80px;
10
  }
11
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion h3 {
12
  margin: 0 0 20px;
13
  }
14
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion .wbcr-factory-inner-contanier {
15
  border: 2px dashed #8bc34a;
16
  background: #fff;
17
  padding: 20px;
18
  }
19
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion .wbcr-factory-activate-premium {
20
  display: inline-block;
21
  cursor: pointer;
22
  line-height: 16px;
35
  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
36
  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
37
  }
38
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion .wbcr-factory-activate-premium:active {
39
  box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
40
  -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
41
  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
42
  }
43
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion .wbcr-factory-activate-premium:focus {
44
  outline: none;
45
  border: 0;
46
  }
47
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion .wbcr-factory-purchase-premium {
48
  display: inline-block;
49
  cursor: pointer;
50
  line-height: 16px;
63
  -moz-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
64
  -webkit-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
65
  }
66
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion .wbcr-factory-purchase-premium:active {
67
  box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
68
  -moz-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
69
  -webkit-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
70
  }
71
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-suggetion .wbcr-factory-purchase-premium:focus {
72
  outline: none;
73
  border: 0;
74
  }
75
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion {
76
  background: #fff;
77
  color: #353535;
78
  font-weight: 600;
79
  border: 2px dashed #8bc34a;
80
  }
81
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion h3 {
82
  margin: 0 0 20px;
83
  padding: 10px 0;
84
  text-align: center;
89
  vertical-align: middle;
90
  text-transform: uppercase;
91
  }
92
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion ul {
93
  position: relative;
94
  margin-bottom: 20px;
95
  }
96
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion ul li {
97
  font-size: 15px;
98
  padding: 7px;
99
  padding-left: 20px;
100
  }
101
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion ul li:before {
102
  content: " ";
103
  display: inline-block;
104
  width: 0.4em;
112
  -o-transform: rotate(45deg);
113
  transform: rotate(45deg);
114
  }
115
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion .wbcr-factory-purchase-premium {
116
  display: block;
117
  cursor: pointer;
118
  line-height: 16px;
131
  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
132
  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
133
  }
134
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion .wbcr-factory-purchase-premium:active {
135
  box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
136
  -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
137
  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
138
  }
139
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion .wbcr-factory-purchase-premium:focus {
140
  outline: none;
141
  border: 0;
142
  }
143
  @media screen and (max-width: 1550px) {
144
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-clearfy-221-multisite-pro-suggetion {
145
  padding: 10px 80px;
146
  }
147
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion {
148
  padding: 10px;
149
  }
150
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion h3 {
151
  margin: 0 0 20px;
152
  padding: 10px 0;
153
  font-size: 13px;
154
  font-weight: 600;
155
  }
156
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion ul {
157
  margin-bottom: 20px;
158
  }
159
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion ul li {
160
  font-size: 13px;
161
  padding: 2px;
162
  padding-left: 10px;
163
  }
164
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion ul li:before {
165
  width: 0.4em;
166
  height: 0.7em;
167
  border-width: 0 0.2em 0.2em 0;
168
  left: 0;
169
  margin-right: 10px;
170
  }
171
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-221-pro-suggettion .wbcr-factory-purchase-premium {
172
  font-weight: 700;
173
  line-height: 16px;
174
  font-size: 12px;
libs/factory/clearfy/assets/css/clearfy-base.css.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["clearfy-base.less"],"names":[],"mappings":";;;;;;;AAoCA,KAEE,iDACE;EACE,kBAAA;;AAJN,KAEE,iDACE,8CAGE;EACE,gBAAA;;AAPR,KAEE,iDACE,8CAOE;EACE,0BAAA;EACA,gBAAA;EACA,aAAA;;AAbR,KAEE,iDACE,8CAaE;EACE,qBAAA;EA5CN,eAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;EACA,uBAAA;EACA,0BAAA;EACA,cAAA;EACA,mBAAA;EACA,sCAAA;EACA,2CAAA;EACA,8CAAA;;AACA,KAaA,iDACE,8CAaE,+BA3BH;EACC,4CAAA;EACA,iDAAA;EACA,oDAAA;;AAEF,KAQA,iDACE,8CAaE,+BAtBH;EACC,aAAA;EACA,SAAA;;AAIJ,KAEE,iDACE,8CAiBE;EACE,qBAAA;EAhDN,eAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;EACA,uBAAA;EACA,0BAAA;EACA,cAAA;EACA,mBAAA;EACA,yCAAA;EACA,8CAAA;EACA,iDAAA;;AACA,KAaA,iDACE,8CAiBE,+BA/BH;EACC,+CAAA;EACA,oDAAA;EACA,uDAAA;;AAEF,KAQA,iDACE,8CAiBE,+BA1BH;EACC,aAAA;EACA,SAAA;;AAIJ,KAEE,iDAwBE,oCACE;EACE,gBAAA;EACA,cAAA;EACA,gBAAA;EACA,0BAAA;;AA/BR,KAEE,iDAwBE,oCACE,yCAME;EACE,gBAAA;EACA,eAAA;EACA,kBAAA;EACA,gCAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;EACA,sBAAA;EACA,yBAAA;;AA1CV,KAEE,iDAwBE,oCACE,yCAkBE;EAEE,kBAAA;EACA,mBAAA;;AAhDV,KAEE,iDAwBE,oCACE,yCAkBE,GAKE;EACE,eAAA;EACA,YAAA;EACA,kBAAA;;AAIA,KAvDV,iDAwBE,oCACE,yCAkBE,GAKE,GAOG;EACC,SAAS,GAAT;EACA,qBAAA;EACA,YAAA;EACA,aAAA;EACA,qBAAA;EACA,6BAAA;EACA,OAAA;EACA,kBAAA;EACA,mBAAmB,aAAnB;EACA,gBAAgB,aAAhB;EACA,cAAc,aAAd;EACA,WAAW,aAAX;;AArEd,KAEE,iDAwBE,oCACE,yCAgDE;EACE,cAAA;EAvGR,eAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;EACA,uBAAA;EACA,0BAAA;EACA,cAAA;EACA,mBAAA;EACA,sCAAA;EACA,2CAAA;EACA,8CAAA;;AACA,KAaA,iDAwBE,oCACE,yCAgDE,+BAtFL;EACC,4CAAA;EACA,iDAAA;EACA,oDAAA;;AAEF,KAQA,iDAwBE,oCACE,yCAgDE,+BAjFL;EACC,aAAA;EACA,SAAA;;AAwFJ,mBAAsC;EACpC,KACE,iDACE;IACE,kBAAA;;EAHN,KACE,iDAKE,oCACE;IACE,aAAA;;EARR,KACE,iDAKE,oCACE,yCAGE;IACE,gBAAA;IACA,eAAA;IACA,eAAA;IACA,gBAAA;;EAdV,KACE,iDAKE,oCACE,yCAUE;IACE,mBAAA;;EAlBV,KACE,iDAKE,oCACE,yCAUE,GAGE;IACE,eAAA;IACA,YAAA;IACA,kBAAA;;EAEA,KAxBV,iDAKE,oCACE,yCAUE,GAGE,GAKG;IACC,YAAA;IACA,aAAA;IACA,6BAAA;IACA,OAAA;IACA,kBAAA;;EA9Bd,KACE,iDAKE,oCACE,yCA4BE;IACE,gBAAA;IACA,iBAAA;IACA,eAAA;IACA,iBAAA;IACA,kBAAA;IACA,uBAAA;IACA,0BAAA","file":"clearfy-base.css"}
libs/factory/clearfy/assets/css/libs/autocomplete.css ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Styles for plugin options search form
3
+
4
+ * @author Alex Kovlaev <alex.kovalevv@gmail.com>, https://github.com/alexkovalevv
5
+ *
6
+ * @since 2.2.0
7
+ */
8
+ #wbcr-factory-clearfy-221__search_options_form #wbcr-factory-clearfy-221__autocomplete {
9
+ width: 100%;
10
+ box-sizing: border-box;
11
+ border-color: #d6d4d4;
12
+ }
13
+ #wbcr-factory-clearfy-221__search_options_form.wbcr-factory-clearfy-221__autocomplete-wrap {
14
+ padding: 10px;
15
+ }
16
+ #wbcr-factory-clearfy-221__search_options_form .wbcr-factory-clearfy-221__autocomplete-label {
17
+ display: block !important;
18
+ }
19
+ .wbcr-factory-clearfy-221__autocomplete-suggestions {
20
+ border: 1px solid #999;
21
+ background: #FFF;
22
+ overflow: auto;
23
+ }
24
+ .wbcr-factory-clearfy-221__autocomplete-suggestion {
25
+ padding: 2px 5px;
26
+ white-space: nowrap;
27
+ overflow: hidden;
28
+ cursor: pointer;
29
+ }
30
+ .wbcr-factory-clearfy-221__autocomplete-selected {
31
+ background: #F0F0F0;
32
+ }
33
+ .wbcr-factory-clearfy-221__autocomplete-suggestions strong {
34
+ font-weight: normal;
35
+ color: #3399FF;
36
+ }
37
+ .wbcr-factory-clearfy-221__autocomplete-group {
38
+ padding: 2px 5px;
39
+ }
40
+ .wbcr-factory-clearfy-221__autocomplete-group strong {
41
+ display: block;
42
+ border-bottom: 1px solid #000;
43
+ }
44
+ /*# sourceMappingURL=autocomplete.css.map */
libs/factory/clearfy/assets/css/libs/autocomplete.css.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["autocomplete.less"],"names":[],"mappings":";;;;;;;AAUA,8CAVC;EAYG,WAAA;EACA,sBAAA;EACA,qBAAA;;AAdH,8CAAC;EAkBE,aAAA;;AARJ,8CAVC;EAsBG,yBAAA;;AAtBH;EA2BC,sBAAA;EACA,gBAAA;EACA,cAAA;;AA7BD;EAiCC,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,eAAA;;AApCD;EAwCC,mBAAA;;AAxCD,mDAGM;EAyCL,mBAAA;EACA,cAAA;;AA7CD;EAiDC,gBAAA;;AAjDD,6CAGA;EAkDC,cAAA;EACA,6BAAA","file":"autocomplete.css"}
libs/factory/clearfy/assets/css/libs/autocomplete.less ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Styles for plugin options search form
3
+
4
+ * @author Alex Kovlaev <alex.kovalevv@gmail.com>, https://github.com/alexkovalevv
5
+ *
6
+ * @since 2.2.0
7
+ */
8
+
9
+ @prefix: ~'wbcr-factory-clearfy-000__';
10
+
11
+ #wbcr-factory-clearfy-000__search_options_form {
12
+ #@{prefix}autocomplete {
13
+ width: 100%;
14
+ box-sizing: border-box;
15
+ border-color: #d6d4d4;
16
+ }
17
+
18
+ &.@{prefix}autocomplete-wrap {
19
+ padding: 10px;
20
+ }
21
+
22
+ .@{prefix}autocomplete-label {
23
+ display: block !important;
24
+ }
25
+ }
26
+
27
+ .@{prefix}autocomplete-suggestions {
28
+ border: 1px solid #999;
29
+ background: #FFF;
30
+ overflow: auto;
31
+ }
32
+
33
+ .@{prefix}autocomplete-suggestion {
34
+ padding: 2px 5px;
35
+ white-space: nowrap;
36
+ overflow: hidden;
37
+ cursor: pointer;
38
+ }
39
+
40
+ .@{prefix}autocomplete-selected {
41
+ background: #F0F0F0;
42
+ }
43
+
44
+ .@{prefix}autocomplete-suggestions strong {
45
+ font-weight: normal;
46
+ color: #3399FF;
47
+ }
48
+
49
+ .@{prefix}autocomplete-group {
50
+ padding: 2px 5px;
51
+ }
52
+
53
+ .@{prefix}autocomplete-group strong {
54
+ display: block;
55
+ border-bottom: 1px solid #000;
56
+ }
57
+
libs/factory/clearfy/assets/js/globals.js CHANGED
@@ -2,8 +2,8 @@
2
  * Глобальный JS файл, который регистрирует глобальные переменные с общими методами для всех компонентов Clearfy
3
  * и самого Clearfy.
4
  *
5
- * $.wbcr_factory_clearfy_212.app - методы для работы с приложением. Скрыть, показать уведомления.
6
- * $.wbcr_factory_clearfy_212.hooks - это иммитация хуков и фильтров аналогично тем, что используются в Wordpress
7
  *
8
  * Copyright 2018, Webcraftic, http://webcraftic.com
9
  *
@@ -13,11 +13,11 @@
13
  (function($) {
14
  'use strict';
15
 
16
- if( !$.wbcr_factory_clearfy_212 ) {
17
- $.wbcr_factory_clearfy_212 = {};
18
  }
19
 
20
- $.wbcr_factory_clearfy_212.app = $.wbcr_factory_clearfy_212.app || {
21
  /**
22
  * Создает и показывает уведомление внутри интерфейса Clearfy
23
  *
@@ -63,12 +63,12 @@
63
  /**
64
  * Хук выполняет проивольную функцию, после того как уведомление отображено
65
  * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
66
- * Пример регистрации хука $.wbcr_factory_clearfy_212.hooks.add('wbcr/factory_clearfy_212/updated',
67
  * function(noticeId) {});
68
  * @param {string} noticeId - id уведомления
69
  */
70
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/factory_clearfy_212/showed_notice', [noticeId]);
71
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/clearfy/showed_notice', [noticeId]);
72
  });
73
 
74
  return noticeId;
@@ -93,13 +93,13 @@
93
  /**
94
  * Хук выполняет проивольную функцию, после того как уведомление скрыто
95
  * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
96
- * Пример регистрации хука $.wbcr_factory_clearfy_212.hooks.add('wbcr/factory_clearfy_212/updated',
97
  * function(noticeId)
98
  * {});
99
  * @param {string} noticeId - id уведомления
100
  */
101
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/factory_clearfy_212/hidded_notice', [noticeId]);
102
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/clearfy/hidded_notice', [noticeId]);
103
  });
104
  },
105
 
@@ -116,7 +116,7 @@
116
 
117
  };
118
 
119
- $.wbcr_factory_clearfy_212.filters = $.wbcr_factory_clearfy_212.filters || {
120
 
121
  /**
122
  * A set of registered filters.
@@ -183,20 +183,20 @@
183
  }
184
  };
185
 
186
- $.wbcr_factory_clearfy_212.hooks = $.wbcr_factory_clearfy_212.hooks || {
187
 
188
  /**
189
  * Applies filters to a given input value.
190
  */
191
  run: function(filterName, args) {
192
- $.wbcr_factory_clearfy_212.filters.run(filterName, args);
193
  },
194
 
195
  /**
196
  * Registers a new filter.
197
  */
198
  add: function(filterName, callback, priority) {
199
- $.wbcr_factory_clearfy_212.filters.add(filterName, callback, priority);
200
  }
201
  };
202
 
2
  * Глобальный JS файл, который регистрирует глобальные переменные с общими методами для всех компонентов Clearfy
3
  * и самого Clearfy.
4
  *
5
+ * $.wbcr_factory_clearfy_221.app - методы для работы с приложением. Скрыть, показать уведомления.
6
+ * $.wbcr_factory_clearfy_221.hooks - это иммитация хуков и фильтров аналогично тем, что используются в Wordpress
7
  *
8
  * Copyright 2018, Webcraftic, http://webcraftic.com
9
  *
13
  (function($) {
14
  'use strict';
15
 
16
+ if( !$.wbcr_factory_clearfy_221 ) {
17
+ $.wbcr_factory_clearfy_221 = {};
18
  }
19
 
20
+ $.wbcr_factory_clearfy_221.app = $.wbcr_factory_clearfy_221.app || {
21
  /**
22
  * Создает и показывает уведомление внутри интерфейса Clearfy
23
  *
63
  /**
64
  * Хук выполняет проивольную функцию, после того как уведомление отображено
65
  * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
66
+ * Пример регистрации хука $.wbcr_factory_clearfy_221.hooks.add('wbcr/factory_clearfy_221/updated',
67
  * function(noticeId) {});
68
  * @param {string} noticeId - id уведомления
69
  */
70
+ $.wbcr_factory_clearfy_221.hooks.run('wbcr/factory_clearfy_221/showed_notice', [noticeId]);
71
+ $.wbcr_factory_clearfy_221.hooks.run('wbcr/clearfy/showed_notice', [noticeId]);
72
  });
73
 
74
  return noticeId;
93
  /**
94
  * Хук выполняет проивольную функцию, после того как уведомление скрыто
95
  * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
96
+ * Пример регистрации хука $.wbcr_factory_clearfy_221.hooks.add('wbcr/factory_clearfy_221/updated',
97
  * function(noticeId)
98
  * {});
99
  * @param {string} noticeId - id уведомления
100
  */
101
+ $.wbcr_factory_clearfy_221.hooks.run('wbcr/factory_clearfy_221/hidded_notice', [noticeId]);
102
+ $.wbcr_factory_clearfy_221.hooks.run('wbcr/clearfy/hidded_notice', [noticeId]);
103
  });
104
  },
105
 
116
 
117
  };
118
 
119
+ $.wbcr_factory_clearfy_221.filters = $.wbcr_factory_clearfy_221.filters || {
120
 
121
  /**
122
  * A set of registered filters.
183
  }
184
  };
185
 
186
+ $.wbcr_factory_clearfy_221.hooks = $.wbcr_factory_clearfy_221.hooks || {
187
 
188
  /**
189
  * Applies filters to a given input value.
190
  */
191
  run: function(filterName, args) {
192
+ $.wbcr_factory_clearfy_221.filters.run(filterName, args);
193
  },
194
 
195
  /**
196
  * Registers a new filter.
197
  */
198
  add: function(filterName, callback, priority) {
199
+ $.wbcr_factory_clearfy_221.filters.add(filterName, callback, priority);
200
  }
201
  };
202
 
libs/factory/clearfy/assets/js/libs/jquery.autocomplete.min.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Ajax Autocomplete for jQuery, version 1.4.11
3
+ * (c) 2017 Tomas Kirda
4
+ *
5
+ * Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license.
6
+ * For details, see the web site: https://github.com/devbridge/jQuery-Autocomplete
7
+ */
8
+ !function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports&&"function"==typeof require?require("jquery"):jQuery)}(function(a){"use strict";function b(c,d){var e=this;e.element=c,e.el=a(c),e.suggestions=[],e.badQueries=[],e.selectedIndex=-1,e.currentValue=e.element.value,e.timeoutId=null,e.cachedResponse={},e.onChangeTimeout=null,e.onChange=null,e.isLocal=!1,e.suggestionsContainer=null,e.noSuggestionsContainer=null,e.options=a.extend(!0,{},b.defaults,d),e.classes={selected:"wbcr-factory-clearfy-221__autocomplete-selected",suggestion:"wbcr-factory-clearfy-221__autocomplete-suggestion"},e.hint=null,e.hintValue="",e.selection=null,e.initialize(),e.setOptions(d)}function c(a,b,c){return a.value.toLowerCase().indexOf(c)!==-1}function d(b){return"string"==typeof b?a.parseJSON(b):b}function e(a,b){if(!b)return a.value;var c="("+g.escapeRegExChars(b)+")";return a.value.replace(new RegExp(c,"gi"),"<strong>$1</strong>").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/&lt;(\/?strong)&gt;/g,"<$1>")}function f(a,b){return'<div class="wbcr-factory-clearfy-221__autocomplete-group">'+b+"</div>"}var g=function(){return{escapeRegExChars:function(a){return a.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&")},createNode:function(a){var b=document.createElement("div");return b.className=a,b.style.position="absolute",b.style.display="none",b}}}(),h={ESC:27,TAB:9,RETURN:13,LEFT:37,UP:38,RIGHT:39,DOWN:40},i=a.noop;b.utils=g,a.Autocomplete=b,b.defaults={ajaxSettings:{},autoSelectFirst:!1,appendTo:"body",serviceUrl:null,lookup:null,onSelect:null,width:"auto",minChars:1,maxHeight:300,deferRequestBy:0,params:{},formatResult:e,formatGroup:f,delimiter:null,zIndex:9999,type:"GET",noCache:!1,onSearchStart:i,onSearchComplete:i,onSearchError:i,preserveInput:!1,containerClass:"wbcr-factory-clearfy-221__autocomplete-suggestions",tabDisabled:!1,dataType:"text",currentRequest:null,triggerSelectOnValidInput:!0,preventBadQueries:!0,lookupFilter:c,paramName:"query",transformResult:d,showNoSuggestionNotice:!1,noSuggestionNotice:"No results",orientation:"bottom",forceFixPosition:!1},b.prototype={initialize:function(){var c,d=this,e="."+d.classes.suggestion,f=d.classes.selected,g=d.options;d.element.setAttribute("autocomplete","off"),d.noSuggestionsContainer=a('<div class="autocomplete-no-suggestion"></div>').html(this.options.noSuggestionNotice).get(0),d.suggestionsContainer=b.utils.createNode(g.containerClass),c=a(d.suggestionsContainer),c.appendTo(g.appendTo||"body"),"auto"!==g.width&&c.css("width",g.width),c.on("mouseover.autocomplete",e,function(){d.activate(a(this).data("index"))}),c.on("mouseout.autocomplete",function(){d.selectedIndex=-1,c.children("."+f).removeClass(f)}),c.on("click.autocomplete",e,function(){d.select(a(this).data("index"))}),c.on("click.autocomplete",function(){clearTimeout(d.blurTimeoutId)}),d.fixPositionCapture=function(){d.visible&&d.fixPosition()},a(window).on("resize.autocomplete",d.fixPositionCapture),d.el.on("keydown.autocomplete",function(a){d.onKeyPress(a)}),d.el.on("keyup.autocomplete",function(a){d.onKeyUp(a)}),d.el.on("blur.autocomplete",function(){d.onBlur()}),d.el.on("focus.autocomplete",function(){d.onFocus()}),d.el.on("change.autocomplete",function(a){d.onKeyUp(a)}),d.el.on("input.autocomplete",function(a){d.onKeyUp(a)})},onFocus:function(){var a=this;a.disabled||(a.fixPosition(),a.el.val().length>=a.options.minChars&&a.onValueChange())},onBlur:function(){var b=this,c=b.options,d=b.el.val(),e=b.getQuery(d);b.blurTimeoutId=setTimeout(function(){b.hide(),b.selection&&b.currentValue!==e&&(c.onInvalidateSelection||a.noop).call(b.element)},200)},abortAjax:function(){var a=this;a.currentRequest&&(a.currentRequest.abort(),a.currentRequest=null)},setOptions:function(b){var c=this,d=a.extend({},c.options,b);c.isLocal=Array.isArray(d.lookup),c.isLocal&&(d.lookup=c.verifySuggestionsFormat(d.lookup)),d.orientation=c.validateOrientation(d.orientation,"bottom"),a(c.suggestionsContainer).css({"max-height":d.maxHeight+"px",width:d.width+"px","z-index":d.zIndex}),this.options=d},clearCache:function(){this.cachedResponse={},this.badQueries=[]},clear:function(){this.clearCache(),this.currentValue="",this.suggestions=[]},disable:function(){var a=this;a.disabled=!0,clearTimeout(a.onChangeTimeout),a.abortAjax()},enable:function(){this.disabled=!1},fixPosition:function(){var b=this,c=a(b.suggestionsContainer),d=c.parent().get(0);if(d===document.body||b.options.forceFixPosition){var e=b.options.orientation,f=c.outerHeight(),g=b.el.outerHeight(),h=b.el.offset(),i={top:h.top,left:h.left};if("auto"===e){var j=a(window).height(),k=a(window).scrollTop(),l=-k+h.top-f,m=k+j-(h.top+g+f);e=Math.max(l,m)===l?"top":"bottom"}if("top"===e?i.top+=-f:i.top+=g,d!==document.body){var n,o=c.css("opacity");b.visible||c.css("opacity",0).show(),n=c.offsetParent().offset(),i.top-=n.top,i.top+=d.scrollTop,i.left-=n.left,b.visible||c.css("opacity",o).hide()}"auto"===b.options.width&&(i.width=b.el.outerWidth()+"px"),c.css(i)}},isCursorAtEnd:function(){var a,b=this,c=b.el.val().length,d=b.element.selectionStart;return"number"==typeof d?d===c:!document.selection||(a=document.selection.createRange(),a.moveStart("character",-c),c===a.text.length)},onKeyPress:function(a){var b=this;if(!b.disabled&&!b.visible&&a.which===h.DOWN&&b.currentValue)return void b.suggest();if(!b.disabled&&b.visible){switch(a.which){case h.ESC:b.el.val(b.currentValue),b.hide();break;case h.RIGHT:if(b.hint&&b.options.onHint&&b.isCursorAtEnd()){b.selectHint();break}return;case h.TAB:if(b.hint&&b.options.onHint)return void b.selectHint();if(b.selectedIndex===-1)return void b.hide();if(b.select(b.selectedIndex),b.options.tabDisabled===!1)return;break;case h.RETURN:if(b.selectedIndex===-1)return void b.hide();b.select(b.selectedIndex);break;case h.UP:b.moveUp();break;case h.DOWN:b.moveDown();break;default:return}a.stopImmediatePropagation(),a.preventDefault()}},onKeyUp:function(a){var b=this;if(!b.disabled){switch(a.which){case h.UP:case h.DOWN:return}clearTimeout(b.onChangeTimeout),b.currentValue!==b.el.val()&&(b.findBestHint(),b.options.deferRequestBy>0?b.onChangeTimeout=setTimeout(function(){b.onValueChange()},b.options.deferRequestBy):b.onValueChange())}},onValueChange:function(){if(this.ignoreValueChange)return void(this.ignoreValueChange=!1);var b=this,c=b.options,d=b.el.val(),e=b.getQuery(d);return b.selection&&b.currentValue!==e&&(b.selection=null,(c.onInvalidateSelection||a.noop).call(b.element)),clearTimeout(b.onChangeTimeout),b.currentValue=d,b.selectedIndex=-1,c.triggerSelectOnValidInput&&b.isExactMatch(e)?void b.select(0):void(e.length<c.minChars?b.hide():b.getSuggestions(e))},isExactMatch:function(a){var b=this.suggestions;return 1===b.length&&b[0].value.toLowerCase()===a.toLowerCase()},getQuery:function(b){var c,d=this.options.delimiter;return d?(c=b.split(d),a.trim(c[c.length-1])):b},getSuggestionsLocal:function(b){var c,d=this,e=d.options,f=b.toLowerCase(),g=e.lookupFilter,h=parseInt(e.lookupLimit,10);return c={suggestions:a.grep(e.lookup,function(a){return g(a,b,f)})},h&&c.suggestions.length>h&&(c.suggestions=c.suggestions.slice(0,h)),c},getSuggestions:function(b){var c,d,e,f,g=this,h=g.options,i=h.serviceUrl;if(h.params[h.paramName]=b,h.onSearchStart.call(g.element,h.params)!==!1){if(d=h.ignoreParams?null:h.params,a.isFunction(h.lookup))return void h.lookup(b,function(a){g.suggestions=a.suggestions,g.suggest(),h.onSearchComplete.call(g.element,b,a.suggestions)});g.isLocal?c=g.getSuggestionsLocal(b):(a.isFunction(i)&&(i=i.call(g.element,b)),e=i+"?"+a.param(d||{}),c=g.cachedResponse[e]),c&&Array.isArray(c.suggestions)?(g.suggestions=c.suggestions,g.suggest(),h.onSearchComplete.call(g.element,b,c.suggestions)):g.isBadQuery(b)?h.onSearchComplete.call(g.element,b,[]):(g.abortAjax(),f={url:i,data:d,type:h.type,dataType:h.dataType},a.extend(f,h.ajaxSettings),g.currentRequest=a.ajax(f).done(function(a){var c;g.currentRequest=null,c=h.transformResult(a,b),g.processResponse(c,b,e),h.onSearchComplete.call(g.element,b,c.suggestions)}).fail(function(a,c,d){h.onSearchError.call(g.element,b,a,c,d)}))}},isBadQuery:function(a){if(!this.options.preventBadQueries)return!1;for(var b=this.badQueries,c=b.length;c--;)if(0===a.indexOf(b[c]))return!0;return!1},hide:function(){var b=this,c=a(b.suggestionsContainer);a.isFunction(b.options.onHide)&&b.visible&&b.options.onHide.call(b.element,c),b.visible=!1,b.selectedIndex=-1,clearTimeout(b.onChangeTimeout),a(b.suggestionsContainer).hide(),b.signalHint(null)},suggest:function(){if(!this.suggestions.length)return void(this.options.showNoSuggestionNotice?this.noSuggestions():this.hide());var b,c=this,d=c.options,e=d.groupBy,f=d.formatResult,g=c.getQuery(c.currentValue),h=c.classes.suggestion,i=c.classes.selected,j=a(c.suggestionsContainer),k=a(c.noSuggestionsContainer),l=d.beforeRender,m="",n=function(a,c){var f=a.data[e];return b===f?"":(b=f,d.formatGroup(a,b))};return d.triggerSelectOnValidInput&&c.isExactMatch(g)?void c.select(0):(a.each(c.suggestions,function(a,b){e&&(m+=n(b,g,a)),m+='<div class="'+h+'" data-index="'+a+'">'+f(b,g,a)+"</div>"}),this.adjustContainerWidth(),k.detach(),j.html(m),a.isFunction(l)&&l.call(c.element,j,c.suggestions),c.fixPosition(),j.show(),d.autoSelectFirst&&(c.selectedIndex=0,j.scrollTop(0),j.children("."+h).first().addClass(i)),c.visible=!0,void c.findBestHint())},noSuggestions:function(){var b=this,c=b.options.beforeRender,d=a(b.suggestionsContainer),e=a(b.noSuggestionsContainer);this.adjustContainerWidth(),e.detach(),d.empty(),d.append(e),a.isFunction(c)&&c.call(b.element,d,b.suggestions),b.fixPosition(),d.show(),b.visible=!0},adjustContainerWidth:function(){var b,c=this,d=c.options,e=a(c.suggestionsContainer);"auto"===d.width?(b=c.el.outerWidth(),e.css("width",b>0?b:300)):"flex"===d.width&&e.css("width","")},findBestHint:function(){var b=this,c=b.el.val().toLowerCase(),d=null;c&&(a.each(b.suggestions,function(a,b){var e=0===b.value.toLowerCase().indexOf(c);return e&&(d=b),!e}),b.signalHint(d))},signalHint:function(b){var c="",d=this;b&&(c=d.currentValue+b.value.substr(d.currentValue.length)),d.hintValue!==c&&(d.hintValue=c,d.hint=b,(this.options.onHint||a.noop)(c))},verifySuggestionsFormat:function(b){return b.length&&"string"==typeof b[0]?a.map(b,function(a){return{value:a,data:null}}):b},validateOrientation:function(b,c){return b=a.trim(b||"").toLowerCase(),a.inArray(b,["auto","bottom","top"])===-1&&(b=c),b},processResponse:function(a,b,c){var d=this,e=d.options;a.suggestions=d.verifySuggestionsFormat(a.suggestions),e.noCache||(d.cachedResponse[c]=a,e.preventBadQueries&&!a.suggestions.length&&d.badQueries.push(b)),b===d.getQuery(d.currentValue)&&(d.suggestions=a.suggestions,d.suggest())},activate:function(b){var c,d=this,e=d.classes.selected,f=a(d.suggestionsContainer),g=f.find("."+d.classes.suggestion);return f.find("."+e).removeClass(e),d.selectedIndex=b,d.selectedIndex!==-1&&g.length>d.selectedIndex?(c=g.get(d.selectedIndex),a(c).addClass(e),c):null},selectHint:function(){var b=this,c=a.inArray(b.hint,b.suggestions);b.select(c)},select:function(a){var b=this;b.hide(),b.onSelect(a)},moveUp:function(){var b=this;if(b.selectedIndex!==-1)return 0===b.selectedIndex?(a(b.suggestionsContainer).children("."+b.classes.suggestion).first().removeClass(b.classes.selected),b.selectedIndex=-1,b.ignoreValueChange=!1,b.el.val(b.currentValue),void b.findBestHint()):void b.adjustScroll(b.selectedIndex-1)},moveDown:function(){var a=this;a.selectedIndex!==a.suggestions.length-1&&a.adjustScroll(a.selectedIndex+1)},adjustScroll:function(b){var c=this,d=c.activate(b);if(d){var e,f,g,h=a(d).outerHeight();e=d.offsetTop,f=a(c.suggestionsContainer).scrollTop(),g=f+c.options.maxHeight-h,e<f?a(c.suggestionsContainer).scrollTop(e):e>g&&a(c.suggestionsContainer).scrollTop(e-c.options.maxHeight+h),c.options.preserveInput||(c.ignoreValueChange=!0,c.el.val(c.getValue(c.suggestions[b].value))),c.signalHint(null)}},onSelect:function(b){var c=this,d=c.options.onSelect,e=c.suggestions[b];c.currentValue=c.getValue(e.value),c.currentValue===c.el.val()||c.options.preserveInput||c.el.val(c.currentValue),c.signalHint(null),c.suggestions=[],c.selection=e,a.isFunction(d)&&d.call(c.element,e)},getValue:function(a){var b,c,d=this,e=d.options.delimiter;return e?(b=d.currentValue,c=b.split(e),1===c.length?a:b.substr(0,b.length-c[c.length-1].length)+a):a},dispose:function(){var b=this;b.el.off(".autocomplete").removeData("autocomplete"),a(window).off("resize.autocomplete",b.fixPositionCapture),a(b.suggestionsContainer).remove()}},a.fn.devbridgeAutocomplete=function(c,d){var e="autocomplete";return arguments.length?this.each(function(){var f=a(this),g=f.data(e);"string"==typeof c?g&&"function"==typeof g[c]&&g[c](d):(g&&g.dispose&&g.dispose(),g=new b(this,c),f.data(e,g))}):this.first().data(e)},a.fn.wfactory_clearfy_autocomplete||(a.fn.wfactory_clearfy_autocomplete=a.fn.devbridgeAutocomplete)});
libs/factory/clearfy/assets/js/license-manager.js CHANGED
@@ -3,44 +3,40 @@
3
  * Его основная роль отправка ajax запросов на проверку, активацию, деактивацию лицензии
4
  * и вывод уведомлений об ошибка или успешно выполнении проверок.
5
  *
6
- * @author Webcraftic <wordpress.webraftic@gmail.com>
7
  * @copyright (c) 05.10.2018, Webcraftic
8
  * @version 1.1
9
  * @since 1.4.0
10
  */
11
-
12
-
13
  jQuery(function($) {
14
 
15
  var allNotices = [];
16
 
17
  $(document).on('click', '.wcl-control-btn', function() {
18
-
19
- // Скрываем все открытые этим событием уведомления
20
- // Глобальные уведомления не трогаем
 
 
21
 
22
  for( i = 0; i < allNotices.length; i++ ) {
23
- $.wbcr_factory_clearfy_212.app.hideNotice(allNotices[i]);
24
  }
25
 
26
  $('.wcl-control-btn').hide();
27
 
28
- var wrapper = $('#wcl-license-wrapper'),
29
- loader = wrapper.data('loader'),
30
- pluginClass = wrapper.data('plugin');
31
-
32
  $(this).after('<img class="wcl-loader" src="' + loader + '">');
33
 
34
  var data = {
35
- action: 'wbcr-clearfy-activate-license',
36
- _wpnonce: $('#_wpnonce').val(),
37
- license_action: $(this).data('action'),
 
38
  licensekey: ''
39
  };
40
 
41
  if( $(this).data('action').trim() === 'activate' ) {
42
  data.licensekey = $('#license-key').val().trim();
43
- data.plugin_class = pluginClass;
44
  }
45
 
46
  $.ajax(ajaxurl, {
@@ -57,7 +53,7 @@ jQuery(function($) {
57
 
58
  if( response.data ) {
59
  console.log(response.data.error_message);
60
- noticeId = $.wbcr_factory_clearfy_212.app.showNotice('Error: [' + response.data.error_message + ']', 'danger');
61
  allNotices.push(noticeId);
62
  } else {
63
  console.log(response);
@@ -67,7 +63,7 @@ jQuery(function($) {
67
  }
68
 
69
  if( response.data && response.data.message ) {
70
- noticeId = $.wbcr_factory_clearfy_212.app.showNotice(response.data.message, 'success');
71
  allNotices.push(noticeId);
72
 
73
  // todo: доработать генерацию формы, вместо перезагрузки страницы
@@ -84,7 +80,7 @@ jQuery(function($) {
84
  console.log(xhr.responseText);
85
  console.log(thrownError);
86
 
87
- var noticeId = $.wbcr_factory_clearfy_212.app.showNotice('Error: [' + thrownError + '] Status: [' + xhr.status + '] Error massage: [' + xhr.responseText + ']', 'danger');
88
 
89
  allNotices.push(noticeId);
90
  }
3
  * Его основная роль отправка ajax запросов на проверку, активацию, деактивацию лицензии
4
  * и вывод уведомлений об ошибка или успешно выполнении проверок.
5
  *
6
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
7
  * @copyright (c) 05.10.2018, Webcraftic
8
  * @version 1.1
9
  * @since 1.4.0
10
  */
 
 
11
  jQuery(function($) {
12
 
13
  var allNotices = [];
14
 
15
  $(document).on('click', '.wcl-control-btn', function() {
16
+ var wrapper = $('#wcl-license-wrapper'),
17
+ loader = wrapper.data('loader'),
18
+ pluginName = wrapper.data('plugin-name'),
19
+ wpnonce = wrapper.data('nonce'),
20
+ licenseAction = $(this).data('action');
21
 
22
  for( i = 0; i < allNotices.length; i++ ) {
23
+ $.wbcr_factory_clearfy_221.app.hideNotice(allNotices[i]);
24
  }
25
 
26
  $('.wcl-control-btn').hide();
27
 
 
 
 
 
28
  $(this).after('<img class="wcl-loader" src="' + loader + '">');
29
 
30
  var data = {
31
+ action: 'wbcr-clearfy-activate-license-for-' + pluginName,
32
+ _wpnonce: wpnonce,
33
+ plugin_name: pluginName,
34
+ license_action: licenseAction,
35
  licensekey: ''
36
  };
37
 
38
  if( $(this).data('action').trim() === 'activate' ) {
39
  data.licensekey = $('#license-key').val().trim();
 
40
  }
41
 
42
  $.ajax(ajaxurl, {
53
 
54
  if( response.data ) {
55
  console.log(response.data.error_message);
56
+ noticeId = $.wbcr_factory_clearfy_221.app.showNotice('Error: [' + response.data.error_message + ']', 'danger');
57
  allNotices.push(noticeId);
58
  } else {
59
  console.log(response);
63
  }
64
 
65
  if( response.data && response.data.message ) {
66
+ noticeId = $.wbcr_factory_clearfy_221.app.showNotice(response.data.message, 'success');
67
  allNotices.push(noticeId);
68
 
69
  // todo: доработать генерацию формы, вместо перезагрузки страницы
80
  console.log(xhr.responseText);
81
  console.log(thrownError);
82
 
83
+ var noticeId = $.wbcr_factory_clearfy_221.app.showNotice('Error: [' + thrownError + '] Status: [' + xhr.status + '] Error massage: [' + xhr.responseText + ']', 'danger');
84
 
85
  allNotices.push(noticeId);
86
  }
libs/factory/clearfy/assets/js/search-options.js ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($) {
2
+ 'use strict';
3
+
4
+ $(document).ready(function() {
5
+ if( '' !== window.location.hash && window.location.hash.indexOf('factory-control-') ) {
6
+ let controlClass = window.location.hash.replace('#', ''),
7
+ controlEl = $('.' + controlClass);
8
+
9
+ if( controlEl.closest('.factory-div').length && !controlEl.is(':visible') ) {
10
+ controlEl.closest('.factory-div').fadeIn();
11
+ }
12
+
13
+ $([document.documentElement, document.body]).animate({
14
+ scrollTop: controlEl.offset().top - 150
15
+ }, 500, function() {
16
+
17
+ controlEl.find('.control-label').css({
18
+ color: '#ff5722',
19
+ fontWeight: 'bold'
20
+ });
21
+
22
+ history.pushState("", document.title, window.location.pathname
23
+ + window.location.search);
24
+ });
25
+ }
26
+
27
+ if( undefined === window.wfactory_clearfy_search_options ) {
28
+ throw new Error('Global var {wfactory_clearfy_search_options} is not declared.');
29
+ }
30
+
31
+ $('#wbcr-factory-clearfy-221__autocomplete').wfactory_clearfy_autocomplete({
32
+ lookup: wfactory_clearfy_search_options,
33
+ onSelect: function(suggestion) {
34
+ $('#wbcr-factory-clearfy-221__autocomplete').prop("disabled", true);
35
+ window.location.href = suggestion.data.page_url;
36
+ }
37
+ });
38
+ });
39
+
40
+ })(jQuery);
libs/factory/clearfy/boot.php CHANGED
@@ -10,40 +10,71 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( defined( 'FACTORY_CLEARFY_212_LOADED' ) ) {
18
  return;
19
  }
20
 
21
- define( 'FACTORY_CLEARFY_212_LOADED', true );
22
 
23
- define( 'FACTORY_CLEARFY_212', '2.1.2' );
24
 
25
- define( 'FACTORY_CLEARFY_212_DIR', dirname( __FILE__ ) );
26
- define( 'FACTORY_CLEARFY_212_URL', plugins_url( null, __FILE__ ) );
27
 
28
- load_plugin_textdomain( 'wbcr_factory_clearfy_212', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
 
30
- require( FACTORY_CLEARFY_212_DIR . '/includes/ajax-handlers.php' );
31
- require( FACTORY_CLEARFY_212_DIR . '/includes/class-helpers.php' );
32
- require( FACTORY_CLEARFY_212_DIR . '/includes/class-configurate.php' );
33
 
34
  // module provides function only for the admin area
35
- if ( is_admin() ) {
36
  /**
37
  * Подключаем скрипты для установки компонентов Clearfy
38
  * на все страницы админпанели.
39
  */
40
- add_action( 'admin_enqueue_scripts', function () {
41
- wp_enqueue_script( 'wbcr-factory-clearfy-212-global', FACTORY_CLEARFY_212_URL . '/assets/js/globals.js', [ 'jquery' ], FACTORY_CLEARFY_212 );
42
- } );
43
-
44
- if ( defined( 'FACTORY_PAGES_420_LOADED' ) ) {
45
- require( FACTORY_CLEARFY_212_DIR . '/pages/class-pages.php' );
46
- require( FACTORY_CLEARFY_212_DIR . '/pages/class-page-more-features.php' );
47
- require( FACTORY_CLEARFY_212_DIR . '/pages/class-page-license.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  }
49
  }
10
  */
11
 
12
  // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
 
17
+ if( defined('FACTORY_CLEARFY_221_LOADED') ) {
18
  return;
19
  }
20
 
21
+ define('FACTORY_CLEARFY_221_LOADED', true);
22
 
23
+ define('FACTORY_CLEARFY_221', '2.2.1');
24
 
25
+ define('FACTORY_CLEARFY_221_DIR', dirname(__FILE__));
26
+ define('FACTORY_CLEARFY_221_URL', plugins_url(null, __FILE__));
27
 
28
+ load_plugin_textdomain('wbcr_factory_clearfy_221', false, dirname(plugin_basename(__FILE__)) . '/langs');
29
 
30
+ require(FACTORY_CLEARFY_221_DIR . '/includes/ajax-handlers.php');
31
+ require(FACTORY_CLEARFY_221_DIR . '/includes/class-helpers.php');
32
+ require(FACTORY_CLEARFY_221_DIR . '/includes/class-configurate.php');
33
 
34
  // module provides function only for the admin area
35
+ if( is_admin() ) {
36
  /**
37
  * Подключаем скрипты для установки компонентов Clearfy
38
  * на все страницы админпанели.
39
  */
40
+ add_action('admin_enqueue_scripts', function () {
41
+ wp_enqueue_script('wbcr-factory-clearfy-221-global', FACTORY_CLEARFY_221_URL . '/assets/js/globals.js', ['jquery'], FACTORY_CLEARFY_221);
42
+
43
+ require_once FACTORY_CLEARFY_221_DIR . '/includes/class-search-options.php';
44
+ $all_options = \WBCR\Factory_Clearfy_221\Search_Options::get_all_options();
45
+
46
+ if( empty($all_options) ) {
47
+ return;
48
+ }
49
+
50
+ $allow_print_data = false;
51
+ $formated_options = [];
52
+
53
+ foreach($all_options as $option) {
54
+ if( !$allow_print_data && isset($_GET['page']) && $option['page_id'] === $_GET['page'] ) {
55
+ $allow_print_data = true;
56
+ }
57
+
58
+ $formated_options[] = [
59
+ 'value' => $option['title'],
60
+ 'data' => [
61
+ //'hint' => isset($option['hint']) ? $option['hint'] : '',
62
+ 'page_url' => $option['page_url'],
63
+ 'page_id' => $option['page_id']
64
+ ]
65
+ ];
66
+ }
67
+
68
+ if( !$allow_print_data ) {
69
+ return;
70
+ }
71
+
72
+ wp_localize_script('jquery', 'wfactory_clearfy_search_options', $formated_options);
73
+ });
74
+
75
+ if( defined('FACTORY_PAGES_429_LOADED') ) {
76
+ require(FACTORY_CLEARFY_221_DIR . '/pages/class-pages.php');
77
+ require(FACTORY_CLEARFY_221_DIR . '/pages/class-page-more-features.php');
78
+ require(FACTORY_CLEARFY_221_DIR . '/pages/class-page-license.php');
79
  }
80
  }
libs/factory/clearfy/includes/ajax-handlers.php CHANGED
@@ -17,17 +17,24 @@ if ( ! defined( 'ABSPATH' ) ) {
17
  *
18
  * @since 2.0.7
19
  *
20
- * @param Wbcr_Factory420_Plugin $plugin_instance
21
  *
22
  */
23
- function wbcr_factory_clearfy_212_check_license( $plugin_instance ) {
24
- check_admin_referer( 'license' );
 
 
 
 
 
25
 
26
  $action = $plugin_instance->request->post( 'license_action', false, true );
27
  $license_key = $plugin_instance->request->post( 'licensekey', null );
28
 
 
 
29
  if ( empty( $action ) || ! in_array( $action, [ 'activate', 'deactivate', 'sync', 'unsubscribe' ] ) ) {
30
- wp_send_json_error( [ 'error_message' => __( 'Licensing action not passed or this action is prohibited!', 'wbcr_factory_clearfy_212' ) ] );
31
  die();
32
  }
33
 
@@ -38,30 +45,31 @@ function wbcr_factory_clearfy_212_check_license( $plugin_instance ) {
38
  switch ( $action ) {
39
  case 'activate':
40
  if ( empty( $license_key ) || strlen( $license_key ) > 32 ) {
41
- wp_send_json_error( [ 'error_message' => __( 'License key is empty or license key too long (license key is 32 characters long)', 'wbcr_factory_clearfy_212' ) ] );
42
  } else {
43
  $plugin_instance->premium->activate( $license_key );
44
- $success_message = __( 'Your license has been successfully activated', 'wbcr_factory_clearfy_212' );
45
  }
46
  break;
47
  case 'deactivate':
48
  $plugin_instance->premium->deactivate();
49
- $success_message = __( 'The license is deactivated', 'wbcr_factory_clearfy_212' );
50
  break;
51
  case 'sync':
52
  $plugin_instance->premium->sync();
53
- $success_message = __( 'The license has been updated', 'wbcr_factory_clearfy_212' );
54
  break;
55
  case 'unsubscribe':
56
  $plugin_instance->premium->cancel_paid_subscription();
57
- $success_message = __( 'Subscription success cancelled', 'wbcr_factory_clearfy_212' );
58
  break;
59
  }
60
  } catch( Exception $e ) {
61
 
62
  /**
63
- * Экшен выполняетяс, когда проверка лицензии вернула ошибку
64
  *
 
65
  * @since 2.0.7
66
  *
67
  * @param string $license_key
@@ -69,22 +77,23 @@ function wbcr_factory_clearfy_212_check_license( $plugin_instance ) {
69
  *
70
  * @param string $action
71
  */
72
- do_action( 'wbcr/clearfy/check_license_error', $action, $license_key, $e->getMessage() );
73
 
74
  wp_send_json_error( [ 'error_message' => $e->getMessage() ] );
75
  die();
76
  }
77
 
78
  /**
79
- * Экшен выполняет, когда проверка лицензии успешно завершена
80
  *
 
81
  * @since 2.0.7
82
  *
83
  * @param string $license_key
84
  *
85
  * @param string $action
86
  */
87
- do_action( 'wbcr/clearfy/check_license_success', $action, $license_key );
88
 
89
  wp_send_json_success( [ 'message' => $success_message ] );
90
 
17
  *
18
  * @since 2.0.7
19
  *
20
+ * @param Wbcr_Factory429_Plugin $plugin_instance
21
  *
22
  */
23
+ function wbcr_factory_clearfy_221_check_license( $plugin_instance ) {
24
+
25
+ $plugin_name = $plugin_instance->request->post( 'plugin_name', null, true );
26
+
27
+ if ( ( $plugin_instance->getPluginName() !== $plugin_name ) || ! $plugin_instance->current_user_can() ) {
28
+ wp_die( - 1, 403 );
29
+ }
30
 
31
  $action = $plugin_instance->request->post( 'license_action', false, true );
32
  $license_key = $plugin_instance->request->post( 'licensekey', null );
33
 
34
+ check_admin_referer( "clearfy_activate_license_for_{$plugin_name}" );
35
+
36
  if ( empty( $action ) || ! in_array( $action, [ 'activate', 'deactivate', 'sync', 'unsubscribe' ] ) ) {
37
+ wp_send_json_error( [ 'error_message' => __( 'Licensing action not passed or this action is prohibited!', 'wbcr_factory_clearfy_221' ) ] );
38
  die();
39
  }
40
 
45
  switch ( $action ) {
46
  case 'activate':
47
  if ( empty( $license_key ) || strlen( $license_key ) > 32 ) {
48
+ wp_send_json_error( [ 'error_message' => __( 'License key is empty or license key too long (license key is 32 characters long)', 'wbcr_factory_clearfy_221' ) ] );
49
  } else {
50
  $plugin_instance->premium->activate( $license_key );
51
+ $success_message = __( 'Your license has been successfully activated', 'wbcr_factory_clearfy_221' );
52
  }
53
  break;
54
  case 'deactivate':
55
  $plugin_instance->premium->deactivate();
56
+ $success_message = __( 'The license is deactivated', 'wbcr_factory_clearfy_221' );
57
  break;
58
  case 'sync':
59
  $plugin_instance->premium->sync();
60
+ $success_message = __( 'The license has been updated', 'wbcr_factory_clearfy_221' );
61
  break;
62
  case 'unsubscribe':
63
  $plugin_instance->premium->cancel_paid_subscription();
64
+ $success_message = __( 'Subscription success cancelled', 'wbcr_factory_clearfy_221' );
65
  break;
66
  }
67
  } catch( Exception $e ) {
68
 
69
  /**
70
+ * Экшен выполняется, когда проверка лицензии вернула ошибку
71
  *
72
+ * @since 2.1.2 Переименован в {$plugin_name}/factory/clearfy/check_license_error
73
  * @since 2.0.7
74
  *
75
  * @param string $license_key
77
  *
78
  * @param string $action
79
  */
80
+ do_action( "{$plugin_name}/factory/clearfy/check_license_error", $action, $license_key, $e->getMessage() );
81
 
82
  wp_send_json_error( [ 'error_message' => $e->getMessage() ] );
83
  die();
84
  }
85
 
86
  /**
87
+ * Экшен выполняется, когда проверка лицензии успешно завершена
88
  *
89
+ * @since 2.1.2 Переименован в {$plugin_name}/factory/clearfy/check_license_success
90
  * @since 2.0.7
91
  *
92
  * @param string $license_key
93
  *
94
  * @param string $action
95
  */
96
+ do_action( "{$plugin_name}/factory/clearfy/check_license_success", $action, $license_key );
97
 
98
  wp_send_json_success( [ 'message' => $success_message ] );
99
 
libs/factory/clearfy/includes/class-configurate.php CHANGED
@@ -13,12 +13,12 @@ if ( ! defined( 'ABSPATH' ) ) {
13
  * @copyright (c) 2018, Webcraftic Ltd
14
  *
15
  */
16
- abstract class Wbcr_FactoryClearfy212_Configurate {
17
 
18
  /**
19
- * @param Wbcr_Factory420_Plugin $plugin
20
  */
21
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
22
  $this->plugin = $plugin;
23
  $this->registerActionsAndFilters();
24
  }
13
  * @copyright (c) 2018, Webcraftic Ltd
14
  *
15
  */
16
+ abstract class Wbcr_FactoryClearfy221_Configurate {
17
 
18
  /**
19
+ * @param Wbcr_Factory429_Plugin $plugin
20
  */
21
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
22
  $this->plugin = $plugin;
23
  $this->registerActionsAndFilters();
24
  }
libs/factory/clearfy/includes/class-helpers.php CHANGED
@@ -14,103 +14,7 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  * @copyright (c) 2018, Webcraftic Ltd
15
  *
16
  */
17
- class WbcrFactoryClearfy212_Helpers {
18
-
19
- /**
20
- * Ссылка по умолчанию (анг)
21
- */
22
- const WEBCRAFTIC_SITE_URL = 'https://clearfy.pro';
23
-
24
- /**
25
- * Русская локализация сайта
26
- */
27
- const WEBCRAFTIC_RU_SITE_URL = 'https://ru.clearfy.pro';
28
- /**
29
- * Украинская локализация сайта
30
- */
31
- const WEBCRAFTIC_UA_SITE_URL = 'https://ua.clearfy.pro';
32
- /**
33
- * Испанская
34
- */
35
- const WEBCRAFTIC_ES_SITE_URL = 'https://es.clearfy.pro';
36
- /**
37
- * Французкая
38
- */
39
- const WEBCRAFTIC_DE_SITE_URL = 'https://de.clearfy.pro';
40
-
41
- /**
42
- * @since 2.0.5
43
- *
44
- * @param int $price
45
- *
46
- * @return int
47
- */
48
- public static function getClearfyBusinessPrice( $price = 19 ) {
49
- return (int) apply_filters( 'wbcr/clearfy/business_price', $price );
50
- }
51
-
52
- /**
53
- * @since 2.0.5
54
- *
55
- * @param int $price
56
- *
57
- * @return int
58
- */
59
- public static function getClearfyBusinessRevPrice( $price = 69 ) {
60
- return (int) apply_filters( 'wbcr/clearfy/business_rev_price', $price );
61
- }
62
-
63
- /**
64
- * Get a link to the official website of the developer
65
- *
66
- * @return string|null
67
- */
68
- public static function getWebcrafticSiteUrl() {
69
- if ( get_locale() == 'ru_RU' ) {
70
- return self::WEBCRAFTIC_RU_SITE_URL;
71
- }
72
-
73
- return self::WEBCRAFTIC_SITE_URL;
74
- }
75
-
76
- /**
77
- * /**
78
- * Get a link to the official website of the developer
79
- *
80
- * @since 2.0.5
81
- *
82
- * @param string $plugin_name
83
- * @param string $page - page address
84
- * @param string $utm_content - from which page or part of the plugin user moved to the site
85
- * @param string $urm_source
86
- *
87
- * @return string
88
- */
89
- public static function getWebcrafticSitePageUrl( $plugin_name, $page, $utm_content = null, $urm_source = 'wordpress.org' ) {
90
- $args = [ 'utm_source' => $urm_source ];
91
-
92
- if ( ! empty( $plugin_name ) ) {
93
- $args['utm_campaign'] = $plugin_name;
94
- }
95
-
96
- if ( ! empty( $utm_content ) ) {
97
- $args['utm_content'] = $utm_content;
98
- }
99
-
100
- $raw_url = add_query_arg( $args, self::getWebcrafticSiteUrl() . '/' . $page . '/' );
101
- $url = esc_url( $raw_url );
102
-
103
- /**
104
- * @param string $url
105
- * @param string $raw_url
106
- * @param string $plugin_name
107
- * @param string $page - page address
108
- * @param string $utm_content - from which page or part of the plugin user moved to the site
109
- * @param string $urm_source
110
- */
111
-
112
- return apply_filters( 'wbcr/clearfy/webcraftic_site_page_url', $url, $raw_url, $plugin_name, $page, $utm_content, $urm_source );
113
- }
114
 
115
  /**
116
  * Recursive sanitation for an array
14
  * @copyright (c) 2018, Webcraftic Ltd
15
  *
16
  */
17
+ class WbcrFactoryClearfy221_Helpers {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  /**
20
  * Recursive sanitation for an array
libs/factory/clearfy/includes/class-search-options.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WBCR\Factory_Clearfy_221;
4
+
5
+ /**
6
+ * Class Search options
7
+ *
8
+ * Allows you to collect all the options from the plugin pages, is a registry of options.
9
+ *
10
+ * @author Alex Kovlaev <alex.kovalevv@gmail.com>, https://github.com/alexkovalevv
11
+ *
12
+ * @since 2.2.0
13
+ */
14
+ class Search_Options {
15
+
16
+ private static $_all_options;
17
+
18
+ /**
19
+ * Registers page options in the options registry
20
+ *
21
+ * This will allow the user to search all the plugin options.
22
+ *
23
+ * @param array $options
24
+ * @param string $page_url
25
+ * @param string $page_id
26
+ * @since 2.2.0
27
+ *
28
+ */
29
+ public static function register_options($options, $page_url, $page_id)
30
+ {
31
+ if( empty($options) || !is_array($options) ) {
32
+ return;
33
+ }
34
+
35
+ $extracted_options = static::recursive_extraxt_options($options);
36
+
37
+ if( !empty($extracted_options) ) {
38
+ foreach((array)$extracted_options as $option) {
39
+ if( 'div' === $option['type'] || 'html' === $option['type'] || !isset($option['title']) ) {
40
+ continue;
41
+ }
42
+
43
+ $formated_option['title'] = $option['title'];
44
+
45
+ /*if( isset($option['hint']) ) {
46
+ $formated_option['hint'] = $option['hint'];
47
+ }*/
48
+
49
+ $formated_option['page_url'] = $page_url . '#factory-control-' . $option['name'];
50
+ $formated_option['page_id'] = $page_id;
51
+
52
+ static::$_all_options[] = $formated_option;
53
+ }
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Extracted options from a nested array
59
+ * @param array $options
60
+ * @return array
61
+ * @since 2.2.0
62
+ */
63
+ protected static function recursive_extraxt_options($options)
64
+ {
65
+ $extracted_options = [];
66
+
67
+ foreach($options as $option) {
68
+ if( isset($option['items']) ) {
69
+ $extracted_options = array_merge($extracted_options, static::recursive_extraxt_options($option['items']));
70
+ } else {
71
+ $extracted_options[] = $option;
72
+ }
73
+ }
74
+
75
+ return $extracted_options;
76
+ }
77
+
78
+ /**
79
+ * Get all plugin options
80
+ * @return mixed
81
+ * @since 2.2.0
82
+ */
83
+ public static function get_all_options()
84
+ {
85
+ return static::$_all_options;
86
+ }
87
+ }
libs/factory/clearfy/langs/{wbcr_factory_clearfy_212-ru_RU.mo → wbcr_factory_clearfy_221-ru_RU.mo} RENAMED
File without changes
libs/factory/clearfy/langs/{wbcr_factory_clearfy_212-ru_RU.po → wbcr_factory_clearfy_221-ru_RU.po} RENAMED
File without changes
libs/factory/clearfy/pages/class-page-license.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
 
3
  // Exit if accessed directly
4
- if ( ! defined( 'ABSPATH' ) ) {
5
  exit;
6
  }
7
 
@@ -11,33 +11,60 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
12
  * @since 2.0.7
13
  */
14
- class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase {
15
 
16
  /**
17
  * {@inheritdoc}
 
 
 
 
18
  */
19
  public $type = "page";
20
 
21
  /**
22
  * {@inheritdoc}
 
 
 
 
23
  */
24
  public $page_menu_dashicon = 'dashicons-admin-network';
25
 
26
  /**
27
  * {@inheritdoc}
 
 
 
 
28
  */
29
  public $show_right_sidebar_in_options = false;
30
 
31
  /**
32
  * {@inheritdoc}
 
 
 
 
33
  */
34
  public $page_menu_position = 0;
35
 
36
  /**
37
  * {@inheritdoc}
 
 
 
 
38
  */
39
  public $available_for_multisite = true;
40
 
 
 
 
 
 
 
 
41
  /**
42
  * @var string Name of the paid plan.
43
  */
@@ -53,7 +80,7 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
53
 
54
  /**
55
  * @since 2.0.7
56
- * @var \WBCR\Factory_420\Premium\Provider
57
  */
58
  protected $premium;
59
 
@@ -71,7 +98,7 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
71
 
72
  /**
73
  * @since 2.0.7
74
- * @var \WBCR\Factory_420\Premium\Interfaces\License
75
  */
76
  protected $premium_license;
77
 
@@ -80,33 +107,37 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
80
 
81
  /**
82
  * {@inheritdoc}
83
- * @param Wbcr_Factory420_Plugin $plugin
84
  */
85
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
 
86
  $this->plugin = $plugin;
87
 
88
- parent::__construct( $plugin );
89
 
90
- if ( ! $this->id ) {
91
  $this->id = $this->plugin->getPrefix() . 'license';
92
  }
93
- $this->premium = WRIO_Plugin::app()->premium;
94
- $this->is_premium = $this->premium->is_activate();
95
- $this->is_premium_active = $this->premium->is_active();
 
 
96
  $this->premium_has_subscription = $this->premium->has_paid_subscription();
97
- $this->premium_license = $this->premium->get_license();
98
 
99
- add_action( 'wp_ajax_wbcr-clearfy-activate-license', [ $this, 'ajax_handler' ] );
100
  }
101
 
102
  /**
103
  * [MAGIC] Magic method that configures assets for a page.
104
  */
105
- public function assets( $scripts, $styles ) {
106
- parent::assets( $scripts, $styles );
 
107
 
108
- $this->styles->add( FACTORY_CLEARFY_212_URL . '/assets/css/license-manager.css' );
109
- $this->scripts->add( FACTORY_CLEARFY_212_URL . '/assets/js/license-manager.js' );
110
  }
111
 
112
  /**
@@ -114,21 +145,23 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
114
  *
115
  * @since 2.0.7
116
  */
117
- public function ajax_handler() {
118
- wbcr_factory_clearfy_212_check_license( $this->plugin );
 
119
  }
120
 
121
  /**
122
  * {@inheritdoc}
123
  */
124
- public function showPageContent() {
 
125
  ?>
126
- <?php wp_nonce_field( 'license' ); ?>
127
- <div id="wcl-license-wrapper"
128
- data-loader="<?php echo FACTORY_CLEARFY_212_URL . '/assets/img/loader.gif'; ?>"
129
- data-plugin="<?php echo get_class( $this->plugin ) ?>">
130
  <?php $this->show_license_form(); ?>
131
- </div>
132
  <?php
133
  }
134
 
@@ -137,15 +170,17 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
137
  *
138
  * @return string Before content.
139
  */
140
- protected function get_plan_description() {
 
141
  return '';
142
  }
143
 
144
  /**
145
  * @return string
146
  */
147
- protected function get_hidden_license_key() {
148
- if ( ! $this->is_premium ) {
 
149
  return '';
150
  }
151
 
@@ -155,8 +190,9 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
155
  /**
156
  * @return string
157
  */
158
- protected function get_plan() {
159
- if ( ! $this->is_premium ) {
 
160
  return 'free';
161
  }
162
 
@@ -166,24 +202,30 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
166
  /**
167
  * @return mixed
168
  */
169
- protected function get_expiration_days() {
170
- return $this->premium_license->get_expiration_time( 'days' );
 
 
 
 
 
171
  }
172
 
173
  /**
174
  * @return string
175
  */
176
- protected function get_billing_cycle_readable() {
177
- if ( ! $this->is_premium ) {
 
178
  return '';
179
  }
180
 
181
  $billing_cycle = $this->premium->get_billing_cycle();
182
- $billing = 'lifetime';
183
 
184
- if ( 1 == $billing_cycle ) {
185
  $billing = 'month';
186
- } else if ( 12 == $billing_cycle ) {
187
  $billing = 'year';
188
  }
189
 
@@ -199,167 +241,178 @@ class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase
199
  *
200
  * @return string
201
  */
202
- protected function get_license_type() {
203
- if ( ! $this->is_premium ) {
 
204
  return 'free';
205
  }
206
 
207
  $license = $this->premium_license;
208
 
209
- if ( $license->is_lifetime() ) {
210
  return 'gift';
211
- } else if ( $license->get_expiration_time( 'days' ) < 1 ) {
212
  return 'trial';
213
  }
214
 
215
  return 'paid';
216
  }
217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  /**
219
  * @param bool|WP_Error $notice
220
  */
221
- public function show_license_form( $notice = false ) {
 
222
  ?>
223
- <div class="factory-bootstrap-421 onp-page-wrap <?= $this->get_license_type() ?>-license-manager-content"
224
- id="license-manager">
225
- <div>
226
- <h3><?php printf( __( 'Activate %s', 'wbcr_factory_clearfy_212' ), $this->plan_name ) ?></h3>
227
  <?php echo $this->get_plan_description() ?>
228
- </div>
229
- <br>
230
- <?php if ( is_wp_error( $notice ) ) : ?>
231
- <div class="license-message <?= $this->get_license_type() ?>-license-message">
232
- <div class="alert <?php echo esc_attr( $notice->get_error_code() ); ?>">
233
- <h4 class="alert-heading"><?php _e( $notice->get_error_message(), 'wbcr_factory_clearfy_212' ) ?></h4>
234
- </div>
235
- </div>
236
  <?php endif; ?>
237
- <div class="onp-container">
238
- <div class="license-details">
239
- <?php if ( $this->get_license_type() == 'free' ): ?>
240
- <a href="<?php echo $this->plugin->get_support()->get_pricing_url( true, 'license_page' ); ?>"
241
- class="purchase-premium" target="_blank" rel="noopener">
242
  <span class="btn btn-gold btn-inner-wrap">
243
- <?php printf( __( 'Upgrade to Premium for $%s', 'wbcr_factory_clearfy_212' ), $this->premium->get_price() ) ?>
244
  </span>
245
- </a>
246
- <p><?php printf( __( 'Your current license for %1$s:', 'wbcr_factory_clearfy_212' ), $this->plugin->getPluginTitle() ) ?></p>
247
  <?php endif; ?>
248
- <div class="license-details-block <?= $this->get_license_type() ?>-details-block">
249
- <?php if ( $this->is_premium ): ?>
250
- <a data-action="deactivate" href="#"
251
- class="btn btn-default btn-small license-delete-button wcl-control-btn">
252
- <?php _e( 'Delete Key', 'wbcr_factory_clearfy_212' ) ?>
253
- </a>
254
- <a data-action="sync" href="#"
255
- class="btn btn-default btn-small license-synchronization-button wcl-control-btn">
256
- <?php _e( 'Synchronization', 'wbcr_factory_clearfy_212' ) ?>
257
- </a>
258
  <?php endif; ?>
259
- <h3>
260
- <?php echo ucfirst( $this->get_plan() ); ?>
261
 
262
- <?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
263
- <span style="font-size: 15px;">
264
- (<?php printf( __( 'Automatic renewal, every %s', '' ), esc_attr( $this->get_billing_cycle_readable() ) ); ?>)
265
  </span>
266
  <?php endif; ?>
267
- </h3>
268
- <?php if ( $this->is_premium ): ?>
269
- <div class="license-key-identity">
270
- <code><?= esc_attr( $this->get_hidden_license_key() ) ?></code>
271
- </div>
272
  <?php endif; ?>
273
- <div class="license-key-description">
274
- <p><?php _e( 'Public License is a GPLv2 compatible license allowing you to change and use this version of the plugin for free. Please keep in mind this license covers only free edition of the plugin. Premium versions are distributed with other type of a license.', 'wbcr_factory_clearfy_212' ) ?>
275
- </p>
276
- <?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
277
- <p class="activate-trial-hint">
278
- <?php _e( 'You use a paid subscription for the plugin updates. In case you don’t want to receive paid updates, please, click <a data-action="unsubscribe" class="wcl-control-btn" href="#">cancel subscription</a>', 'wbcr_factory_clearfy_212' ) ?>
279
- </p>
 
 
 
280
  <?php endif; ?>
281
 
282
- <?php if ( $this->get_license_type() == 'trial' ): ?>
283
- <p class="activate-error-hint">
284
- <?php printf( __( 'Your license has expired, please extend the license to get updates and support.', 'wbcr_factory_clearfy_212' ), '' ) ?>
285
- </p>
286
  <?php endif; ?>
287
- </div>
288
- <table class="license-params" colspacing="0" colpadding="0">
289
- <tr>
290
- <!--<td class="license-param license-param-domain">
291
- <span class="license-value"><?php echo esc_attr( $_SERVER['SERVER_NAME'] ); ?></span>
292
- <span class="license-value-name"><?php _e( 'domain', 'wbcr_factory_clearfy_212' ) ?></span>
293
  </td>-->
294
- <td class="license-param license-param-days">
295
- <span class="license-value"><?= $this->get_plan() ?></span>
296
- <span class="license-value-name"><?php _e( 'plan', 'wbcr_factory_clearfy_212' ) ?></span>
297
- </td>
298
- <?php if ( $this->is_premium ) : ?>
299
- <td class="license-param license-param-sites">
300
  <span class="license-value">
301
- <?php echo esc_attr( $this->premium_license->get_count_active_sites() ); ?>
302
- <?php _e( 'of', 'wbcr_factory_clearfy_212' ) ?>
303
- <?php echo esc_attr( $this->premium_license->get_sites_quota() ); ?></span>
304
- <span class="license-value-name"><?php _e( 'active sites', 'wbcr_factory_clearfy_212' ) ?></span>
305
- </td>
306
  <?php endif; ?>
307
- <td class="license-param license-param-version">
308
- <span class="license-value"><?= $this->plugin->getPluginVersion() ?></span>
309
- <span class="license-value-name"><span>version</span></span>
310
- </td>
311
- <?php if ( $this->is_premium ): ?>
312
- <td class="license-param license-param-days">
313
- <?php if ( $this->get_license_type() == 'trial' ): ?>
314
- <span class="license-value"><?php _e( 'EXPIRED!', 'wbcr_factory_clearfy_212' ) ?></span>
315
- <span class="license-value-name"><?php _e( 'please update the key', 'wbcr_factory_clearfy_212' ) ?></span>
316
  <?php else: ?>
317
- <span class="license-value">
318
  <?php
319
- if ( $this->premium_license->is_lifetime() ) {
320
  echo 'infiniate';
321
  } else {
322
  echo $this->get_expiration_days();
323
  }
324
  ?>
325
- <small> <?php _e( 'day(s)', 'wbcr_factory_clearfy_212' ) ?></small>
326
  </span>
327
- <span class="license-value-name"><?php _e( 'remained', 'wbcr_factory_clearfy_212' ) ?></span>
328
  <?php endif; ?>
329
- </td>
330
  <?php endif; ?>
331
- </tr>
332
- </table>
333
- </div>
334
- </div>
335
- <div class="license-input">
336
- <form action="" method="post">
337
- <?php if ( $this->is_premium ): ?>
338
- <p><?php _e( 'Have a key to activate the premium version? Paste it here:', 'wbcr_factory_clearfy_212' ) ?><p>
339
  <?php else: ?>
340
- <p><?php _e( 'Have a key to activate the plugin? Paste it here:', 'wbcr_factory_clearfy_212' ) ?>
341
- <p>
342
  <?php endif; ?>
343
- <button data-action="activate" class="btn btn-default wcl-control-btn" type="button"
344
- id="license-submit">
345
- <?php _e( 'Submit Key', 'wbcr_factory_clearfy_212' ) ?>
346
- </button>
347
- <div class="license-key-wrap">
348
- <input type="text" id="license-key" name="licensekey" value="" class="form-control"/>
349
- </div>
350
- <?php if ( $this->is_premium ): ?>
351
- <p style="margin-top: 10px;">
352
- <?php printf( __( '<a href="%s" target="_blank" rel="noopener">Lean more</a> about the premium version and get the license key to activate it now!', 'wbcr_factory_clearfy_212' ), $this->plugin->get_support()->get_pricing_url( true, 'license_page' ) ); ?>
353
- </p>
354
- <?php else: ?>
355
- <p style="margin-top: 10px;">
356
- <?php printf( __( 'Can’t find your key? Go to <a href="%s" target="_blank" rel="noopener">this page</a> and login using the e-mail address associated with your purchase.', 'wbcr_factory_clearfy_212' ), $this->plugin->get_support()->get_contacts_url( true, 'license_page' ) ) ?>
357
- </p>
358
- <?php endif; ?>
359
- </form>
360
- </div>
361
- </div>
362
- </div>
363
  <?php
364
  }
365
  }
1
  <?php
2
 
3
  // Exit if accessed directly
4
+ if( !defined('ABSPATH') ) {
5
  exit;
6
  }
7
 
11
  * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
12
  * @since 2.0.7
13
  */
14
+ class Wbcr_FactoryClearfy221_LicensePage extends Wbcr_FactoryClearfy221_PageBase {
15
 
16
  /**
17
  * {@inheritdoc}
18
+ *
19
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
20
+ * @since 2.1.2
21
+ * @var string
22
  */
23
  public $type = "page";
24
 
25
  /**
26
  * {@inheritdoc}
27
+ *
28
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
29
+ * @since 2.1.2
30
+ * @var string
31
  */
32
  public $page_menu_dashicon = 'dashicons-admin-network';
33
 
34
  /**
35
  * {@inheritdoc}
36
+ *
37
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
38
+ * @since 2.1.2
39
+ * @var bool
40
  */
41
  public $show_right_sidebar_in_options = false;
42
 
43
  /**
44
  * {@inheritdoc}
45
+ *
46
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
47
+ * @since 2.1.2
48
+ * @var int
49
  */
50
  public $page_menu_position = 0;
51
 
52
  /**
53
  * {@inheritdoc}
54
+ *
55
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
56
+ * @since 2.1.2
57
+ * @var bool
58
  */
59
  public $available_for_multisite = true;
60
 
61
+ /**
62
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
63
+ * @since 2.1.2
64
+ * @var string
65
+ */
66
+ public $plugin_name;
67
+
68
  /**
69
  * @var string Name of the paid plan.
70
  */
80
 
81
  /**
82
  * @since 2.0.7
83
+ * @var \WBCR\Factory_429\Premium\Provider
84
  */
85
  protected $premium;
86
 
98
 
99
  /**
100
  * @since 2.0.7
101
+ * @var \WBCR\Factory_429\Premium\Interfaces\License
102
  */
103
  protected $premium_license;
104
 
107
 
108
  /**
109
  * {@inheritdoc}
110
+ * @param Wbcr_Factory429_Plugin $plugin
111
  */
112
+ public function __construct(Wbcr_Factory429_Plugin $plugin)
113
+ {
114
  $this->plugin = $plugin;
115
 
116
+ parent::__construct($plugin);
117
 
118
+ if( !$this->id ) {
119
  $this->id = $this->plugin->getPrefix() . 'license';
120
  }
121
+
122
+ $this->plugin_name = $this->plugin->getPluginName();
123
+ $this->premium = $plugin->premium;
124
+ $this->is_premium = $this->premium->is_activate();
125
+ $this->is_premium_active = $this->premium->is_active();
126
  $this->premium_has_subscription = $this->premium->has_paid_subscription();
127
+ $this->premium_license = $this->premium->get_license();
128
 
129
+ add_action("wp_ajax_wbcr-clearfy-activate-license-for-{$this->plugin_name}", [$this, 'ajax_handler']);
130
  }
131
 
132
  /**
133
  * [MAGIC] Magic method that configures assets for a page.
134
  */
135
+ public function assets($scripts, $styles)
136
+ {
137
+ parent::assets($scripts, $styles);
138
 
139
+ $this->styles->add(FACTORY_CLEARFY_221_URL . '/assets/css/license-manager.css');
140
+ $this->scripts->add(FACTORY_CLEARFY_221_URL . '/assets/js/license-manager.js');
141
  }
142
 
143
  /**
145
  *
146
  * @since 2.0.7
147
  */
148
+ public function ajax_handler()
149
+ {
150
+ wbcr_factory_clearfy_221_check_license($this->plugin);
151
  }
152
 
153
  /**
154
  * {@inheritdoc}
155
  */
156
+ public function showPageContent()
157
+ {
158
  ?>
159
+ <div id="wcl-license-wrapper"
160
+ data-loader="<?php echo FACTORY_CLEARFY_221_URL . '/assets/img/loader.gif'; ?>"
161
+ data-plugin-name="<?php echo esc_attr($this->plugin_name); ?>"
162
+ data-nonce="<?php echo wp_create_nonce("clearfy_activate_license_for_{$this->plugin_name}") ?>">
163
  <?php $this->show_license_form(); ?>
164
+ </div>
165
  <?php
166
  }
167
 
170
  *
171
  * @return string Before content.
172
  */
173
+ protected function get_plan_description()
174
+ {
175
  return '';
176
  }
177
 
178
  /**
179
  * @return string
180
  */
181
+ protected function get_hidden_license_key()
182
+ {
183
+ if( !$this->is_premium ) {
184
  return '';
185
  }
186
 
190
  /**
191
  * @return string
192
  */
193
+ protected function get_plan()
194
+ {
195
+ if( !$this->is_premium ) {
196
  return 'free';
197
  }
198
 
202
  /**
203
  * @return mixed
204
  */
205
+ protected function get_expiration_days()
206
+ {
207
+ if( !$this->is_premium ) {
208
+ return '';
209
+ }
210
+
211
+ return $this->premium_license->get_expiration_time('days');
212
  }
213
 
214
  /**
215
  * @return string
216
  */
217
+ protected function get_billing_cycle_readable()
218
+ {
219
+ if( !$this->is_premium ) {
220
  return '';
221
  }
222
 
223
  $billing_cycle = $this->premium->get_billing_cycle();
224
+ $billing = 'lifetime';
225
 
226
+ if( 1 == $billing_cycle ) {
227
  $billing = 'month';
228
+ } else if( 12 == $billing_cycle ) {
229
  $billing = 'year';
230
  }
231
 
241
  *
242
  * @return string
243
  */
244
+ protected function get_license_type()
245
+ {
246
+ if( !$this->is_premium ) {
247
  return 'free';
248
  }
249
 
250
  $license = $this->premium_license;
251
 
252
+ if( $license->is_lifetime() ) {
253
  return 'gift';
254
+ } else if( $license->get_expiration_time('days') < 1 ) {
255
  return 'trial';
256
  }
257
 
258
  return 'paid';
259
  }
260
 
261
+ protected function render_learnmore_section()
262
+ {
263
+ if( $this->is_premium ):
264
+ ?>
265
+ <p style="margin-top: 10px;">
266
+ <?php printf(__('<a href="%s" target="_blank" rel="noopener">Lean more</a> about the premium version and get the license key to activate it now!', 'wbcr_factory_clearfy_221'), $this->plugin->get_support()->get_pricing_url(true, 'license_page')); ?>
267
+ </p>
268
+ <?php else: ?>
269
+ <p style="margin-top: 10px;">
270
+ <?php printf(__('Can’t find your key? Go to <a href="%s" target="_blank" rel="noopener">this page</a> and login using the e-mail address associated with your purchase.', 'wbcr_factory_clearfy_221'), $this->plugin->get_support()->get_contacts_url(true, 'license_page')) ?>
271
+ </p>
272
+ <?php endif;
273
+ }
274
+
275
  /**
276
  * @param bool|WP_Error $notice
277
  */
278
+ public function show_license_form($notice = false)
279
+ {
280
  ?>
281
+ <div id="license-manager"
282
+ class="factory-bootstrap-430 onp-page-wrap <?= $this->get_license_type() ?>-license-manager-content">
283
+ <div>
284
+ <h3><?php printf(__('Activate %s', 'wbcr_factory_clearfy_221'), $this->plan_name) ?></h3>
285
  <?php echo $this->get_plan_description() ?>
286
+ </div>
287
+ <br>
288
+ <?php if( is_wp_error($notice) ) : ?>
289
+ <div class="license-message <?= $this->get_license_type() ?>-license-message">
290
+ <div class="alert <?php echo esc_attr($notice->get_error_code()); ?>">
291
+ <h4 class="alert-heading"><?php _e($notice->get_error_message(), 'wbcr_factory_clearfy_221') ?></h4>
292
+ </div>
293
+ </div>
294
  <?php endif; ?>
295
+ <div class="onp-container">
296
+ <div class="license-details">
297
+ <?php if( $this->get_license_type() == 'free' ): ?>
298
+ <a href="<?php echo $this->plugin->get_support()->get_pricing_url(true, 'license_page'); ?>"
299
+ class="purchase-premium" target="_blank" rel="noopener">
300
  <span class="btn btn-gold btn-inner-wrap">
301
+ <?php _e('Upgrade to Premium', 'wbcr_factory_clearfy_221') ?>
302
  </span>
303
+ </a>
304
+ <p><?php printf(__('Your current license for %1$s:', 'wbcr_factory_clearfy_221'), $this->plugin->getPluginTitle()) ?></p>
305
  <?php endif; ?>
306
+ <div class="license-details-block <?= $this->get_license_type() ?>-details-block">
307
+ <?php if( $this->is_premium ): ?>
308
+ <a data-action="deactivate" href="#"
309
+ class="btn btn-default btn-small license-delete-button wcl-control-btn">
310
+ <?php _e('Delete Key', 'wbcr_factory_clearfy_221') ?>
311
+ </a>
312
+ <a data-action="sync" href="#"
313
+ class="btn btn-default btn-small license-synchronization-button wcl-control-btn">
314
+ <?php _e('Synchronization', 'wbcr_factory_clearfy_221') ?>
315
+ </a>
316
  <?php endif; ?>
317
+ <h3>
318
+ <?php echo ucfirst($this->get_plan()); ?>
319
 
320
+ <?php if( $this->is_premium && $this->premium_has_subscription ): ?>
321
+ <span style="font-size: 15px;">
322
+ (<?php printf(__('Automatic renewal, every %s', ''), esc_attr($this->get_billing_cycle_readable())); ?>)
323
  </span>
324
  <?php endif; ?>
325
+ </h3>
326
+ <?php if( $this->is_premium ): ?>
327
+ <div class="license-key-identity">
328
+ <code><?= esc_attr($this->get_hidden_license_key()) ?></code>
329
+ </div>
330
  <?php endif; ?>
331
+ <div class="license-key-description">
332
+ <?php if( !$this->is_premium ): ?>
333
+ <p><?php _e('Public License is a GPLv3 compatible license allowing you to change and use this version of the plugin for free. Please keep in mind this license covers only free edition of the plugin. Premium versions are distributed with other type of a license.', 'wbcr_factory_clearfy_221') ?></p>
334
+ <?php else: ?>
335
+ <p><?php _e('Сommercial license, only to the premium add-on to this free plugin. You cannot distribute or modify the premium add-on. But free plugin is a GPLv3 compatible license allowing you to change and use this version of the plugin for free.', 'wbcr_factory_clearfy_221') ?></p>
336
+ <?php endif; ?>
337
+ <?php if( $this->is_premium && $this->premium_has_subscription ): ?>
338
+ <p class="activate-trial-hint">
339
+ <?php _e('You use a paid subscription for the plugin updates. In case you don’t want to receive paid updates, please, click <a data-action="unsubscribe" class="wcl-control-btn" href="#">cancel subscription</a>', 'wbcr_factory_clearfy_221') ?>
340
+ </p>
341
  <?php endif; ?>
342
 
343
+ <?php if( $this->get_license_type() == 'trial' ): ?>
344
+ <p class="activate-error-hint">
345
+ <?php printf(__('Your license has expired, please extend the license to get updates and support.', 'wbcr_factory_clearfy_221'), '') ?>
346
+ </p>
347
  <?php endif; ?>
348
+ </div>
349
+ <table class="license-params" colspacing="0" colpadding="0">
350
+ <tr>
351
+ <!--<td class="license-param license-param-domain">
352
+ <span class="license-value"><?php echo esc_attr($_SERVER['SERVER_NAME']); ?></span>
353
+ <span class="license-value-name"><?php _e('domain', 'wbcr_factory_clearfy_221') ?></span>
354
  </td>-->
355
+ <td class="license-param license-param-days">
356
+ <span class="license-value"><?= $this->get_plan() ?></span>
357
+ <span class="license-value-name"><?php _e('plan', 'wbcr_factory_clearfy_221') ?></span>
358
+ </td>
359
+ <?php if( $this->is_premium ) : ?>
360
+ <td class="license-param license-param-sites">
361
  <span class="license-value">
362
+ <?php echo esc_attr($this->premium_license->get_count_active_sites()); ?>
363
+ <?php _e('of', 'wbcr_factory_clearfy_221') ?>
364
+ <?php echo esc_attr($this->premium_license->get_sites_quota()); ?></span>
365
+ <span class="license-value-name"><?php _e('active sites', 'wbcr_factory_clearfy_221') ?></span>
366
+ </td>
367
  <?php endif; ?>
368
+ <td class="license-param license-param-version">
369
+ <span class="license-value"><?= $this->plugin->getPluginVersion() ?></span>
370
+ <span class="license-value-name"><span>version</span></span>
371
+ </td>
372
+ <?php if( $this->is_premium ): ?>
373
+ <td class="license-param license-param-days">
374
+ <?php if( $this->get_license_type() == 'trial' ): ?>
375
+ <span class="license-value"><?php _e('EXPIRED!', 'wbcr_factory_clearfy_221') ?></span>
376
+ <span class="license-value-name"><?php _e('please update the key', 'wbcr_factory_clearfy_221') ?></span>
377
  <?php else: ?>
378
+ <span class="license-value">
379
  <?php
380
+ if( $this->premium_license->is_lifetime() ) {
381
  echo 'infiniate';
382
  } else {
383
  echo $this->get_expiration_days();
384
  }
385
  ?>
386
+ <small> <?php _e('day(s)', 'wbcr_factory_clearfy_221') ?></small>
387
  </span>
388
+ <span class="license-value-name"><?php _e('remained', 'wbcr_factory_clearfy_221') ?></span>
389
  <?php endif; ?>
390
+ </td>
391
  <?php endif; ?>
392
+ </tr>
393
+ </table>
394
+ </div>
395
+ </div>
396
+ <div class="license-input">
397
+ <form action="" method="post">
398
+ <?php if($this->is_premium): ?>
399
+ <p><?php _e('Have a key to activate the premium version? Paste it here:', 'wbcr_factory_clearfy_221') ?><p>
400
  <?php else: ?>
401
+ <p><?php _e('Have a key to activate the plugin? Paste it here:', 'wbcr_factory_clearfy_221') ?>
402
+ <p>
403
  <?php endif; ?>
404
+ <button data-action="activate" class="btn btn-default wcl-control-btn" type="button"
405
+ id="license-submit">
406
+ <?php _e('Submit Key', 'wbcr_factory_clearfy_221') ?>
407
+ </button>
408
+ <div class="license-key-wrap">
409
+ <input type="text" id="license-key" name="licensekey" value="" class="form-control"/>
410
+ </div>
411
+ <?php $this->render_learnmore_section(); ?>
412
+ </form>
413
+ </div>
414
+ </div>
415
+ </div>
 
 
 
 
 
 
 
 
416
  <?php
417
  }
418
  }
libs/factory/clearfy/pages/class-page-more-features.php CHANGED
@@ -15,7 +15,7 @@ if ( ! defined( 'ABSPATH' ) ) {
15
  }
16
 
17
 
18
- class Wbcr_FactoryClearfy212_MoreFeaturesPage extends Wbcr_FactoryPages420_ImpressiveThemplate {
19
 
20
  /**
21
  * {@inheritDoc}
@@ -60,8 +60,8 @@ class Wbcr_FactoryClearfy212_MoreFeaturesPage extends Wbcr_FactoryPages420_Impre
60
  */
61
  public $internal = true;
62
 
63
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
64
- $this->menu_title = __( 'More features (<b>free</b>)', 'wbcr_factory_clearfy_212' );
65
 
66
  parent::__construct( $plugin );
67
 
@@ -74,7 +74,7 @@ class Wbcr_FactoryClearfy212_MoreFeaturesPage extends Wbcr_FactoryPages420_Impre
74
  * @return string
75
  */
76
  public function getPageTitle() {
77
- return __( 'More features', 'wbcr_factory_clearfy_212' );
78
  }
79
 
80
  /**
@@ -88,66 +88,66 @@ class Wbcr_FactoryClearfy212_MoreFeaturesPage extends Wbcr_FactoryPages420_Impre
88
  <div class="col-sm-4">
89
  <div class="wbcr-factory-feature-box">
90
  <span class="dashicons dashicons-yes"></span>
91
- <h3><?php _e( 'Code cleaning', 'wbcr_factory_clearfy_212' ) ?></h3>
92
- <p><?php _e( 'Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_212' ) ?></p>
93
  </div>
94
  </div>
95
  <div class="col-sm-4">
96
  <div class="wbcr-factory-feature-box">
97
  <span class="dashicons dashicons-chart-bar"></span>
98
- <h3><?php _e( 'Improve SEO', 'wbcr_factory_clearfy_212' ) ?></h3>
99
- <p><?php _e( 'Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_212' ) ?></p>
100
  </div>
101
  </div>
102
  <div class="col-sm-4">
103
  <div class="wbcr-factory-feature-box">
104
  <span class="dashicons dashicons-shield-alt"></span>
105
- <h3><?php _e( 'Site protection', 'wbcr_factory_clearfy_212' ) ?></h3>
106
- <p><?php _e( 'Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_212' ) ?></p>
107
  </div>
108
  </div>
109
  <div class="col-sm-4">
110
  <div class="wbcr-factory-feature-box">
111
  <span class="dashicons dashicons-welcome-comments"></span>
112
- <h3><?php _e( 'Disable comments', 'wbcr_factory_clearfy_212' ) ?></h3>
113
- <p><?php _e( 'Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_212' ) ?></p>
114
  </div>
115
  </div>
116
  <div class="col-sm-4">
117
  <div class="wbcr-factory-feature-box">
118
  <span class="dashicons dashicons-update"></span>
119
- <h3><?php _e( 'Manage updates', 'wbcr_factory_clearfy_212' ) ?></h3>
120
  <p><?php _e( 'Enables or disables automatically updates for plugins, themes and core. It is also possible
121
- to disable all updates.', 'wbcr_factory_clearfy_212' ) ?></p>
122
  </div>
123
  </div>
124
  <div class="col-sm-4">
125
  <div class="wbcr-factory-feature-box">
126
  <span class="dashicons dashicons-admin-plugins"></span>
127
- <h3><?php _e( 'Manage widgets', 'wbcr_factory_clearfy_212' ) ?></h3>
128
- <p><?php _e( 'Allows you to remove unused widgets.', 'wbcr_factory_clearfy_212' ) ?></p>
129
  </div>
130
  </div>
131
  <div class="col-sm-4">
132
  <div class="wbcr-factory-feature-box">
133
  <span class="dashicons dashicons-dashboard"></span>
134
- <h3><?php _e( 'Speed Optimization', 'wbcr_factory_clearfy_212' ) ?></h3>
135
- <p><?php _e( 'Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_212' ) ?></p>
136
  </div>
137
  </div>
138
  <div class="col-sm-4">
139
  <div class="wbcr-factory-feature-box">
140
  <span class="dashicons dashicons-visibility"></span>
141
- <h3><?php _e( 'Site privacy', 'wbcr_factory_clearfy_212' ) ?></h3>
142
  <p><?php _e( 'Allows you to hide the version of the site and plugins. Allows you to hide your
143
- WordPress.', 'wbcr_factory_clearfy_212' ) ?></p>
144
  </div>
145
  </div>
146
  <div class="col-sm-4">
147
  <div class="wbcr-factory-feature-box">
148
  <span class="dashicons dashicons-admin-settings"></span>
149
- <h3><?php _e( 'Easy setup', 'wbcr_factory_clearfy_212' ) ?></h3>
150
- <p><?php _e( 'In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_212' ) ?></p>
151
  </div>
152
  </div>
153
  </div>
@@ -161,7 +161,7 @@ class Wbcr_FactoryClearfy212_MoreFeaturesPage extends Wbcr_FactoryPages420_Impre
161
  $url .= '?utm_source=wordpress.org&utm_campaign=' . $this->plugin->getPluginName();
162
  ?>
163
  <a href="<?= $url ?>" class="wbcr-factory-premium-button" target="_blank">
164
- <?php _e( 'Get the ultimate plugin 100% FREE', 'wbcr_factory_clearfy_212' ) ?>
165
  </a>
166
  </div>
167
  <?php
15
  }
16
 
17
 
18
+ class Wbcr_FactoryClearfy221_MoreFeaturesPage extends Wbcr_FactoryPages429_ImpressiveThemplate {
19
 
20
  /**
21
  * {@inheritDoc}
60
  */
61
  public $internal = true;
62
 
63
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
64
+ $this->menu_title = __( 'More features (<b>free</b>)', 'wbcr_factory_clearfy_221' );
65
 
66
  parent::__construct( $plugin );
67
 
74
  * @return string
75
  */
76
  public function getPageTitle() {
77
+ return __( 'More features', 'wbcr_factory_clearfy_221' );
78
  }
79
 
80
  /**
88
  <div class="col-sm-4">
89
  <div class="wbcr-factory-feature-box">
90
  <span class="dashicons dashicons-yes"></span>
91
+ <h3><?php _e( 'Code cleaning', 'wbcr_factory_clearfy_221' ) ?></h3>
92
+ <p><?php _e( 'Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_221' ) ?></p>
93
  </div>
94
  </div>
95
  <div class="col-sm-4">
96
  <div class="wbcr-factory-feature-box">
97
  <span class="dashicons dashicons-chart-bar"></span>
98
+ <h3><?php _e( 'Improve SEO', 'wbcr_factory_clearfy_221' ) ?></h3>
99
+ <p><?php _e( 'Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_221' ) ?></p>
100
  </div>
101
  </div>
102
  <div class="col-sm-4">
103
  <div class="wbcr-factory-feature-box">
104
  <span class="dashicons dashicons-shield-alt"></span>
105
+ <h3><?php _e( 'Site protection', 'wbcr_factory_clearfy_221' ) ?></h3>
106
+ <p><?php _e( 'Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_221' ) ?></p>
107
  </div>
108
  </div>
109
  <div class="col-sm-4">
110
  <div class="wbcr-factory-feature-box">
111
  <span class="dashicons dashicons-welcome-comments"></span>
112
+ <h3><?php _e( 'Disable comments', 'wbcr_factory_clearfy_221' ) ?></h3>
113
+ <p><?php _e( 'Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_221' ) ?></p>
114
  </div>
115
  </div>
116
  <div class="col-sm-4">
117
  <div class="wbcr-factory-feature-box">
118
  <span class="dashicons dashicons-update"></span>
119
+ <h3><?php _e( 'Manage updates', 'wbcr_factory_clearfy_221' ) ?></h3>
120
  <p><?php _e( 'Enables or disables automatically updates for plugins, themes and core. It is also possible
121
+ to disable all updates.', 'wbcr_factory_clearfy_221' ) ?></p>
122
  </div>
123
  </div>
124
  <div class="col-sm-4">
125
  <div class="wbcr-factory-feature-box">
126
  <span class="dashicons dashicons-admin-plugins"></span>
127
+ <h3><?php _e( 'Manage widgets', 'wbcr_factory_clearfy_221' ) ?></h3>
128
+ <p><?php _e( 'Allows you to remove unused widgets.', 'wbcr_factory_clearfy_221' ) ?></p>
129
  </div>
130
  </div>
131
  <div class="col-sm-4">
132
  <div class="wbcr-factory-feature-box">
133
  <span class="dashicons dashicons-dashboard"></span>
134
+ <h3><?php _e( 'Speed Optimization', 'wbcr_factory_clearfy_221' ) ?></h3>
135
+ <p><?php _e( 'Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_221' ) ?></p>
136
  </div>
137
  </div>
138
  <div class="col-sm-4">
139
  <div class="wbcr-factory-feature-box">
140
  <span class="dashicons dashicons-visibility"></span>
141
+ <h3><?php _e( 'Site privacy', 'wbcr_factory_clearfy_221' ) ?></h3>
142
  <p><?php _e( 'Allows you to hide the version of the site and plugins. Allows you to hide your
143
+ WordPress.', 'wbcr_factory_clearfy_221' ) ?></p>
144
  </div>
145
  </div>
146
  <div class="col-sm-4">
147
  <div class="wbcr-factory-feature-box">
148
  <span class="dashicons dashicons-admin-settings"></span>
149
+ <h3><?php _e( 'Easy setup', 'wbcr_factory_clearfy_221' ) ?></h3>
150
+ <p><?php _e( 'In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_221' ) ?></p>
151
  </div>
152
  </div>
153
  </div>
161
  $url .= '?utm_source=wordpress.org&utm_campaign=' . $this->plugin->getPluginName();
162
  ?>
163
  <a href="<?= $url ?>" class="wbcr-factory-premium-button" target="_blank">
164
+ <?php _e( 'Get the ultimate plugin 100% FREE', 'wbcr_factory_clearfy_221' ) ?>
165
  </a>
166
  </div>
167
  <?php
libs/factory/clearfy/pages/class-pages.php CHANGED
@@ -9,20 +9,20 @@
9
  */
10
 
11
  // Exit if accessed directly
12
- if ( ! defined( 'ABSPATH' ) ) {
13
  exit;
14
  }
15
 
16
  /**
17
- * Class Wbcr_FactoryPages420_ImpressiveThemplate
18
  *
19
  * @method string getInfoWidget() - get widget content information
20
- * @method string getRatingWidget( array $args = [] ) - get widget content rating
21
  * @method string getDonateWidget() - get widget content donate
22
  * @method string getBusinessSuggetionWidget()
23
  * @method string getSupportWidget
24
  */
25
- class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThemplate {
26
 
27
  /**
28
  * {@inheritDoc}
@@ -49,10 +49,23 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
49
  public $internal = true;
50
 
51
  /**
52
- * @param Wbcr_Factory420_Plugin $plugin
 
 
 
 
 
 
 
 
53
  */
54
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
55
- parent::__construct( $plugin );
 
 
 
 
 
56
  }
57
 
58
  /**
@@ -61,13 +74,14 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
61
  *
62
  * @return null|string
63
  */
64
- public function __call( $name, $arguments ) {
65
- if ( substr( $name, 0, 3 ) == 'get' ) {
66
- $called_method_name = 'show' . substr( $name, 3 );
67
- if ( method_exists( $this, $called_method_name ) ) {
 
68
  ob_start();
69
 
70
- $this->$called_method_name( $arguments );
71
  $content = ob_get_contents();
72
  ob_end_clean();
73
 
@@ -81,28 +95,31 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
81
  /**
82
  * Requests assets (js and css) for the page.
83
  *
84
- * @param Wbcr_Factory420_ScriptList $scripts
85
- * @param Wbcr_Factory420_StyleList $styles
86
  *
87
  * @return void
88
- * @see Wbcr_FactoryPages420_AdminPage
89
  *
90
  */
91
- public function assets( $scripts, $styles ) {
92
- parent::assets( $scripts, $styles );
 
93
 
94
- $this->styles->add( FACTORY_CLEARFY_212_URL . '/assets/css/clearfy-base.css' );
95
 
96
  // todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
97
- if ( defined( 'WCL_PLUGIN_URL' ) ) {
98
- $this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
99
  }
100
 
101
- wbcr_factory_420_do_action_deprecated( 'wbcr_clearfy_page_enqueue_scripts', [
102
- $this->getResultId(),
103
- $scripts,
104
- $styles
105
- ], '1.4.0', 'wbcr/clearfy/page_assets' );
 
 
106
 
107
  /**
108
  * Allows you to enqueue scripts to the internal pages of the plugin.
@@ -110,26 +127,28 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
110
  *
111
  * @since 2.0.5
112
  */
113
- do_action( 'wbcr/clearfy/page_assets', $this->getResultId(), $scripts, $styles );
114
  }
115
 
116
  /**
117
- * @return Wbcr_Factory420_Request
118
  */
119
- public function request() {
 
120
  return $this->plugin->request;
121
  }
122
 
123
  /**
124
- * @since 2.0.5
125
- *
126
  * @param $option_name
127
- * @param bool $default *
128
  *
129
  * @return mixed|void
 
 
130
  */
131
- public function getPopulateOption( $option_name, $default = false ) {
132
- return $this->plugin->getPopulateOption( $option_name, $default );
 
133
  }
134
 
135
  /**
@@ -138,8 +157,9 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
138
  *
139
  * @return mixed|void
140
  */
141
- public function getOption( $option_name, $default = false ) {
142
- return $this->plugin->getOption( $option_name, $default );
 
143
  }
144
 
145
  /**
@@ -148,8 +168,9 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
148
  *
149
  * @return void
150
  */
151
- public function updatePopulateOption( $option_name, $value ) {
152
- $this->plugin->updatePopulateOption( $option_name, $value );
 
153
  }
154
 
155
  /**
@@ -158,8 +179,9 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
158
  *
159
  * @return void
160
  */
161
- public function updateOption( $option_name, $value ) {
162
- $this->plugin->updateOption( $option_name, $value );
 
163
  }
164
 
165
  /**
@@ -167,8 +189,9 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
167
  *
168
  * @return void
169
  */
170
- public function deletePopulateOption( $option_name ) {
171
- $this->plugin->deletePopulateOption( $option_name );
 
172
  }
173
 
174
  /**
@@ -176,41 +199,9 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
176
  *
177
  * @return void
178
  */
179
- public function deleteOption( $option_name ) {
180
- $this->plugin->deleteOption( $option_name );
181
- }
182
-
183
-
184
- /**
185
- * Действие выполняется для всех страниц Clearfy и его компонентах.
186
- * Это простое предложение перейти на PRO версию.
187
- */
188
- public function multisiteProAction() {
189
- if ( is_multisite() && $this->plugin->isNetworkActive() ) {
190
-
191
- $license_page_url = $this->getBaseUrl( 'license' );
192
- $upgrade_url = WbcrFactoryClearfy212_Helpers::getWebcrafticSitePageUrl( $this->plugin->getPluginName(), 'pricing', 'multisite_save_settings' );
193
- $upgrade_price = WbcrFactoryClearfy212_Helpers::getClearfyBusinessPrice();
194
-
195
- $html = '<div class="wbcr-factory-clearfy-212-multisite-suggetion">';
196
- $html .= '<div class="wbcr-factory-inner-contanier">';
197
- $html .= '<h3>' . __( 'Upgrade to Clearfy Business', 'wbcr_factory_clearfy_212' ) . '</h3>';
198
- $html .= '<p>' . __( 'Oops... Sorry for the inconvenience caused!', 'wbcr_factory_clearfy_212' ) . '</p>';
199
- $html .= '<p>' . __( 'Complete multisite support is available in Clearfy Business and Clearfy Business Revolution packages only!', 'wbcr_factory_clearfy_212' ) . '</p>';
200
- $html .= '<p>' . __( 'You can activate the plugin on each website and use it with zero limitations. But you can’t save the plugin’s settings under the Super Administrator role!', 'wbcr_factory_clearfy_212' ) . '</p>';
201
- $html .= '<p style="margin-top:20px">';
202
- $html .= '<a href="' . $license_page_url . '" class="wbcr-factory-activate-premium" rel="noopener">' . __( 'Activate license ', 'wbcr_factory_clearfy_212' ) . '</a> ';
203
- $html .= '<a href="' . $upgrade_url . '" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">' . sprintf( __( 'Upgrade to Clearfy Business for $%d', 'wbcr_factory_clearfy_212' ), $upgrade_price ) . '</a>';
204
- $html .= '</p>';
205
- $html .= '</div>';
206
- $html .= '</div>';
207
-
208
- $this->showPage( $html );
209
-
210
- return;
211
- }
212
-
213
- $this->redirectToAction( 'index' );
214
  }
215
 
216
  /**
@@ -218,35 +209,36 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
218
  *
219
  * @return mixed|void
220
  */
221
- protected function getPageWidgets( $position = 'bottom' ) {
 
222
  $widgets = [];
223
 
224
- if ( $position == 'bottom' ) {
225
- $widgets['info_widget'] = $this->getInfoWidget();
226
- $widgets['rating_widget'] = $this->getRatingWidget();
227
  $widgets['support_widget'] = $this->getSupportWidget();
228
  //$widgets['donate_widget'] = $this->getDonateWidget();
229
- } else if ( $position == 'right' ) {
230
  $widgets['business_suggetion'] = $this->getBusinessSuggetionWidget();
231
- $widgets['info_widget'] = $this->getInfoWidget();
232
- $widgets['rating_widget'] = $this->getRatingWidget();
233
  }
234
 
235
  /**
236
  * @since 4.0.9 - является устаревшим
237
  */
238
- $widgets = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_pages_420_imppage_get_widgets', [
239
  $widgets,
240
  $position,
241
  $this->plugin,
242
  $this
243
- ], '4.0.9', 'wbcr/factory/pages/impressive/widgets' );
244
 
245
  /**
246
  * @since 4.0.1 - добавлен
247
  * @since 4.0.9 - изменено имя
248
  */
249
- $widgets = apply_filters( 'wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this );
250
 
251
  return $widgets;
252
  }
@@ -257,58 +249,60 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
257
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
258
  * @since 2.0.2
259
  */
260
- public function showBusinessSuggetionWidget() {
261
- $plugin_name = $this->plugin->getPluginName();
 
262
  $upgrade_price = $this->plugin->has_premium() ? $this->plugin->premium->get_price() : 0;
263
- $purchase_url = $this->plugin->get_support()->get_pricing_url( true, 'right_sidebar_ads' );
264
 
265
  $default_features = [
266
- '4_premium' => __( '4 premium components now;', 'wbcr_factory_clearfy_212' ),
267
- '40_premium' => __( '40 new premium components within a year for the single price;', 'wbcr_factory_clearfy_212' ),
268
- 'multisite_support' => __( 'Multisite support;', 'wbcr_factory_clearfy_212' ),
269
- 'advance_settings' => __( 'Advanced settings;', 'wbcr_factory_clearfy_212' ),
270
- 'no_ads' => __( 'No ads;', 'wbcr_factory_clearfy_212' ),
271
- 'perfect_support' => __( 'Perfect support.', 'wbcr_factory_clearfy_212' )
272
  ];
273
 
274
  /**
275
  * @since 2.0.8 - added
276
  */
277
- $suggetion_title = __( 'MORE IN CLEARFY <span>BUSINESS</span>', 'wbcr_factory_clearfy_212' );
278
- $suggetion_title = apply_filters( 'wbcr/clearfy/pages/suggetion_title', $suggetion_title, $plugin_name, $this->id );
279
 
280
  /**
281
  * @since 2.0.8 - deprecated
282
  */
283
- $suggetion_features = wbcr_factory_420_apply_filters_deprecated( 'wbcr/clearfy/page_bussines_suggetion_features', [
284
  $default_features,
285
  $this->plugin->getPluginName(),
286
  $this->id
287
- ], '2.0.8', 'wbcr/clearfy/pages/suggetion_features' );
288
 
289
  /**
290
  * @since 2.0.8 - renamed
291
  * @since 2.0.6
292
  */
293
- $suggetion_features = apply_filters( 'wbcr/clearfy/pages/suggetion_features', $suggetion_features, $plugin_name, $this->id );
294
 
295
- if ( empty( $suggetion_features ) ) {
296
  $suggetion_features = $default_features;
297
  }
298
  ?>
299
- <div class="wbcr-factory-sidebar-widget wbcr-factory-clearfy-212-pro-suggettion">
300
- <h3><?php echo $suggetion_title; ?></h3>
301
- <ul>
302
- <?php if ( ! empty( $suggetion_features ) ): ?>
303
- <?php foreach ( $suggetion_features as $feature ): ?>
304
- <li><?= $feature ?></li>
305
  <?php endforeach; ?>
306
  <?php endif; ?>
307
- </ul>
308
- <a href="<?php echo $purchase_url ?>" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">
309
- <?php printf( __( 'Upgrade for $%s', 'wbcr_factory_clearfy_212' ), $upgrade_price ) ?>
310
- </a>
311
- </div>
 
312
  <?php
313
  }
314
 
@@ -318,66 +312,72 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
318
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
319
  * @since 2.0.0
320
  */
321
- public function showInfoWidget() {
 
322
  ?>
323
- <div class="wbcr-factory-sidebar-widget">
324
- <ul>
325
- <li>
326
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
327
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
 
328
  </span>
329
- - <?php _e( 'A neutral setting that can not harm your site, but you must be sure that you need to use it.', 'wbcr_factory_clearfy_212' ); ?>
330
- </li>
331
- <li>
332
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
333
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
 
334
  </span>
335
- - <?php _e( 'When set this option, you must be careful. Plugins and themes may depend on this function. You must be sure that you can disable this feature for the site.', 'wbcr_factory_clearfy_212' ); ?>
336
- </li>
337
- <li>
338
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
339
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
 
340
  </span>
341
- - <?php _e( 'Absolutely safe setting, We recommend to use.', 'wbcr_factory_clearfy_212' ); ?>
342
- </li>
343
- </ul>
344
- ----------<br>
345
- <p><?php _e( 'Hover to the icon to get help for the feature you selected.', 'wbcr_factory_clearfy_212' ); ?></p>
346
- </div>
347
  <?php
348
  }
349
 
350
  /**
351
  * Создает html разметку виджета рейтинга
352
  *
353
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
 
354
  * @since 2.0.0
355
  *
356
- * @param array $args
357
  */
358
- public function showRatingWidget( array $args ) {
359
- if ( ! isset( $args[0] ) || empty( $args[0] ) ) {
 
360
  $page_url = "https://goo.gl/tETE2X";
361
  } else {
362
  $page_url = $args[0];
363
  }
364
 
365
- $page_url = apply_filters( 'wbcr_factory_pages_420_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId() );
366
 
367
  ?>
368
- <div class="wbcr-factory-sidebar-widget">
369
- <p>
370
- <strong><?php _e( 'Do you want the plugin to improved and update?', 'wbcr_factory_clearfy_212' ); ?></strong>
371
- </p>
372
- <p><?php _e( 'Help the author, leave a review on wordpress.org. Thanks to feedback, I will know that the plugin is really useful to you and is needed.', 'wbcr_factory_clearfy_212' ); ?></p>
373
- <p><?php _e( 'And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_clearfy_212' ); ?></p>
374
- <p>
375
- <i class="wbcr-factory-icon-5stars"></i>
376
- <a href="<?= $page_url ?>" title="Go rate us" target="_blank">
377
- <strong><?php _e( 'Go rate us and push ideas', 'wbcr_factory_clearfy_212' ); ?></strong>
378
- </a>
379
- </p>
380
- </div>
381
  <?php
382
  }
383
 
@@ -387,23 +387,28 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
387
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
388
  * @since 2.0.0
389
  */
390
- public function showDonateWidget() {
 
391
  ?>
392
- <div class="wbcr-factory-sidebar-widget">
393
- <p>
394
- <strong><?php _e( 'Donation for plugin development', 'wbcr_factory_clearfy_212' ); ?></strong>
395
- </p>
396
- <?php if ( get_locale() !== 'ru_RU' ): ?>
397
- <form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
398
- <input type="hidden" name="cmd" value="_s-xclick">
399
- <input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
400
- <div class="wbcr-factory-donation-price">5$</div>
401
- <input type="image" src="<?= FACTORY_PAGES_420_URL ?>/templates/assets/img/paypal-donate.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
402
- </form>
 
 
403
  <?php else: ?>
404
- <iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/embed/donate.xml?account=410011242846510&quickpay=donate&payment-type-choice=on&mobile-payment-type-choice=on&default-sum=300&targets=%D0%9D%D0%B0+%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D1%83+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0+%D0%B8+%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D1%83+%D0%BD%D0%BE%D0%B2%D1%8B%D1%85+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9.+&target-visibility=on&project-name=Webcraftic&project-site=&button-text=05&comment=on&hint=%D0%9A%D0%B0%D0%BA%D1%83%D1%8E+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E+%D0%BD%D1%83%D0%B6%D0%BD%D0%BE+%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D0%B2+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%3F&mail=on&successURL=" width="508" height="187"></iframe>
 
 
405
  <?php endif; ?>
406
- </div>
407
  <?php
408
  }
409
 
@@ -413,27 +418,67 @@ class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThe
413
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
414
  * @since 2.0.8
415
  */
416
- public function showSupportWidget() {
 
417
  $free_support_url = $this->plugin->get_support()->get_contacts_url();
418
- $hot_support_url = 'https://webcraftic.com/other-questions-support/';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
419
  ?>
420
- <div id="wbcr-clr-support-widget" class="wbcr-factory-sidebar-widget">
421
- <p><strong><?php _e( 'Having Issues?', 'clearfy' ); ?></strong></p>
422
- <div class="wbcr-clr-support-widget-body">
423
- <p>
424
- <?php _e( 'We provide free support for this plugin. If you are pushed with a problem, just create a new ticket. We will definitely help you!', 'clearfy' ); ?>
425
- </p>
426
- <ul>
427
- <li><span class="dashicons dashicons-sos"></span>
428
- <a href="<?= $free_support_url ?>" target="_blank" rel="noopener"><?php _e( 'Get starting free support', 'clearfy' ); ?></a>
429
- </li>
430
- <li style="margin-top: 15px;background: #fff4f1;padding: 10px;color: #a58074;">
431
- <span class="dashicons dashicons-warning"></span>
432
- <?php printf( __( 'If you find a php error or a vulnerability in plugin, you can <a href="%s" target="_blank" rel="noopener">create ticket</a> in hot support that we responded instantly.', 'clearfy' ), $hot_support_url ); ?>
433
- </li>
434
- </ul>
435
- </div>
436
- </div>
437
  <?php
438
  }
439
  }
9
  */
10
 
11
  // Exit if accessed directly
12
+ if( !defined('ABSPATH') ) {
13
  exit;
14
  }
15
 
16
  /**
17
+ * Class Wbcr_FactoryPages429_ImpressiveThemplate
18
  *
19
  * @method string getInfoWidget() - get widget content information
20
+ * @method string getRatingWidget(array $args = []) - get widget content rating
21
  * @method string getDonateWidget() - get widget content donate
22
  * @method string getBusinessSuggetionWidget()
23
  * @method string getSupportWidget
24
  */
25
+ class Wbcr_FactoryClearfy221_PageBase extends Wbcr_FactoryPages429_ImpressiveThemplate {
26
 
27
  /**
28
  * {@inheritDoc}
49
  public $internal = true;
50
 
51
  /**
52
+ * Show on the page a search form for search options of plugin?
53
+ *
54
+ * @since 2.2.0 - Added
55
+ * @var bool - true show, false hide
56
+ */
57
+ public $show_search_options_form = true;
58
+
59
+ /**
60
+ * @param Wbcr_Factory429_Plugin $plugin
61
  */
62
+ public function __construct(Wbcr_Factory429_Plugin $plugin)
63
+ {
64
+ parent::__construct($plugin);
65
+
66
+ if( $this->show_search_options_form && "options" === $this->type && "hide_my_wp" !== $this->id ) {
67
+ $this->register_options_to_search();
68
+ }
69
  }
70
 
71
  /**
74
  *
75
  * @return null|string
76
  */
77
+ public function __call($name, $arguments)
78
+ {
79
+ if( substr($name, 0, 3) == 'get' ) {
80
+ $called_method_name = 'show' . substr($name, 3);
81
+ if( method_exists($this, $called_method_name) ) {
82
  ob_start();
83
 
84
+ $this->$called_method_name($arguments);
85
  $content = ob_get_contents();
86
  ob_end_clean();
87
 
95
  /**
96
  * Requests assets (js and css) for the page.
97
  *
98
+ * @param Wbcr_Factory429_ScriptList $scripts
99
+ * @param Wbcr_Factory429_StyleList $styles
100
  *
101
  * @return void
102
+ * @see Wbcr_FactoryPages429_AdminPage
103
  *
104
  */
105
+ public function assets($scripts, $styles)
106
+ {
107
+ parent::assets($scripts, $styles);
108
 
109
+ $this->styles->add(FACTORY_CLEARFY_221_URL . '/assets/css/clearfy-base.css');
110
 
111
  // todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
112
+ if( defined('WCL_PLUGIN_URL') ) {
113
+ $this->styles->add(WCL_PLUGIN_URL . '/admin/assets/css/general.css');
114
  }
115
 
116
+ // Script for search form on plugin options
117
+ if( $this->show_search_options_form && "options" === $this->type ) {
118
+ $this->styles->add(FACTORY_CLEARFY_221_URL . '/assets/css/libs/autocomplete.css');
119
+
120
+ $this->scripts->add(FACTORY_CLEARFY_221_URL . '/assets/js/libs/jquery.autocomplete.min.js');
121
+ $this->scripts->add(FACTORY_CLEARFY_221_URL . '/assets/js/search-options.js');
122
+ }
123
 
124
  /**
125
  * Allows you to enqueue scripts to the internal pages of the plugin.
127
  *
128
  * @since 2.0.5
129
  */
130
+ do_action('wbcr/clearfy/page_assets', $this->getResultId(), $scripts, $styles);
131
  }
132
 
133
  /**
134
+ * @return Wbcr_Factory429_Request
135
  */
136
+ public function request()
137
+ {
138
  return $this->plugin->request;
139
  }
140
 
141
  /**
 
 
142
  * @param $option_name
143
+ * @param bool $default *
144
  *
145
  * @return mixed|void
146
+ * @since 2.0.5
147
+ *
148
  */
149
+ public function getPopulateOption($option_name, $default = false)
150
+ {
151
+ return $this->plugin->getPopulateOption($option_name, $default);
152
  }
153
 
154
  /**
157
  *
158
  * @return mixed|void
159
  */
160
+ public function getOption($option_name, $default = false)
161
+ {
162
+ return $this->plugin->getOption($option_name, $default);
163
  }
164
 
165
  /**
168
  *
169
  * @return void
170
  */
171
+ public function updatePopulateOption($option_name, $value)
172
+ {
173
+ $this->plugin->updatePopulateOption($option_name, $value);
174
  }
175
 
176
  /**
179
  *
180
  * @return void
181
  */
182
+ public function updateOption($option_name, $value)
183
+ {
184
+ $this->plugin->updateOption($option_name, $value);
185
  }
186
 
187
  /**
189
  *
190
  * @return void
191
  */
192
+ public function deletePopulateOption($option_name)
193
+ {
194
+ $this->plugin->deletePopulateOption($option_name);
195
  }
196
 
197
  /**
199
  *
200
  * @return void
201
  */
202
+ public function deleteOption($option_name)
203
+ {
204
+ $this->plugin->deleteOption($option_name);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
  }
206
 
207
  /**
209
  *
210
  * @return mixed|void
211
  */
212
+ protected function getPageWidgets($position = 'bottom')
213
+ {
214
  $widgets = [];
215
 
216
+ if( $position == 'bottom' ) {
217
+ $widgets['info_widget'] = $this->getInfoWidget();
218
+ $widgets['rating_widget'] = $this->getRatingWidget();
219
  $widgets['support_widget'] = $this->getSupportWidget();
220
  //$widgets['donate_widget'] = $this->getDonateWidget();
221
+ } else if( $position == 'right' ) {
222
  $widgets['business_suggetion'] = $this->getBusinessSuggetionWidget();
223
+ $widgets['info_widget'] = $this->getInfoWidget();
224
+ $widgets['rating_widget'] = $this->getRatingWidget();
225
  }
226
 
227
  /**
228
  * @since 4.0.9 - является устаревшим
229
  */
230
+ $widgets = wbcr_factory_429_apply_filters_deprecated('wbcr_factory_pages_429_imppage_get_widgets', [
231
  $widgets,
232
  $position,
233
  $this->plugin,
234
  $this
235
+ ], '4.0.9', 'wbcr/factory/pages/impressive/widgets');
236
 
237
  /**
238
  * @since 4.0.1 - добавлен
239
  * @since 4.0.9 - изменено имя
240
  */
241
+ $widgets = apply_filters('wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this);
242
 
243
  return $widgets;
244
  }
249
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
250
  * @since 2.0.2
251
  */
252
+ public function showBusinessSuggetionWidget()
253
+ {
254
+ $plugin_name = $this->plugin->getPluginName();
255
  $upgrade_price = $this->plugin->has_premium() ? $this->plugin->premium->get_price() : 0;
256
+ $purchase_url = $this->plugin->get_support()->get_pricing_url(true, 'right_sidebar_ads');
257
 
258
  $default_features = [
259
+ '4_premium' => __('4 premium components now;', 'wbcr_factory_clearfy_221'),
260
+ '40_premium' => __('40 new premium components within a year for the single price;', 'wbcr_factory_clearfy_221'),
261
+ 'multisite_support' => __('Multisite support;', 'wbcr_factory_clearfy_221'),
262
+ 'advance_settings' => __('Advanced settings;', 'wbcr_factory_clearfy_221'),
263
+ 'no_ads' => __('No ads;', 'wbcr_factory_clearfy_221'),
264
+ 'perfect_support' => __('Perfect support.', 'wbcr_factory_clearfy_221')
265
  ];
266
 
267
  /**
268
  * @since 2.0.8 - added
269
  */
270
+ $suggetion_title = __('MORE IN CLEARFY <span>BUSINESS</span>', 'wbcr_factory_clearfy_221');
271
+ $suggetion_title = apply_filters('wbcr/clearfy/pages/suggetion_title', $suggetion_title, $plugin_name, $this->id);
272
 
273
  /**
274
  * @since 2.0.8 - deprecated
275
  */
276
+ $suggetion_features = wbcr_factory_429_apply_filters_deprecated('wbcr/clearfy/page_bussines_suggetion_features', [
277
  $default_features,
278
  $this->plugin->getPluginName(),
279
  $this->id
280
+ ], '2.0.8', 'wbcr/clearfy/pages/suggetion_features');
281
 
282
  /**
283
  * @since 2.0.8 - renamed
284
  * @since 2.0.6
285
  */
286
+ $suggetion_features = apply_filters('wbcr/clearfy/pages/suggetion_features', $suggetion_features, $plugin_name, $this->id);
287
 
288
+ if( empty($suggetion_features) ) {
289
  $suggetion_features = $default_features;
290
  }
291
  ?>
292
+ <div class="wbcr-factory-sidebar-widget wbcr-factory-clearfy-221-pro-suggettion">
293
+ <h3><?php echo $suggetion_title; ?></h3>
294
+ <ul>
295
+ <?php if( !empty($suggetion_features) ): ?>
296
+ <?php foreach($suggetion_features as $feature): ?>
297
+ <li><?= $feature ?></li>
298
  <?php endforeach; ?>
299
  <?php endif; ?>
300
+ </ul>
301
+ <a href="<?php echo $purchase_url ?>" class="wbcr-factory-purchase-premium" target="_blank"
302
+ rel="noopener">
303
+ <?php printf(__('Upgrade for $%s', 'wbcr_factory_clearfy_221'), $upgrade_price) ?>
304
+ </a>
305
+ </div>
306
  <?php
307
  }
308
 
312
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
313
  * @since 2.0.0
314
  */
315
+ public function showInfoWidget()
316
+ {
317
  ?>
318
+ <div class="wbcr-factory-sidebar-widget">
319
+ <ul>
320
+ <li>
321
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
322
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC"
323
+ alt=""/>
324
  </span>
325
+ - <?php _e('A neutral setting that can not harm your site, but you must be sure that you need to use it.', 'wbcr_factory_clearfy_221'); ?>
326
+ </li>
327
+ <li>
328
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
329
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC"
330
+ alt=""/>
331
  </span>
332
+ - <?php _e('When set this option, you must be careful. Plugins and themes may depend on this function. You must be sure that you can disable this feature for the site.', 'wbcr_factory_clearfy_221'); ?>
333
+ </li>
334
+ <li>
335
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
336
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC"
337
+ alt=""/>
338
  </span>
339
+ - <?php _e('Absolutely safe setting, We recommend to use.', 'wbcr_factory_clearfy_221'); ?>
340
+ </li>
341
+ </ul>
342
+ ----------<br>
343
+ <p><?php _e('Hover to the icon to get help for the feature you selected.', 'wbcr_factory_clearfy_221'); ?></p>
344
+ </div>
345
  <?php
346
  }
347
 
348
  /**
349
  * Создает html разметку виджета рейтинга
350
  *
351
+ * @param array $args
352
+ *
353
  * @since 2.0.0
354
  *
355
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
356
  */
357
+ public function showRatingWidget(array $args)
358
+ {
359
+ if( !isset($args[0]) || empty($args[0]) ) {
360
  $page_url = "https://goo.gl/tETE2X";
361
  } else {
362
  $page_url = $args[0];
363
  }
364
 
365
+ $page_url = apply_filters('wbcr_factory_pages_429_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId());
366
 
367
  ?>
368
+ <div class="wbcr-factory-sidebar-widget">
369
+ <p>
370
+ <strong><?php _e('Do you want the plugin to improved and update?', 'wbcr_factory_clearfy_221'); ?></strong>
371
+ </p>
372
+ <p><?php _e('Help the author, leave a review on wordpress.org. Thanks to feedback, I will know that the plugin is really useful to you and is needed.', 'wbcr_factory_clearfy_221'); ?></p>
373
+ <p><?php _e('And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_clearfy_221'); ?></p>
374
+ <p>
375
+ <i class="wbcr-factory-icon-5stars"></i>
376
+ <a href="<?= $page_url ?>" title="Go rate us" target="_blank">
377
+ <strong><?php _e('Go rate us and push ideas', 'wbcr_factory_clearfy_221'); ?></strong>
378
+ </a>
379
+ </p>
380
+ </div>
381
  <?php
382
  }
383
 
387
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
388
  * @since 2.0.0
389
  */
390
+ public function showDonateWidget()
391
+ {
392
  ?>
393
+ <div class="wbcr-factory-sidebar-widget">
394
+ <p>
395
+ <strong><?php _e('Donation for plugin development', 'wbcr_factory_clearfy_221'); ?></strong>
396
+ </p>
397
+ <?php if( get_locale() !== 'ru_RU' ): ?>
398
+ <form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr"
399
+ method="post" target="_blank">
400
+ <input type="hidden" name="cmd" value="_s-xclick">
401
+ <input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
402
+ <div class="wbcr-factory-donation-price">5$</div>
403
+ <input type="image" src="<?= FACTORY_PAGES_429_URL ?>/templates/assets/img/paypal-donate.png"
404
+ border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
405
+ </form>
406
  <?php else: ?>
407
+ <iframe frameborder="0" allowtransparency="true" scrolling="no"
408
+ src="https://money.yandex.ru/embed/donate.xml?account=410011242846510&quickpay=donate&payment-type-choice=on&mobile-payment-type-choice=on&default-sum=300&targets=%D0%9D%D0%B0+%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D1%83+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0+%D0%B8+%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D1%83+%D0%BD%D0%BE%D0%B2%D1%8B%D1%85+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9.+&target-visibility=on&project-name=Webcraftic&project-site=&button-text=05&comment=on&hint=%D0%9A%D0%B0%D0%BA%D1%83%D1%8E+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E+%D0%BD%D1%83%D0%B6%D0%BD%D0%BE+%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D0%B2+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%3F&mail=on&successURL="
409
+ width="508" height="187"></iframe>
410
  <?php endif; ?>
411
+ </div>
412
  <?php
413
  }
414
 
418
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
419
  * @since 2.0.8
420
  */
421
+ public function showSupportWidget()
422
+ {
423
  $free_support_url = $this->plugin->get_support()->get_contacts_url();
424
+ $hot_support_url = $this->plugin->get_support()->get_site_url() . '/other-questions-support';
425
+
426
+ ?>
427
+ <div id="wbcr-clr-support-widget" class="wbcr-factory-sidebar-widget">
428
+ <p><strong><?php _e('Having Issues?', 'clearfy'); ?></strong></p>
429
+ <div class="wbcr-clr-support-widget-body">
430
+ <p>
431
+ <?php _e('We provide free support for this plugin. If you are pushed with a problem, just create a new ticket. We will definitely help you!', 'clearfy'); ?>
432
+ </p>
433
+ <ul>
434
+ <li><span class="dashicons dashicons-sos"></span>
435
+ <a href="<?= $free_support_url ?>" target="_blank"
436
+ rel="noopener"><?php _e('Get starting free support', 'clearfy'); ?></a>
437
+ </li>
438
+ <li style="margin-top: 15px;background: #fff4f1;padding: 10px;color: #a58074;">
439
+ <span class="dashicons dashicons-warning"></span>
440
+ <?php printf(__('If you find a php error or a vulnerability in plugin, you can <a href="%s" target="_blank" rel="noopener">create ticket</a> in hot support that we responded instantly.', 'clearfy'), $hot_support_url); ?>
441
+ </li>
442
+ </ul>
443
+ </div>
444
+ </div>
445
+ <?php
446
+ }
447
+
448
+ /**
449
+ * Registers page options in the options registry
450
+ *
451
+ * This will allow the user to search all the plugin options.
452
+ */
453
+ public function register_options_to_search()
454
+ {
455
+ require_once FACTORY_CLEARFY_221_DIR . '/includes/class-search-options.php';
456
+
457
+ $options = $this->getPageOptions();
458
+ $page_url = $this->getBaseUrl();
459
+ $page_id = $this->getResultId();
460
+
461
+ \WBCR\Factory_Clearfy_221\Search_Options::register_options($options, $page_url, $page_id);
462
+ }
463
+
464
+ /**
465
+ * Add search plugin options form to each option page
466
+ */
467
+ public function printAllNotices()
468
+ {
469
+ parent::printAllNotices(); // TODO: Change the autogenerated stub
470
+
471
+ if( 'page' === $this->type || !$this->show_search_options_form ) {
472
+ return;
473
+ }
474
  ?>
475
+ <div id="wbcr-factory-clearfy-221__search_options_form" class="wbcr-factory-clearfy-221__autocomplete-wrap">
476
+ <label for="autocomplete" class="wbcr-factory-clearfy-221__autocomplete-label">
477
+ <?php _e('Can\'t find the settings you need? Use the search by the plugin options:', 'wbcr_factory_clearfy_221'); ?>
478
+ </label>
479
+ <input type="text" name="country" id="wbcr-factory-clearfy-221__autocomplete"/>
480
+
481
+ </div>
 
 
 
 
 
 
 
 
 
 
482
  <?php
483
  }
484
  }
libs/factory/core/boot.php CHANGED
@@ -10,53 +10,53 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( defined( 'FACTORY_420_LOADED' ) ) {
18
  return;
19
  }
20
 
21
- define( 'FACTORY_420_LOADED', true );
22
 
23
- define( 'FACTORY_420_VERSION', '4.2.0' );
24
 
25
- define( 'FACTORY_420_DIR', dirname( __FILE__ ) );
26
- define( 'FACTORY_420_URL', plugins_url( null, __FILE__ ) );
27
 
28
- load_plugin_textdomain( 'wbcr_factory_420', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
 
30
  #comp merge
31
- require_once( FACTORY_420_DIR . '/includes/functions.php' );
32
 
33
- require_once( FACTORY_420_DIR . '/includes/entities/class-factory-paths.php' );
34
- require_once( FACTORY_420_DIR . '/includes/entities/class-factory-support.php' );
35
 
36
- require_once( FACTORY_420_DIR . '/includes/class-factory-requests.php' );
37
- require_once( FACTORY_420_DIR . '/includes/class-factory-options.php' );
38
- require_once( FACTORY_420_DIR . '/includes/class-factory-plugin-base.php' );
39
- require_once( FACTORY_420_DIR . '/includes/class-factory-migrations.php' );
40
- require_once( FACTORY_420_DIR . '/includes/class-factory-notices.php' );
41
 
42
  // ASSETS
43
- require_once( FACTORY_420_DIR . '/includes/assets-managment/class-factory-assets-list.php' );
44
- require_once( FACTORY_420_DIR . '/includes/assets-managment/class-factory-script-list.php' );
45
- require_once( FACTORY_420_DIR . '/includes/assets-managment/class-factory-style-list.php' );
46
 
47
  // PREMIUM
48
- require_once( FACTORY_420_DIR . '/includes/premium/class-factory-license-interface.php' );
49
- require_once( FACTORY_420_DIR . '/includes/premium/class-factory-provider-abstract.php' );
50
- require_once( FACTORY_420_DIR . '/includes/premium/class-factory-manager.php' );
51
 
52
  // UPDATES
53
- require_once( FACTORY_420_DIR . '/includes/updates/repositories/class-factory-repository-abstract.php' );
54
- require_once( FACTORY_420_DIR . '/includes/updates/repositories/class-factory-wordpress.php' );
55
- require_once( FACTORY_420_DIR . '/includes/updates/class-factory-upgrader.php' );
56
- require_once( FACTORY_420_DIR . '/includes/updates/class-factory-premium-upgrader.php' );
57
 
58
- require_once( FACTORY_420_DIR . '/includes/class-factory-plugin-abstract.php' );
59
 
60
- require_once( FACTORY_420_DIR . '/includes/activation/class-factory-activator.php' );
61
- require_once( FACTORY_420_DIR . '/includes/activation/class-factory-update.php' );
62
  #endcomp
10
  */
11
 
12
  // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
 
17
+ if( defined('FACTORY_429_LOADED') ) {
18
  return;
19
  }
20
 
21
+ define('FACTORY_429_LOADED', true);
22
 
23
+ define('FACTORY_429_VERSION', '4.2.9');
24
 
25
+ define('FACTORY_429_DIR', dirname(__FILE__));
26
+ define('FACTORY_429_URL', plugins_url(null, __FILE__));
27
 
28
+ load_plugin_textdomain('wbcr_factory_429', false, dirname(plugin_basename(__FILE__)) . '/langs');
29
 
30
  #comp merge
31
+ require_once(FACTORY_429_DIR . '/includes/functions.php');
32
 
33
+ require_once(FACTORY_429_DIR . '/includes/entities/class-factory-paths.php');
34
+ require_once(FACTORY_429_DIR . '/includes/entities/class-factory-support.php');
35
 
36
+ require_once(FACTORY_429_DIR . '/includes/class-factory-requests.php');
37
+ require_once(FACTORY_429_DIR . '/includes/class-factory-options.php');
38
+ require_once(FACTORY_429_DIR . '/includes/class-factory-plugin-base.php');
39
+ require_once(FACTORY_429_DIR . '/includes/class-factory-migrations.php');
40
+ require_once(FACTORY_429_DIR . '/includes/class-factory-notices.php');
41
 
42
  // ASSETS
43
+ require_once(FACTORY_429_DIR . '/includes/assets-managment/class-factory-assets-list.php');
44
+ require_once(FACTORY_429_DIR . '/includes/assets-managment/class-factory-script-list.php');
45
+ require_once(FACTORY_429_DIR . '/includes/assets-managment/class-factory-style-list.php');
46
 
47
  // PREMIUM
48
+ require_once(FACTORY_429_DIR . '/includes/premium/class-factory-license-interface.php');
49
+ require_once(FACTORY_429_DIR . '/includes/premium/class-factory-provider-abstract.php');
50
+ require_once(FACTORY_429_DIR . '/includes/premium/class-factory-manager.php');
51
 
52
  // UPDATES
53
+ require_once(FACTORY_429_DIR . '/includes/updates/repositories/class-factory-repository-abstract.php');
54
+ require_once(FACTORY_429_DIR . '/includes/updates/repositories/class-factory-wordpress.php');
55
+ require_once(FACTORY_429_DIR . '/includes/updates/class-factory-upgrader.php');
56
+ require_once(FACTORY_429_DIR . '/includes/updates/class-factory-premium-upgrader.php');
57
 
58
+ require_once(FACTORY_429_DIR . '/includes/class-factory-plugin-abstract.php');
59
 
60
+ require_once(FACTORY_429_DIR . '/includes/activation/class-factory-activator.php');
61
+ require_once(FACTORY_429_DIR . '/includes/activation/class-factory-update.php');
62
  #endcomp
libs/factory/core/includes/activation/class-factory-activator.php CHANGED
@@ -19,16 +19,16 @@ if ( ! defined( 'ABSPATH' ) ) {
19
  *
20
  * @since 1.0.0
21
  */
22
- abstract class Wbcr_Factory420_Activator {
23
 
24
  /**
25
  * Curent plugin.
26
  *
27
- * @var Wbcr_Factory420_Plugin
28
  */
29
  public $plugin;
30
 
31
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
32
  $this->plugin = $plugin;
33
  }
34
 
19
  *
20
  * @since 1.0.0
21
  */
22
+ abstract class Wbcr_Factory429_Activator {
23
 
24
  /**
25
  * Curent plugin.
26
  *
27
+ * @var Wbcr_Factory429_Plugin
28
  */
29
  public $plugin;
30
 
31
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
32
  $this->plugin = $plugin;
33
  }
34
 
libs/factory/core/includes/activation/class-factory-update.php CHANGED
@@ -20,16 +20,16 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_Factory420_Update {
24
 
25
  /**
26
  * Current plugin
27
  *
28
- * @var Wbcr_Factory420_Plugin
29
  */
30
  var $plugin;
31
 
32
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
33
  $this->plugin = $plugin;
34
  }
35
 
20
  *
21
  * @since 1.0.0
22
  */
23
+ abstract class Wbcr_Factory429_Update {
24
 
25
  /**
26
  * Current plugin
27
  *
28
+ * @var Wbcr_Factory429_Plugin
29
  */
30
  var $plugin;
31
 
32
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
33
  $this->plugin = $plugin;
34
  }
35
 
libs/factory/core/includes/assets-managment/class-factory-assets-list.php CHANGED
@@ -19,7 +19,7 @@ if ( ! defined( 'ABSPATH' ) ) {
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_Factory420_AssetsList {
23
 
24
  protected $all = [];
25
  public $header_place = [];
@@ -29,15 +29,15 @@ class Wbcr_Factory420_AssetsList {
29
  protected $default_place;
30
 
31
  /**
32
- * @var Wbcr_Factory420_Plugin
33
  */
34
  protected $plugin;
35
 
36
  /**
37
- * @param Wbcr_Factory420_Plugin $plugin
38
  * @param bool $defaultIsFooter
39
  */
40
- public function __construct( Wbcr_Factory420_Plugin $plugin, $defaultIsFooter = true ) {
41
  $this->plugin = $plugin;
42
 
43
  if ( $defaultIsFooter ) {
19
  *
20
  * @since 1.0.0
21
  */
22
+ class Wbcr_Factory429_AssetsList {
23
 
24
  protected $all = [];
25
  public $header_place = [];
29
  protected $default_place;
30
 
31
  /**
32
+ * @var Wbcr_Factory429_Plugin
33
  */
34
  protected $plugin;
35
 
36
  /**
37
+ * @param Wbcr_Factory429_Plugin $plugin
38
  * @param bool $defaultIsFooter
39
  */
40
+ public function __construct( Wbcr_Factory429_Plugin $plugin, $defaultIsFooter = true ) {
41
  $this->plugin = $plugin;
42
 
43
  if ( $defaultIsFooter ) {
libs/factory/core/includes/assets-managment/class-factory-script-list.php CHANGED
@@ -20,7 +20,7 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_Factory420_ScriptList extends Wbcr_Factory420_AssetsList {
24
 
25
  public $localize_data = [];
26
  public $use_ajax = false;
@@ -149,7 +149,7 @@ class Wbcr_Factory420_ScriptList extends Wbcr_Factory420_AssetsList {
149
  * @param string $varname
150
  * @param string $data
151
  *
152
- * @return Wbcr_Factory420_ScriptList $this
153
  */
154
  public function localize( $varname, $data ) {
155
  $bindTo = count( $this->all ) == 0 ? null : end( $this->all );
@@ -158,7 +158,8 @@ class Wbcr_Factory420_ScriptList extends Wbcr_Factory420_AssetsList {
158
  return $this;
159
  }
160
 
161
- $this->localize_data[ $bindTo ] = [ $varname, $data ];
 
162
 
163
  return $this;
164
  }
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_Factory429_ScriptList extends Wbcr_Factory429_AssetsList {
24
 
25
  public $localize_data = [];
26
  public $use_ajax = false;
149
  * @param string $varname
150
  * @param string $data
151
  *
152
+ * @return Wbcr_Factory429_ScriptList $this
153
  */
154
  public function localize( $varname, $data ) {
155
  $bindTo = count( $this->all ) == 0 ? null : end( $this->all );
158
  return $this;
159
  }
160
 
161
+ $handle = ! empty( $bindTo['handle'] ) ? $bindTo['handle'] : $bindTo['file_url'];
162
+ $this->localize_data[ $handle ] = [ $varname, $data ];
163
 
164
  return $this;
165
  }
libs/factory/core/includes/assets-managment/class-factory-style-list.php CHANGED
@@ -20,7 +20,7 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_Factory420_StyleList extends Wbcr_Factory420_AssetsList {
24
 
25
  /**
26
  * Adds new items to the collection (default place).
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_Factory429_StyleList extends Wbcr_Factory429_AssetsList {
24
 
25
  /**
26
  * Adds new items to the collection (default place).
libs/factory/core/includes/class-check-compatibility.php CHANGED
@@ -75,19 +75,19 @@ if ( ! class_exists( 'Wbcr_Factory_Compatibility' ) ) {
75
  $notice_text = $notice_default_text = '';
76
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
77
 
78
- $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_212' ), $this->plugin_title ) . ' ';
79
  $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
80
 
81
  $has_one = false;
82
 
83
  if ( ! $this->isPhpCompatibility() ) {
84
  $has_one = true;
85
- $notice_text .= '- ' . sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_420' ), $this->required_php_version ) . '<br>';
86
  }
87
 
88
  if ( ! $this->isWpCompatibility() ) {
89
  $has_one = true;
90
- $notice_text .= '- ' . sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_420' ), $this->required_wp_version ) . '<br>';
91
  }
92
 
93
  if ( $has_one ) {
75
  $notice_text = $notice_default_text = '';
76
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
77
 
78
+ $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_221' ), $this->plugin_title ) . ' ';
79
  $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
80
 
81
  $has_one = false;
82
 
83
  if ( ! $this->isPhpCompatibility() ) {
84
  $has_one = true;
85
+ $notice_text .= '- ' . sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_429' ), $this->required_php_version ) . '<br>';
86
  }
87
 
88
  if ( ! $this->isWpCompatibility() ) {
89
  $has_one = true;
90
+ $notice_text .= '- ' . sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_429' ), $this->required_wp_version ) . '<br>';
91
  }
92
 
93
  if ( $has_one ) {
libs/factory/core/includes/class-factory-migrations.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420;
4
 
5
  use Exception;
6
- use Wbcr_Factory420_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
@@ -35,11 +35,11 @@ class Migrations {
35
  /**
36
  * Migrations constructor.
37
  *
38
- * @param Wbcr_Factory420_Plugin $plugin
39
  *
40
  * @throws Exception
41
  */
42
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
43
 
44
  $this->plugin = $plugin;
45
  $plugin_name = $plugin->getPluginName();
@@ -129,14 +129,14 @@ class Migrations {
129
  $fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
130
 
131
  $notice_text = $migration_error_text;
132
- $notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', 'wbcr_factory_420' ) . "</a>";
133
 
134
  $notices[] = [
135
  'id' => 'migration_debug_bar',
136
  'type' => 'error',
137
  'dismissible' => false,
138
  'dismiss_expires' => 0,
139
- 'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', 'wbcr_factory_420' ) . '</b><br>' . $notice_text . '</p>'
140
  ];
141
 
142
  return $notices;
@@ -162,19 +162,19 @@ class Migrations {
162
 
163
  $migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
164
 
165
- $notice_text = __( "Plugin activated:", "wbcr_factory_420" ) . ' ' . date( "Y-m-d H:i:s", $this->get_plugin_activated_time() ) . "<br>";
166
 
167
- $notice_text .= __( "Old plugin version (debug):", "wbcr_factory_420" ) . ' ' . $this->get_old_plugin_version() . "<br>";
168
- $notice_text .= __( "Current plugin version:", "wbcr_factory_420" ) . ' ' . $this->get_current_plugin_version() . "<br>";
169
- $notice_text .= __( "Need migration:", "wbcr_factory_420" ) . ' ' . ( $this->need_migration() ? "true" : "false" ) . "<br><br>";
170
- $notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "wbcr_factory_420" ) . "</a><br>";
171
 
172
  $notices[] = [
173
  'id' => 'migration_debug_bar',
174
  'type' => 'warning',
175
  'dismissible' => false,
176
  'dismiss_expires' => 0,
177
- 'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', 'wbcr_factory_420' ) . '</b><br>' . $notice_text . '</p>'
178
  ];
179
 
180
  return $notices;
@@ -505,7 +505,7 @@ class Migrations {
505
  $classes = [];
506
 
507
  if ( ! function_exists( 'token_get_all' ) ) {
508
- throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', 'wbcr_factory_420' ) );
509
  }
510
 
511
  $tokens = token_get_all( $phpCode );
1
  <?php
2
 
3
+ namespace WBCR\Factory_429;
4
 
5
  use Exception;
6
+ use Wbcr_Factory429_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
35
  /**
36
  * Migrations constructor.
37
  *
38
+ * @param Wbcr_Factory429_Plugin $plugin
39
  *
40
  * @throws Exception
41
  */
42
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
43
 
44
  $this->plugin = $plugin;
45
  $plugin_name = $plugin->getPluginName();
129
  $fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
130
 
131
  $notice_text = $migration_error_text;
132
+ $notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', 'wbcr_factory_429' ) . "</a>";
133
 
134
  $notices[] = [
135
  'id' => 'migration_debug_bar',
136
  'type' => 'error',
137
  'dismissible' => false,
138
  'dismiss_expires' => 0,
139
+ 'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', 'wbcr_factory_429' ) . '</b><br>' . $notice_text . '</p>'
140
  ];
141
 
142
  return $notices;
162
 
163
  $migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
164
 
165
+ $notice_text = __( "Plugin activated:", "wbcr_factory_429" ) . ' ' . date( "Y-m-d H:i:s", $this->get_plugin_activated_time() ) . "<br>";
166
 
167
+ $notice_text .= __( "Old plugin version (debug):", "wbcr_factory_429" ) . ' ' . $this->get_old_plugin_version() . "<br>";
168
+ $notice_text .= __( "Current plugin version:", "wbcr_factory_429" ) . ' ' . $this->get_current_plugin_version() . "<br>";
169
+ $notice_text .= __( "Need migration:", "wbcr_factory_429" ) . ' ' . ( $this->need_migration() ? "true" : "false" ) . "<br><br>";
170
+ $notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "wbcr_factory_429" ) . "</a><br>";
171
 
172
  $notices[] = [
173
  'id' => 'migration_debug_bar',
174
  'type' => 'warning',
175
  'dismissible' => false,
176
  'dismiss_expires' => 0,
177
+ 'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', 'wbcr_factory_429' ) . '</b><br>' . $notice_text . '</p>'
178
  ];
179
 
180
  return $notices;
505
  $classes = [];
506
 
507
  if ( ! function_exists( 'token_get_all' ) ) {
508
+ throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', 'wbcr_factory_429' ) );
509
  }
510
 
511
  $tokens = token_get_all( $phpCode );
libs/factory/core/includes/class-factory-notices.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420;
4
 
5
- use Wbcr_Factory420_Plugin;
6
 
7
  // Exit if accessed directly
8
- if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
10
  }
11
 
@@ -27,7 +27,7 @@ if ( ! defined( 'ABSPATH' ) ) {
27
  class Notices {
28
 
29
  /**
30
- * @var Wbcr_Factory420_Plugin
31
  */
32
  protected $plugin;
33
  /**
@@ -58,22 +58,23 @@ class Notices {
58
  /**
59
  * Инициализируем уведомлений сразу после загрузки модуля уведомлений
60
  *
61
- * @param Wbcr_Factory420_Plugin $plugin
62
  */
63
- public function __construct( $plugin ) {
 
64
  //default notices
65
  //---
66
 
67
- $this->plugin = $plugin;
68
- $this->dissmised_notices = $this->plugin->getPopulateOption( 'factory_dismissed_notices', [] );
69
 
70
- add_action( 'current_screen', [ $this, 'currentScreenAction' ] );
71
 
72
- if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
73
- add_action( 'wp_ajax_' . $this->plugin->getPluginName() . '_dismiss_notice', [
74
  $this,
75
  'dismiss_notice'
76
- ] );
77
  }
78
  }
79
 
@@ -82,51 +83,37 @@ class Notices {
82
  * Уведомления собираются через фильтр wbcr_factory_admin_notices, если в массиве уведомлений,
83
  * хотя бы одно, соответствует условиям в параметре $notice['where'], то метод печает вспомогательные скрипты и уведомления.
84
  */
85
- public function currentScreenAction() {
 
86
  /**
87
- * @since 2.1.2 - является устаревшим
88
  */
89
- $this->notices = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_notices_000_list', [
90
- $this->notices,
91
- $this->plugin->getPluginName(),
92
- ], '2.1.2', 'wbcr/factory/admin_notices' );
93
 
94
- /**
95
- * @since 2.1.2 - Добавлен, модуль factory_notices_000 был удален. Поэтому в этому хуке мы заменили префикс на factory_420
96
- */
97
- $this->notices = apply_filters( 'wbcr/factory/admin_notices', $this->notices, $this->plugin->getPluginName() );
98
-
99
- if ( count( $this->notices ) == 0 ) {
100
  return;
101
  }
102
 
103
  $screen = get_current_screen();
104
 
105
  $has_notices = false;
106
- foreach ( (array) $this->notices as $notice ) {
107
- if ( ! isset( $notice['id'] ) ) {
108
  continue;
109
  }
110
 
111
- $where = ! isset( $notice['where'] ) || empty( $notice['where'] ) ? $this->default_where : $notice['where'];
112
 
113
- if ( in_array( $screen->base, $where ) && ! $this->is_dissmissed( $notice['id'] ) ) {
114
  $has_notices = true;
115
  break;
116
  };
117
  }
118
 
119
- if ( $has_notices ) {
120
- add_action( 'admin_footer', [ $this, 'print_js_code' ] );
121
 
122
- if ( $this->plugin->isNetworkActive() ) {
123
- if ( current_user_can( 'manage_network' ) ) {
124
- add_action( 'network_admin_notices', [ $this, 'show_notices' ] );
125
- add_action( 'admin_notices', [ $this, 'show_notices' ] );
126
- }
127
- } else {
128
- add_action( 'admin_notices', [ $this, 'show_notices' ] );
129
- }
130
  }
131
  }
132
 
@@ -135,27 +122,41 @@ class Notices {
135
  * Уведомления показываются только на определенных страницах через параметр $notice['where'],
136
  * если уведомление ранее было скрыто или не соотвествует правилам $notice['where'], оно не будет показано!
137
  */
138
- public function show_notices() {
139
- if ( count( $this->notices ) == 0 ) {
 
140
  return;
141
  }
142
 
143
- if ( ! current_user_can( 'activate_plugins' ) || ! current_user_can( 'edit_plugins' ) || ! current_user_can( 'install_plugins' ) ) {
144
  return;
145
  }
146
 
147
  $screen = get_current_screen();
148
 
149
- foreach ( $this->notices as $notice ) {
150
 
151
- if ( ! isset( $notice['id'] ) ) {
152
  continue;
153
  }
154
 
155
- $where = ! isset( $notice['where'] ) || empty( $notice['where'] ) ? $this->default_where : $notice['where'];
156
-
157
- if ( in_array( $screen->base, $where ) && ! $this->is_dissmissed( $notice['id'] ) ) {
158
- $this->show_notice( $notice );
 
 
 
 
 
 
 
 
 
 
 
 
 
159
  };
160
  }
161
  }
@@ -163,7 +164,7 @@ class Notices {
163
  /**
164
  * Показывает уведомление, по переданным параметрам
165
  *
166
- * @param array $data - Параметры уведомления
167
  * $data['id'] - Индентификатор уведомления
168
  * $data['type'] - Тип уведомления (error, warning, success)
169
  * $notice['where'] - На каких страницах показывать уведомление ('plugins', 'dashboard', 'edit')
@@ -173,36 +174,37 @@ class Notices {
173
  * Пример time() + 3600 (1ч), уведомление будет скрыто на 1 час.
174
  * $data['classes'] - Произвольный классы для контейнера уведомления.
175
  */
176
- public function show_notice( $data ) {
177
- $settings = wp_parse_args( $data, [
178
- 'id' => null,
179
- 'text' => null,
180
- 'type' => 'error',
181
- 'dismissible' => false,
 
182
  'dismiss_expires' => 0,
183
- 'classes' => []
184
- ] );
185
 
186
- if ( empty( $settings['id'] ) || empty( $settings['text'] ) ) {
187
  return;
188
  }
189
 
190
- $plugin_name = str_replace( '_', '-', $this->plugin->getPluginName() );
191
 
192
- $classes = array_merge( [
193
  'notice',
194
  'notice-' . $settings['type'],
195
  $plugin_name . '-factory-notice'
196
- ], $settings['classes'] );
197
 
198
- if ( $settings['dismissible'] ) {
199
  $classes[] = 'is-dismissible';
200
  $classes[] = $plugin_name . '-factory-notice-dismiss';
201
  }
202
  ?>
203
- <div data-name="wbcr_factory_notice_<?php echo esc_attr( $data['id'] ) ?>" data-expires="<?= esc_attr( $settings['dismiss_expires'] ) ?>" data-nonce="<?php echo wp_create_nonce( $this->plugin->getPluginName() . '_factory_dismiss_notice' ); ?>" class="<?php echo esc_attr( implode( ' ', $classes ) ) ?>">
204
  <?= $data['text'] ?>
205
- </div>
206
  <?php
207
  }
208
 
@@ -210,37 +212,38 @@ class Notices {
210
  * Когда пользователь нажимает кнопку закрыть уведомление,
211
  * отправляется ajax запрос с вызовом текущего метода
212
  */
213
- public function dismiss_notice() {
214
- if ( ! current_user_can( 'activate_plugins' ) || ! current_user_can( 'edit_plugins' ) || ! current_user_can( 'install_plugins' ) ) {
215
- wp_die( - 1, 403 );
 
216
  }
217
 
218
- check_admin_referer( $this->plugin->getPluginName() . '_factory_dismiss_notice', 'nonce' );
219
 
220
  // Имя уведомления (идентификатор)
221
- $name = $this->plugin->request->post( 'name', null, true );
222
 
223
  // Время в Unix timestamp, по истечению, которого уведомление снова будет показано
224
  // Если передан 0, то уведомление будет скрыто навсегда
225
- $expires = $this->plugin->request->post( 'expires', 0, 'intval' );
226
 
227
- if ( empty( $name ) ) {
228
- wp_send_json_error( [ 'error_message' => 'You must pass the notification "Name"! Action was rejected.' ] );
229
  }
230
 
231
- $notices = $this->plugin->getPopulateOption( "factory_dismissed_notices", [] );
232
 
233
- if ( ! empty( $notices ) ) {
234
- foreach ( (array) $notices as $notice_id => $notice_expires ) {
235
- if ( $notice_expires !== 0 && $notice_expires < time() ) {
236
- unset( $notices[ $notice_id ] );
237
  }
238
  }
239
  }
240
 
241
- $notices[ $name ] = $expires;
242
 
243
- $this->plugin->updatePopulateOption( 'factory_dismissed_notices', $notices );
244
 
245
  wp_send_json_success();
246
  }
@@ -250,11 +253,12 @@ class Notices {
250
  * Печает в подвале страницы код, для взаимодействия с сервером через ajax,
251
  * код используется при нажатии на кнопку закрыть уведомление. *
252
  */
253
- public function print_js_code() {
254
- $plugin_name = str_replace( '_', '-', $this->plugin->getPluginName() );
 
255
 
256
  ?>
257
- <script type="text/javascript">
258
  jQuery(function($) {
259
 
260
  $(document).on('click', '.<?php echo $plugin_name; ?>-factory-notice-dismiss .notice-dismiss', function() {
@@ -267,7 +271,7 @@ class Notices {
267
  });
268
 
269
  });
270
- </script>
271
  <?php
272
  }
273
 
@@ -275,13 +279,14 @@ class Notices {
275
  /**
276
  * Проверяет скрыто уведоление или нет
277
  *
278
- * @param string $notice_id - имя уведомления
279
  *
280
  * @return bool
281
  */
282
- protected function is_dissmissed( $notice_id ) {
283
- if ( ! empty( $this->dissmised_notices ) && isset( $this->dissmised_notices[ 'wbcr_factory_notice_' . $notice_id ] ) ) {
284
- $expires = (int) $this->dissmised_notices[ 'wbcr_factory_notice_' . $notice_id ];
 
285
 
286
  return $expires === 0 || $expires > time();
287
  }
1
  <?php
2
 
3
+ namespace WBCR\Factory_429;
4
 
5
+ use Wbcr_Factory429_Plugin;
6
 
7
  // Exit if accessed directly
8
+ if( !defined('ABSPATH') ) {
9
  exit;
10
  }
11
 
27
  class Notices {
28
 
29
  /**
30
+ * @var Wbcr_Factory429_Plugin
31
  */
32
  protected $plugin;
33
  /**
58
  /**
59
  * Инициализируем уведомлений сразу после загрузки модуля уведомлений
60
  *
61
+ * @param Wbcr_Factory429_Plugin $plugin
62
  */
63
+ public function __construct($plugin)
64
+ {
65
  //default notices
66
  //---
67
 
68
+ $this->plugin = $plugin;
69
+ $this->dissmised_notices = $this->plugin->getPopulateOption('factory_dismissed_notices', []);
70
 
71
+ add_action('current_screen', [$this, 'currentScreenAction']);
72
 
73
+ if( defined('DOING_AJAX') && DOING_AJAX ) {
74
+ add_action('wp_ajax_' . $this->plugin->getPluginName() . '_dismiss_notice', [
75
  $this,
76
  'dismiss_notice'
77
+ ]);
78
  }
79
  }
80
 
83
  * Уведомления собираются через фильтр wbcr_factory_admin_notices, если в массиве уведомлений,
84
  * хотя бы одно, соответствует условиям в параметре $notice['where'], то метод печает вспомогательные скрипты и уведомления.
85
  */
86
+ public function currentScreenAction()
87
+ {
88
  /**
89
+ * @since 2.1.2 - Добавлен, модуль factory_notices_000 был удален. Поэтому в этому хуке мы заменили префикс на factory_429
90
  */
91
+ $this->notices = apply_filters('wbcr/factory/admin_notices', $this->notices, $this->plugin->getPluginName());
 
 
 
92
 
93
+ if( count($this->notices) == 0 ) {
 
 
 
 
 
94
  return;
95
  }
96
 
97
  $screen = get_current_screen();
98
 
99
  $has_notices = false;
100
+ foreach((array)$this->notices as $notice) {
101
+ if( !isset($notice['id']) ) {
102
  continue;
103
  }
104
 
105
+ $where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
106
 
107
+ if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
108
  $has_notices = true;
109
  break;
110
  };
111
  }
112
 
113
+ if( $has_notices ) {
114
+ add_action('admin_footer', [$this, 'print_js_code']);
115
 
116
+ $this->show_notices();
 
 
 
 
 
 
 
117
  }
118
  }
119
 
122
  * Уведомления показываются только на определенных страницах через параметр $notice['where'],
123
  * если уведомление ранее было скрыто или не соотвествует правилам $notice['where'], оно не будет показано!
124
  */
125
+ public function show_notices()
126
+ {
127
+ if( count($this->notices) == 0 ) {
128
  return;
129
  }
130
 
131
+ if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
132
  return;
133
  }
134
 
135
  $screen = get_current_screen();
136
 
137
+ foreach($this->notices as $notice) {
138
 
139
+ if( !isset($notice['id']) ) {
140
  continue;
141
  }
142
 
143
+ $where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
144
+
145
+ if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
146
+ if( $this->plugin->isNetworkActive() ) {
147
+ if( current_user_can('manage_network') ) {
148
+ add_action('network_admin_notices', function () use ($notice) {
149
+ $this->show_notice($notice);
150
+ });
151
+ add_action('admin_notices', function () use ($notice) {
152
+ $this->show_notice($notice);
153
+ });
154
+ }
155
+ } else {
156
+ add_action('admin_notices', function () use ($notice) {
157
+ $this->show_notice($notice);
158
+ });
159
+ }
160
  };
161
  }
162
  }
164
  /**
165
  * Показывает уведомление, по переданным параметрам
166
  *
167
+ * @param array $data - Параметры уведомления
168
  * $data['id'] - Индентификатор уведомления
169
  * $data['type'] - Тип уведомления (error, warning, success)
170
  * $notice['where'] - На каких страницах показывать уведомление ('plugins', 'dashboard', 'edit')
174
  * Пример time() + 3600 (1ч), уведомление будет скрыто на 1 час.
175
  * $data['classes'] - Произвольный классы для контейнера уведомления.
176
  */
177
+ public function show_notice($data)
178
+ {
179
+ $settings = wp_parse_args($data, [
180
+ 'id' => null,
181
+ 'text' => null,
182
+ 'type' => 'error',
183
+ 'dismissible' => false,
184
  'dismiss_expires' => 0,
185
+ 'classes' => []
186
+ ]);
187
 
188
+ if( empty($settings['id']) || empty($settings['text']) ) {
189
  return;
190
  }
191
 
192
+ $plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
193
 
194
+ $classes = array_merge([
195
  'notice',
196
  'notice-' . $settings['type'],
197
  $plugin_name . '-factory-notice'
198
+ ], $settings['classes']);
199
 
200
+ if( $settings['dismissible'] ) {
201
  $classes[] = 'is-dismissible';
202
  $classes[] = $plugin_name . '-factory-notice-dismiss';
203
  }
204
  ?>
205
+ <div data-name="wbcr_factory_notice_<?php echo esc_attr($data['id']) ?>" data-expires="<?= esc_attr($settings['dismiss_expires']) ?>" data-nonce="<?php echo wp_create_nonce($this->plugin->getPluginName() . '_factory_dismiss_notice'); ?>" class="<?php echo esc_attr(implode(' ', $classes)) ?>">
206
  <?= $data['text'] ?>
207
+ </div>
208
  <?php
209
  }
210
 
212
  * Когда пользователь нажимает кнопку закрыть уведомление,
213
  * отправляется ajax запрос с вызовом текущего метода
214
  */
215
+ public function dismiss_notice()
216
+ {
217
+ if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
218
+ wp_die(-1, 403);
219
  }
220
 
221
+ check_admin_referer($this->plugin->getPluginName() . '_factory_dismiss_notice', 'nonce');
222
 
223
  // Имя уведомления (идентификатор)
224
+ $name = $this->plugin->request->post('name', null, true);
225
 
226
  // Время в Unix timestamp, по истечению, которого уведомление снова будет показано
227
  // Если передан 0, то уведомление будет скрыто навсегда
228
+ $expires = $this->plugin->request->post('expires', 0, 'intval');
229
 
230
+ if( empty($name) ) {
231
+ wp_send_json_error(['error_message' => 'You must pass the notification "Name"! Action was rejected.']);
232
  }
233
 
234
+ $notices = $this->plugin->getPopulateOption("factory_dismissed_notices", []);
235
 
236
+ if( !empty($notices) ) {
237
+ foreach((array)$notices as $notice_id => $notice_expires) {
238
+ if( $notice_expires !== 0 && $notice_expires < time() ) {
239
+ unset($notices[$notice_id]);
240
  }
241
  }
242
  }
243
 
244
+ $notices[$name] = $expires;
245
 
246
+ $this->plugin->updatePopulateOption('factory_dismissed_notices', $notices);
247
 
248
  wp_send_json_success();
249
  }
253
  * Печает в подвале страницы код, для взаимодействия с сервером через ajax,
254
  * код используется при нажатии на кнопку закрыть уведомление. *
255
  */
256
+ public function print_js_code()
257
+ {
258
+ $plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
259
 
260
  ?>
261
+ <script type="text/javascript">
262
  jQuery(function($) {
263
 
264
  $(document).on('click', '.<?php echo $plugin_name; ?>-factory-notice-dismiss .notice-dismiss', function() {
271
  });
272
 
273
  });
274
+ </script>
275
  <?php
276
  }
277
 
279
  /**
280
  * Проверяет скрыто уведоление или нет
281
  *
282
+ * @param string $notice_id - имя уведомления
283
  *
284
  * @return bool
285
  */
286
+ protected function is_dissmissed($notice_id)
287
+ {
288
+ if( !empty($this->dissmised_notices) && isset($this->dissmised_notices['wbcr_factory_notice_' . $notice_id]) ) {
289
+ $expires = (int)$this->dissmised_notices['wbcr_factory_notice_' . $notice_id];
290
 
291
  return $expires === 0 || $expires > time();
292
  }
libs/factory/core/includes/class-factory-options.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420;
4
 
5
  // Exit if accessed directly
6
  use Exception;
@@ -10,7 +10,7 @@ if ( ! defined( 'ABSPATH' ) ) {
10
  }
11
 
12
  /**
13
- * Трейт используется для расширения базового класса плагина Wbcr_Factory420_Base, позволяя работать с опциями плагина.
14
  *
15
  * Этот трейт является оберткой для Wordpress функций get_option, get_site_option, update_option, update_site_option,
16
  * delete_option, delete_site_option. Основная задача была получать, обновлять, удалять опции без использования префиксов,
1
  <?php
2
 
3
+ namespace WBCR\Factory_429;
4
 
5
  // Exit if accessed directly
6
  use Exception;
10
  }
11
 
12
  /**
13
+ * Трейт используется для расширения базового класса плагина Wbcr_Factory429_Base, позволяя работать с опциями плагина.
14
  *
15
  * Этот трейт является оберткой для Wordpress функций get_option, get_site_option, update_option, update_site_option,
16
  * delete_option, delete_site_option. Основная задача была получать, обновлять, удалять опции без использования префиксов,
libs/factory/core/includes/class-factory-plugin-abstract.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  // Exit if accessed directly
3
- if ( ! defined( 'ABSPATH' ) ) {
4
  exit;
5
  }
6
 
@@ -24,42 +24,42 @@ if ( ! defined( 'ABSPATH' ) ) {
24
  * @package factory-core
25
  *
26
  */
27
- abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
28
 
29
  /**
30
- * Instance class Wbcr_Factory420_Request, required manages http requests
31
  *
32
  * @see https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/390561806
33
- * @var Wbcr_Factory420_Request
34
  */
35
  public $request;
36
 
37
  /**
38
  * @see https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/393936924
39
- * @var \WBCR\Factory_420\Premium\Provider
40
  */
41
  public $premium;
42
 
43
  /**
44
  * The Bootstrap Manager class
45
  *
46
- * @var Wbcr_FactoryBootstrap421_Manager
47
  */
48
  public $bootstrap;
49
 
50
  /**
51
  * The Bootstrap Manager class
52
  *
53
- * @var Wbcr_FactoryForms418_Manager
54
  */
55
  public $forms;
56
 
57
  /**
58
- * Простой массив со списком зарегистрированных классов унаследованных от Wbcr_Factory420_Activator.
59
  * Классы активации используются для упаковки набора функций, которые нужно выполнить во время
60
  * активации плагина.
61
  *
62
- * @var array[] Wbcr_Factory420_Activator
63
  */
64
  protected $activator_class = [];
65
 
@@ -75,36 +75,39 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
75
  * Ассоциативный массив со списком аддонов плагина. Аддоны плагина являются частью одного проекта,
76
  * но не как отдельный плагин.
77
  *
78
- * @var array[] Wbcr_Factory420_Plugin
 
 
79
  */
80
- private $plugin_addons;
81
 
82
  /**
83
  * The Adverts Manager class
84
  *
85
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
86
  * @since 4.1.9
87
- * @var WBCR\Factory_Adverts_102\Base
88
  */
89
  private $adverts;
90
 
91
  /**
92
  * Инициализирует компоненты фреймворка и плагина.
93
  *
94
- * @since 1.0.0
95
- *
96
- * @param array $data A set of plugin data.
97
  *
98
- * @param string $plugin_path A full path to the main plugin file.
99
  *
100
  * @throws Exception
 
 
101
  */
102
- public function __construct( $plugin_path, $data ) {
 
103
 
104
- parent::__construct( $plugin_path, $data );
105
 
106
- $this->request = new Wbcr_Factory420_Request();
107
- //$this->route = new Wbcr_Factory420_Route();
108
 
109
  // INIT PLUGIN FRAMEWORK MODULES
110
  // Framework modules should always be loaded first,
@@ -127,27 +130,29 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
127
 
128
  // init actions
129
  $this->register_plugin_hooks();
130
- }
131
 
132
- /* Services region
133
- /* -------------------------------------------------------------*/
 
134
 
135
  /**
136
  * Устанавливает класс менеджер, которому плагин будет делегировать подключение ресурсов (картинок,
137
  * скриптов, стилей) фреймворка.
138
  *
139
- * @param Wbcr_FactoryBootstrap421_Manager $bootstrap
140
  */
141
- public function setBootstap( Wbcr_FactoryBootstrap421_Manager $bootstrap ) {
 
142
  $this->bootstrap = $bootstrap;
143
  }
144
 
145
  /**
146
  * Устанавливает класс менеджер, которому будет делегирована работа с html формами фреймворка.
147
  *
148
- * @param Wbcr_FactoryForms418_Manager $forms
149
  */
150
- public function setForms( Wbcr_FactoryForms418_Manager $forms ) {
 
151
  $this->forms = $forms;
152
  }
153
 
@@ -157,9 +162,10 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
157
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
158
  * @since 4.1.9
159
  */
160
- public function set_adverts_manager( $class_name ) {
161
- if ( empty( $this->adverts ) && $this->render_adverts ) {
162
- $this->adverts = new $class_name( $this, $this->adverts_settings );
 
163
  }
164
  }
165
 
@@ -169,14 +175,16 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
169
  * С помощью этого класса, мы проверяем валидность лицензий и получаем дополнительную информацию
170
  * о лицензии и ее покупателе. Класс используется в премиум менеджере.
171
  *
 
 
 
172
  * @since 4.1.6 - Добавлен
173
  *
174
- * @param string $name Имя провайдер
175
- * @param string $class_name Имя класса провайдера
176
  */
177
- public function set_license_provider( $name, $class_name ) {
178
- if ( ! isset( WBCR\Factory_420\Premium\Manager::$providers[ $name ] ) ) {
179
- WBCR\Factory_420\Premium\Manager::$providers[ $name ] = $class_name;
 
180
  }
181
  }
182
 
@@ -186,14 +194,16 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
186
  * С помощью этого класса мы реализиуем доставку и откат обновлений плагина, на сайт пользователя.
187
  * Скачиваение премиум версий происходит по защенному каналу. Класс используется в менеджере обновлений.
188
  *
 
 
 
189
  * @since 4.1.7 - Добавлен
190
  *
191
- * @param string $name Имя репозитория
192
- * @param string $class_name Имя класса репозитория
193
  */
194
- public function set_update_repository( $name, $class_name ) {
195
- if ( ! isset( WBCR\Factory_420\Updates\Upgrader::$repositories[ $name ] ) ) {
196
- WBCR\Factory_420\Updates\Upgrader::$repositories[ $name ] = $class_name;
 
197
  }
198
  }
199
 
@@ -203,11 +213,12 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
203
  * Доступен глобально через метод app(), чаще всего используется для создания точек для ротации
204
  * рекламных объявлений.
205
  *
206
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
207
  * @since 1.1
208
- * @return \WBCR\Factory_Adverts_102\Base
209
  */
210
- public function get_adverts_manager() {
 
211
  return $this->adverts;
212
  }
213
 
@@ -215,29 +226,41 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
215
  * Устанавливает текстовый домен для плагина. Текстовый домен берется из заголовка входного
216
  * файла плагина.
217
  *
 
218
  * @since 4.0.8 - Добавлен
219
  *
220
  * @see https://codex.wordpress.org/I18n_for_WordPress_Developers
221
  * @see https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828 - документация по входному файлу
222
  */
223
- public function set_text_domain() {
224
- if ( empty( $this->plugin_text_domain ) ) {
 
225
  return;
226
  }
227
 
228
- $locale = apply_filters( 'plugin_locale', is_admin() ? get_user_locale() : get_locale(), $this->plugin_text_domain );
229
 
230
- $mofile = $this->plugin_text_domain . '-' . $locale . '.mo';
231
 
232
- if ( ! load_textdomain( $this->plugin_text_domain, $this->paths->absolute . '/languages/' . $mofile ) ) {
233
- load_muplugin_textdomain( $this->plugin_text_domain );
234
  }
235
  }
236
 
 
 
 
 
 
 
 
 
 
 
237
  /**
238
  * Все страницы плагина создаются через специальную обертку, за которую отвечает модуль
239
  * фреймворка pages. Разработчик создает собственный класс, унаследованный от
240
- * Wbcr_FactoryPages420_AdminPage, а затем регистрирует его через этот метод.
241
  * Метод выполняет подключение класса страницы и регистрирует его в модуле фреймворка
242
  * pages.
243
  *
@@ -246,33 +269,34 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
246
  *
247
  * @see https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/222887949 - документация по созданию страниц
248
  *
249
- * @param string $class_name Имя регистрируемого класса страницы. Пример: WCL_Page_Name.
250
- * Регистрируемый класс должен быть унаследован от класса Wbcr_FactoryPages420_AdminPage.
251
- * @param string $file_path Абсолютный путь к файлу с классом страницы.
252
  *
253
  * @throws Exception
254
  */
255
- public function registerPage( $class_name, $file_path ) {
 
256
  // todo: https://webcraftic.atlassian.net/projects/PCS/issues/PCS-88
257
  // if ( $this->isNetworkActive() && ! is_network_admin() ) {
258
  // return;
259
  // }
260
 
261
- if ( ! file_exists( $file_path ) ) {
262
- throw new Exception( 'The page file was not found by the path {' . $file_path . '} you set.' );
263
  }
264
 
265
- require_once( $file_path );
266
 
267
- if ( ! class_exists( $class_name ) ) {
268
- throw new Exception( 'A class with this name {' . $class_name . '} does not exist.' );
269
  }
270
 
271
- if ( ! class_exists( 'Wbcr_FactoryPages420' ) ) {
272
- throw new Exception( 'The factory_pages_420 module is not included.' );
273
  }
274
 
275
- Wbcr_FactoryPages420::register( $this, $class_name );
276
  }
277
 
278
  /**
@@ -281,27 +305,29 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
281
  * Wbcr_FactoryTypes000_Type, а затем регистрирует его через этот метод. Метод выполняет
282
  * подключение класса с новым типом записи и регистрирует его в модуле фреймворка types. *
283
  *
284
- * @param string $class_name Имя регистрируемого класса страницы. Пример: WCL_Type_Name.
285
  * Регистрируемый класс должен быть унаследован от класса Wbcr_FactoryTypes000_Type.
286
- * @param string $file_path Абсолютный путь к файлу с классом страницы.
287
  *
288
  * @throws Exception
289
  * @deprecated 4.1.7 You cannot use it!
290
  */
291
- public function registerType( $class_name, $file_path ) {
292
- throw new Exception( 'As of factory core module 4.1.7, the "registerType" method is deprecated. You cannot use it!' );
 
293
  }
294
 
295
  /**
296
  * Registers a class to activate the plugin.
297
  *
298
- * @since 1.0.0
299
- *
300
- * @param string $className class name of the plugin activator.
301
  *
302
  * @return void
 
 
303
  */
304
- public function registerActivation( $className ) {
 
305
  $this->activator_class[] = $className;
306
  }
307
 
@@ -311,71 +337,72 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
311
  /**
312
  * It's invoked on plugin activation. Don't excite it directly.
313
  *
314
- * @since 1.0.0
315
  * @return void
 
316
  */
317
- public function activation_hook() {
 
318
 
319
  /**
320
  * @since 4.1.1 - change hook name
321
  */
322
- if ( apply_filters( "wbcr/factory_420/cancel_plugin_activation_{$this->plugin_name}", false ) ) {
323
  return;
324
  }
325
 
326
  /**
327
- * wbcr_factory_420_plugin_activation
328
  *
329
  * @since 4.1.1 - deprecated
330
  */
331
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_plugin_activation', [
332
  $this
333
- ], '4.1.1', "wbcr/factory/plugin_activation" );
334
 
335
  /**
336
  * wbcr/factory/plugin_activation
337
  *
338
  * @since 4.1.2 - deprecated
339
  */
340
- wbcr_factory_420_do_action_deprecated( 'wbcr/factory/plugin_activation', [
341
  $this
342
- ], '4.1.2', "wbcr/factory/before_plugin_activation" );
343
 
344
  /**
345
  * wbcr/factory/before_plugin_activation
346
  *
347
  * @since 4.1.2 - added
348
  */
349
- do_action( 'wbcr/factory/before_plugin_activation', $this );
350
 
351
  /**
352
  * # wbcr/factory/plugin_{$this->plugin_name}_activation
353
  *
354
  * @since 4.1.2 - deprecated
355
  */
356
- wbcr_factory_420_do_action_deprecated( "wbcr/factory/plugin_{$this->plugin_name}_activation", [
357
  $this
358
- ], '4.1.2', "wbcr/factory/before_plugin_{$this->plugin_name}_activation" );
359
 
360
  /**
361
- * wbcr_factory_420_plugin_activation_' . $this->plugin_name
362
  *
363
  * @since 4.1.1 - deprecated
364
  */
365
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_plugin_activation_' . $this->plugin_name, [
366
  $this
367
- ], '4.1.1', "wbcr/factory/before_plugin_{$this->plugin_name}_activation" );
368
 
369
  /**
370
  * wbcr/factory/plugin_{$this->plugin_name}_activation
371
  *
372
  * @since 4.1.2 - added
373
  */
374
- do_action( "wbcr/factory/plugin_{$this->plugin_name}_activation", $this );
375
 
376
- if ( ! empty( $this->activator_class ) ) {
377
- foreach ( (array) $this->activator_class as $activator_class ) {
378
- $activator = new $activator_class( $this );
379
  $activator->activate();
380
  }
381
  }
@@ -383,80 +410,81 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
383
  /**
384
  * @since 4.1.2 - added
385
  */
386
- do_action( 'wbcr/factory/plugin_activated', $this );
387
 
388
  /**
389
  * @since 4.1.2 - added
390
  */
391
- do_action( "wbcr/factory/plugin_{$this->plugin_name}_activated", $this );
392
  }
393
 
394
  /**
395
  * It's invoked on plugin deactionvation. Don't excite it directly.
396
  *
397
- * @since 1.0.0
398
  * @return void
 
399
  */
400
- public function deactivation_hook() {
 
401
 
402
  /**
403
  * @since 4.1.1 - change hook name
404
  */
405
- if ( apply_filters( "wbcr/factory_420/cancel_plugin_deactivation_{$this->plugin_name}", false ) ) {
406
  return;
407
  }
408
 
409
  /**
410
- * wbcr_factory_420_plugin_deactivation
411
  *
412
  * @since 4.1.1 - deprecated
413
  */
414
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_plugin_deactivation', [
415
  $this
416
- ], '4.1.1', "wbcr/factory/plugin_deactivation" );
417
 
418
  /**
419
  * wbcr/factory/plugin_deactivation
420
  *
421
  * @since 4.1.2 - deprecated
422
  */
423
- wbcr_factory_420_do_action_deprecated( 'wbcr/factory/plugin_deactivation', [
424
  $this
425
- ], '4.1.2', "wbcr/factory/before_plugin_deactivation" );
426
 
427
  /**
428
  * wbcr/factory/plugin_deactivation
429
  *
430
  * @since 4.1.2 - added
431
  */
432
- do_action( 'wbcr/factory/plugin_deactivation', $this );
433
 
434
  /**
435
- * wbcr_factory_420_plugin_deactivation_ . $this->plugin_name
436
  *
437
  * @since 4.1.1 - deprecated
438
  */
439
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_plugin_deactivation_' . $this->plugin_name, [
440
  $this
441
- ], '4.1.1', "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation" );
442
 
443
  /**
444
  * wbcr/factory/plugin_{$this->plugin_name}_deactivation
445
  *
446
  * @since 4.1.2 - deprecated
447
  */
448
- wbcr_factory_420_do_action_deprecated( "wbcr/factory/plugin_{$this->plugin_name}_deactivation", [
449
  $this
450
- ], '4.1.2', "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation" );
451
 
452
  /**
453
  * @since 4.1.2 - added
454
  */
455
- do_action( "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation" );
456
 
457
- if ( ! empty( $this->activator_class ) ) {
458
- foreach ( (array) $this->activator_class as $activator_class ) {
459
- $activator = new $activator_class( $this );
460
  $activator->deactivate();
461
  }
462
  }
@@ -464,12 +492,12 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
464
  /**
465
  * @since 4.1.2 - added
466
  */
467
- do_action( 'wbcr/factory/plugin_deactivated', $this );
468
 
469
  /**
470
  * @since 4.1.2 - added
471
  */
472
- do_action( "wbcr/factory/plugin_{$this->plugin_name}_deactivated", $this );
473
  }
474
 
475
  /**
@@ -481,55 +509,78 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
481
  * @return string|void
482
  * @throws Exception
483
  */
484
- public function getPluginPageUrl( $page_id, $args = [] ) {
485
- if ( ! class_exists( 'Wbcr_FactoryPages420' ) ) {
486
- throw new Exception( 'The factory_pages_420 module is not included.' );
 
487
  }
488
 
489
- if ( ! is_admin() ) {
490
- _doing_it_wrong( __METHOD__, __( 'You cannot use this feature on the frontend.' ), '4.0.8' );
491
 
492
  return null;
493
  }
494
 
495
- return Wbcr_FactoryPages420::getPageUrl( $this, $page_id, $args );
496
  }
497
 
498
-
499
  /**
500
  * Загружает аддоны для плагина, как часть проекта, а не как отдельный плагин
 
 
501
  */
502
- protected function loadAddons( $addons ) {
503
- if ( empty( $addons ) ) {
 
 
 
 
504
  return;
505
  }
506
 
507
- foreach ( $addons as $addon_name => $addon_path ) {
508
- if ( ! isset( $this->plugin_addons[ $addon_name ] ) ) {
509
-
510
- // При подключении аддона, мы объявляем константу, что такой аддон уже загружен
511
- // $addon_name индентификатор аддона в вверхнем регистре
512
- $const_name = strtoupper( 'LOADING_' . str_replace( '-', '_', $addon_name ) . '_AS_ADDON' );
513
 
514
- if ( ! defined( $const_name ) ) {
515
- define( $const_name, true );
516
  }
517
 
518
- require_once( $addon_path[1] );
519
 
520
- // Передаем аддону информацию о родительском плагине
521
- $plugin_data = $this->getPluginInfo();
 
522
 
523
- // Устанавливаем метку для аддона, которая указывает на то, что это аддон
524
- $plugin_data['as_addon'] = true;
525
 
526
- // Передаем класс родителя в аддон, для того,
527
- // чтобы аддон использовал экземпляр класса родителя, а не создавал свой собственный.
528
- $plugin_data['plugin_parent'] = $this;
529
 
530
- // Создаем экземпляр класса аддона и записываем его в список загруженных аддонов
531
- if ( class_exists( $addon_path[0] ) ) {
532
- $this->plugin_addons[ $addon_name ] = new $addon_path[0]( $this->get_paths()->main_file, $plugin_data );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
533
  }
534
  }
535
  }
@@ -545,24 +596,25 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
545
  * @return void
546
  * @throws Exception
547
  */
548
- private function init_framework_modules() {
 
549
 
550
- if ( ! empty( $this->load_factory_modules ) ) {
551
- foreach ( (array) $this->load_factory_modules as $module ) {
552
- $scope = isset( $module[2] ) ? $module[2] : 'all';
553
 
554
- if ( $scope == 'all' || ( is_admin() && $scope == 'admin' ) || ( ! is_admin() && $scope == 'public' ) ) {
555
 
556
- if ( ! file_exists( $this->get_paths()->absolute . '/' . $module[0] . '/boot.php' ) ) {
557
- throw new Exception( 'Module ' . $module[1] . ' is not included.' );
558
  }
559
 
560
  $module_boot_file = $this->get_paths()->absolute . '/' . $module[0] . '/boot.php';
561
  require_once $module_boot_file;
562
 
563
- $this->loaded_factory_modules[ $module[1] ] = $module_boot_file;
564
 
565
- do_action( 'wbcr_' . $module[1] . '_plugin_created', $this );
566
  }
567
  }
568
  }
@@ -570,12 +622,12 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
570
  /**
571
  * @since 4.1.1 - deprecated
572
  */
573
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_core_modules_loaded-' . $this->plugin_name, [], '4.1.1', "wbcr/factory_420/modules_loaded-" . $this->plugin_name );
574
 
575
  /**
576
  * @since 4.1.1 - add
577
  */
578
- do_action( 'wbcr/factory_420/modules_loaded-' . $this->plugin_name );
579
  }
580
 
581
 
@@ -584,52 +636,68 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
584
  *
585
  * @since 1.0.0
586
  */
587
- private function register_plugin_hooks() {
 
588
 
589
- add_action( 'plugins_loaded', [ $this, 'set_text_domain' ] );
 
590
 
591
- if ( is_admin() ) {
592
- add_filter( 'wbcr_factory_420_core_admin_allow_multisite', '__return_true' );
 
 
 
593
 
594
- register_activation_hook( $this->get_paths()->main_file, [ $this, 'activation_hook' ] );
595
- register_deactivation_hook( $this->get_paths()->main_file, [ $this, 'deactivation_hook' ] );
 
 
 
 
 
 
 
 
596
  }
597
  }
598
 
599
  /**
600
  * Инициализируем миграции плагина
601
  *
602
- * @since 4.1.1
603
  * @return void
604
  * @throws Exception
 
605
  */
606
- protected function init_plugin_migrations() {
607
- new WBCR\Factory_420\Migrations( $this );
 
608
  }
609
 
610
  /**
611
  * Инициализируем уведомления плагина
612
  *
613
- * @since 4.1.1
614
  * @return void
 
615
  */
616
- protected function init_plugin_notices() {
617
- new Wbcr\Factory_420\Notices( $this );
 
618
  }
619
 
620
  /**
621
  * Создает нового рабочего для проверки обновлений и апгрейда текущего плагина.
622
  *
623
- * @since 4.1.1
624
- *
625
  * @param array $data
626
  *
627
  * @return void
628
  * @throws Exception
 
 
629
  */
630
- protected function init_plugin_updates() {
631
- if ( $this->has_updates ) {
632
- new WBCR\Factory_420\Updates\Upgrader( $this );
 
633
  }
634
  }
635
 
@@ -640,35 +708,24 @@ abstract class Wbcr_Factory420_Plugin extends Wbcr_Factory420_Base {
640
  * Дополнительно создает рабочего, чтобы совершить апгрейд до премиум версии
641
  * и запустить проверку обновлений для этого модуля.
642
  *
643
- * @since 4.1.1
644
  * @throws Exception
 
645
  */
646
- protected function init_plugin_premium_features() {
647
- if ( ! $this->has_premium || ! $this->license_settings ) {
 
648
  $this->premium = null;
649
 
650
  return;
651
  }
652
 
653
  // Создаем экземляр премиум менеджера, мы сможем к нему обращаться глобально.
654
- $this->premium = WBCR\Factory_420\Premium\Manager::instance( $this, $this->license_settings );
655
 
656
  // Подключаем премиум апгрейдер
657
- if ( isset( $this->license_settings['has_updates'] ) && $this->license_settings['has_updates'] ) {
658
- new WBCR\Factory_420\Updates\Premium_Upgrader( $this );
659
  }
660
  }
661
-
662
- // ----------------------------------------------------------------------
663
- // Public methods
664
- // ----------------------------------------------------------------------
665
-
666
- public function newScriptList() {
667
- return new Wbcr_Factory420_ScriptList( $this );
668
- }
669
-
670
- public function newStyleList() {
671
- return new Wbcr_Factory420_StyleList( $this );
672
- }
673
  }
674
 
1
  <?php
2
  // Exit if accessed directly
3
+ if( !defined('ABSPATH') ) {
4
  exit;
5
  }
6
 
24
  * @package factory-core
25
  *
26
  */
27
+ abstract class Wbcr_Factory429_Plugin extends Wbcr_Factory429_Base {
28
 
29
  /**
30
+ * Instance class Wbcr_Factory429_Request, required manages http requests
31
  *
32
  * @see https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/390561806
33
+ * @var Wbcr_Factory429_Request
34
  */
35
  public $request;
36
 
37
  /**
38
  * @see https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/393936924
39
+ * @var \WBCR\Factory_429\Premium\Provider
40
  */
41
  public $premium;
42
 
43
  /**
44
  * The Bootstrap Manager class
45
  *
46
+ * @var Wbcr_FactoryBootstrap430_Manager
47
  */
48
  public $bootstrap;
49
 
50
  /**
51
  * The Bootstrap Manager class
52
  *
53
+ * @var Wbcr_FactoryForms427_Manager
54
  */
55
  public $forms;
56
 
57
  /**
58
+ * Простой массив со списком зарегистрированных классов унаследованных от Wbcr_Factory429_Activator.
59
  * Классы активации используются для упаковки набора функций, которые нужно выполнить во время
60
  * активации плагина.
61
  *
62
+ * @var array[] Wbcr_Factory429_Activator
63
  */
64
  protected $activator_class = [];
65
 
75
  * Ассоциативный массив со списком аддонов плагина. Аддоны плагина являются частью одного проекта,
76
  * но не как отдельный плагин.
77
  *
78
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
79
+ * @since 4.2.0
80
+ * @var array
81
  */
82
+ private $loaded_plugin_components = [];
83
 
84
  /**
85
  * The Adverts Manager class
86
  *
87
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
88
  * @since 4.1.9
89
+ * @var WBCR\Factory_Adverts_109\Base
90
  */
91
  private $adverts;
92
 
93
  /**
94
  * Инициализирует компоненты фреймворка и плагина.
95
  *
96
+ * @param array $data A set of plugin data.
 
 
97
  *
98
+ * @param string $plugin_path A full path to the main plugin file.
99
  *
100
  * @throws Exception
101
+ * @since 1.0.0
102
+ *
103
  */
104
+ public function __construct($plugin_path, $data)
105
+ {
106
 
107
+ parent::__construct($plugin_path, $data);
108
 
109
+ $this->request = new Wbcr_Factory429_Request();
110
+ //$this->route = new Wbcr_Factory429_Route();
111
 
112
  // INIT PLUGIN FRAMEWORK MODULES
113
  // Framework modules should always be loaded first,
130
 
131
  // init actions
132
  $this->register_plugin_hooks();
 
133
 
134
+ // INIT PLUGIN COMPONENTS
135
+ $this->init_plugin_components();
136
+ }
137
 
138
  /**
139
  * Устанавливает класс менеджер, которому плагин будет делегировать подключение ресурсов (картинок,
140
  * скриптов, стилей) фреймворка.
141
  *
142
+ * @param Wbcr_FactoryBootstrap430_Manager $bootstrap
143
  */
144
+ public function setBootstap(Wbcr_FactoryBootstrap430_Manager $bootstrap)
145
+ {
146
  $this->bootstrap = $bootstrap;
147
  }
148
 
149
  /**
150
  * Устанавливает класс менеджер, которому будет делегирована работа с html формами фреймворка.
151
  *
152
+ * @param Wbcr_FactoryForms427_Manager $forms
153
  */
154
+ public function setForms(Wbcr_FactoryForms427_Manager $forms)
155
+ {
156
  $this->forms = $forms;
157
  }
158
 
162
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
163
  * @since 4.1.9
164
  */
165
+ public function set_adverts_manager($class_name)
166
+ {
167
+ if( empty($this->adverts) && $this->render_adverts ) {
168
+ $this->adverts = new $class_name($this, $this->adverts_settings);
169
  }
170
  }
171
 
175
  * С помощью этого класса, мы проверяем валидность лицензий и получаем дополнительную информацию
176
  * о лицензии и ее покупателе. Класс используется в премиум менеджере.
177
  *
178
+ * @param string $name Имя провайдер
179
+ * @param string $class_name Имя класса провайдера
180
+ *
181
  * @since 4.1.6 - Добавлен
182
  *
 
 
183
  */
184
+ public function set_license_provider($name, $class_name)
185
+ {
186
+ if( !isset(WBCR\Factory_429\Premium\Manager::$providers[$name]) ) {
187
+ WBCR\Factory_429\Premium\Manager::$providers[$name] = $class_name;
188
  }
189
  }
190
 
194
  * С помощью этого класса мы реализиуем доставку и откат обновлений плагина, на сайт пользователя.
195
  * Скачиваение премиум версий происходит по защенному каналу. Класс используется в менеджере обновлений.
196
  *
197
+ * @param string $name Имя репозитория
198
+ * @param string $class_name Имя класса репозитория
199
+ *
200
  * @since 4.1.7 - Добавлен
201
  *
 
 
202
  */
203
+ public function set_update_repository($name, $class_name)
204
+ {
205
+ if( !isset(WBCR\Factory_429\Updates\Upgrader::$repositories[$name]) ) {
206
+ WBCR\Factory_429\Updates\Upgrader::$repositories[$name] = $class_name;
207
  }
208
  }
209
 
213
  * Доступен глобально через метод app(), чаще всего используется для создания точек для ротации
214
  * рекламных объявлений.
215
  *
216
+ * @return \WBCR\Factory_Adverts_109\Base
217
  * @since 1.1
218
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
219
  */
220
+ public function get_adverts_manager()
221
+ {
222
  return $this->adverts;
223
  }
224
 
226
  * Устанавливает текстовый домен для плагина. Текстовый домен берется из заголовка входного
227
  * файла плагина.
228
  *
229
+ * @since 4.2.5 - Добавлены 2 аргумента $text_domain, $plugin_dir. Теперь protected
230
  * @since 4.0.8 - Добавлен
231
  *
232
  * @see https://codex.wordpress.org/I18n_for_WordPress_Developers
233
  * @see https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828 - документация по входному файлу
234
  */
235
+ protected function set_text_domain($text_domain, $plugin_dir)
236
+ {
237
+ if( empty($text_domain) || empty($plugin_dir) ) {
238
  return;
239
  }
240
 
241
+ $locale = apply_filters('plugin_locale', is_admin() ? get_user_locale() : get_locale(), $text_domain);
242
 
243
+ $mofile = $text_domain . '-' . $locale . '.mo';
244
 
245
+ if( !load_textdomain($text_domain, $plugin_dir . '/languages/' . $mofile) ) {
246
+ load_muplugin_textdomain($text_domain);
247
  }
248
  }
249
 
250
+ public function newScriptList()
251
+ {
252
+ return new Wbcr_Factory429_ScriptList($this);
253
+ }
254
+
255
+ public function newStyleList()
256
+ {
257
+ return new Wbcr_Factory429_StyleList($this);
258
+ }
259
+
260
  /**
261
  * Все страницы плагина создаются через специальную обертку, за которую отвечает модуль
262
  * фреймворка pages. Разработчик создает собственный класс, унаследованный от
263
+ * Wbcr_FactoryPages429_AdminPage, а затем регистрирует его через этот метод.
264
  * Метод выполняет подключение класса страницы и регистрирует его в модуле фреймворка
265
  * pages.
266
  *
269
  *
270
  * @see https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/222887949 - документация по созданию страниц
271
  *
272
+ * @param string $class_name Имя регистрируемого класса страницы. Пример: WCL_Page_Name.
273
+ * Регистрируемый класс должен быть унаследован от класса Wbcr_FactoryPages429_AdminPage.
274
+ * @param string $file_path Абсолютный путь к файлу с классом страницы.
275
  *
276
  * @throws Exception
277
  */
278
+ public function registerPage($class_name, $file_path)
279
+ {
280
  // todo: https://webcraftic.atlassian.net/projects/PCS/issues/PCS-88
281
  // if ( $this->isNetworkActive() && ! is_network_admin() ) {
282
  // return;
283
  // }
284
 
285
+ if( !file_exists($file_path) ) {
286
+ throw new Exception('The page file was not found by the path {' . $file_path . '} you set.');
287
  }
288
 
289
+ require_once($file_path);
290
 
291
+ if( !class_exists($class_name) ) {
292
+ throw new Exception('A class with this name {' . $class_name . '} does not exist.');
293
  }
294
 
295
+ if( !class_exists('Wbcr_FactoryPages429') ) {
296
+ throw new Exception('The factory_pages_429 module is not included.');
297
  }
298
 
299
+ Wbcr_FactoryPages429::register($this, $class_name);
300
  }
301
 
302
  /**
305
  * Wbcr_FactoryTypes000_Type, а затем регистрирует его через этот метод. Метод выполняет
306
  * подключение класса с новым типом записи и регистрирует его в модуле фреймворка types. *
307
  *
308
+ * @param string $class_name Имя регистрируемого класса страницы. Пример: WCL_Type_Name.
309
  * Регистрируемый класс должен быть унаследован от класса Wbcr_FactoryTypes000_Type.
310
+ * @param string $file_path Абсолютный путь к файлу с классом страницы.
311
  *
312
  * @throws Exception
313
  * @deprecated 4.1.7 You cannot use it!
314
  */
315
+ public function registerType($class_name, $file_path)
316
+ {
317
+ throw new Exception('As of factory core module 4.1.7, the "registerType" method is deprecated. You cannot use it!');
318
  }
319
 
320
  /**
321
  * Registers a class to activate the plugin.
322
  *
323
+ * @param string $className class name of the plugin activator.
 
 
324
  *
325
  * @return void
326
+ * @since 1.0.0
327
+ *
328
  */
329
+ public function registerActivation($className)
330
+ {
331
  $this->activator_class[] = $className;
332
  }
333
 
337
  /**
338
  * It's invoked on plugin activation. Don't excite it directly.
339
  *
 
340
  * @return void
341
+ * @since 1.0.0
342
  */
343
+ public function activation_hook()
344
+ {
345
 
346
  /**
347
  * @since 4.1.1 - change hook name
348
  */
349
+ if( apply_filters("wbcr/factory_429/cancel_plugin_activation_{$this->plugin_name}", false) ) {
350
  return;
351
  }
352
 
353
  /**
354
+ * wbcr_factory_429_plugin_activation
355
  *
356
  * @since 4.1.1 - deprecated
357
  */
358
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_plugin_activation', [
359
  $this
360
+ ], '4.1.1', "wbcr/factory/plugin_activation");
361
 
362
  /**
363
  * wbcr/factory/plugin_activation
364
  *
365
  * @since 4.1.2 - deprecated
366
  */
367
+ wbcr_factory_429_do_action_deprecated('wbcr/factory/plugin_activation', [
368
  $this
369
+ ], '4.1.2', "wbcr/factory/before_plugin_activation");
370
 
371
  /**
372
  * wbcr/factory/before_plugin_activation
373
  *
374
  * @since 4.1.2 - added
375
  */
376
+ do_action('wbcr/factory/before_plugin_activation', $this);
377
 
378
  /**
379
  * # wbcr/factory/plugin_{$this->plugin_name}_activation
380
  *
381
  * @since 4.1.2 - deprecated
382
  */
383
+ wbcr_factory_429_do_action_deprecated("wbcr/factory/plugin_{$this->plugin_name}_activation", [
384
  $this
385
+ ], '4.1.2', "wbcr/factory/before_plugin_{$this->plugin_name}_activation");
386
 
387
  /**
388
+ * wbcr_factory_429_plugin_activation_' . $this->plugin_name
389
  *
390
  * @since 4.1.1 - deprecated
391
  */
392
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_plugin_activation_' . $this->plugin_name, [
393
  $this
394
+ ], '4.1.1', "wbcr/factory/before_plugin_{$this->plugin_name}_activation");
395
 
396
  /**
397
  * wbcr/factory/plugin_{$this->plugin_name}_activation
398
  *
399
  * @since 4.1.2 - added
400
  */
401
+ do_action("wbcr/factory/plugin_{$this->plugin_name}_activation", $this);
402
 
403
+ if( !empty($this->activator_class) ) {
404
+ foreach((array)$this->activator_class as $activator_class) {
405
+ $activator = new $activator_class($this);
406
  $activator->activate();
407
  }
408
  }
410
  /**
411
  * @since 4.1.2 - added
412
  */
413
+ do_action('wbcr/factory/plugin_activated', $this);
414
 
415
  /**
416
  * @since 4.1.2 - added
417
  */
418
+ do_action("wbcr/factory/plugin_{$this->plugin_name}_activated", $this);
419
  }
420
 
421
  /**
422
  * It's invoked on plugin deactionvation. Don't excite it directly.
423
  *
 
424
  * @return void
425
+ * @since 1.0.0
426
  */
427
+ public function deactivation_hook()
428
+ {
429
 
430
  /**
431
  * @since 4.1.1 - change hook name
432
  */
433
+ if( apply_filters("wbcr/factory_429/cancel_plugin_deactivation_{$this->plugin_name}", false) ) {
434
  return;
435
  }
436
 
437
  /**
438
+ * wbcr_factory_429_plugin_deactivation
439
  *
440
  * @since 4.1.1 - deprecated
441
  */
442
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_plugin_deactivation', [
443
  $this
444
+ ], '4.1.1', "wbcr/factory/plugin_deactivation");
445
 
446
  /**
447
  * wbcr/factory/plugin_deactivation
448
  *
449
  * @since 4.1.2 - deprecated
450
  */
451
+ wbcr_factory_429_do_action_deprecated('wbcr/factory/plugin_deactivation', [
452
  $this
453
+ ], '4.1.2', "wbcr/factory/before_plugin_deactivation");
454
 
455
  /**
456
  * wbcr/factory/plugin_deactivation
457
  *
458
  * @since 4.1.2 - added
459
  */
460
+ do_action('wbcr/factory/plugin_deactivation', $this);
461
 
462
  /**
463
+ * wbcr_factory_429_plugin_deactivation_ . $this->plugin_name
464
  *
465
  * @since 4.1.1 - deprecated
466
  */
467
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_plugin_deactivation_' . $this->plugin_name, [
468
  $this
469
+ ], '4.1.1', "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation");
470
 
471
  /**
472
  * wbcr/factory/plugin_{$this->plugin_name}_deactivation
473
  *
474
  * @since 4.1.2 - deprecated
475
  */
476
+ wbcr_factory_429_do_action_deprecated("wbcr/factory/plugin_{$this->plugin_name}_deactivation", [
477
  $this
478
+ ], '4.1.2', "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation");
479
 
480
  /**
481
  * @since 4.1.2 - added
482
  */
483
+ do_action("wbcr/factory/before_plugin_{$this->plugin_name}_deactivation");
484
 
485
+ if( !empty($this->activator_class) ) {
486
+ foreach((array)$this->activator_class as $activator_class) {
487
+ $activator = new $activator_class($this);
488
  $activator->deactivate();
489
  }
490
  }
492
  /**
493
  * @since 4.1.2 - added
494
  */
495
+ do_action('wbcr/factory/plugin_deactivated', $this);
496
 
497
  /**
498
  * @since 4.1.2 - added
499
  */
500
+ do_action("wbcr/factory/plugin_{$this->plugin_name}_deactivated", $this);
501
  }
502
 
503
  /**
509
  * @return string|void
510
  * @throws Exception
511
  */
512
+ public function getPluginPageUrl($page_id, $args = [])
513
+ {
514
+ if( !class_exists('Wbcr_FactoryPages429') ) {
515
+ throw new Exception('The factory_pages_429 module is not included.');
516
  }
517
 
518
+ if( !is_admin() ) {
519
+ _doing_it_wrong(__METHOD__, __('You cannot use this feature on the frontend.'), '4.0.8');
520
 
521
  return null;
522
  }
523
 
524
+ return Wbcr_FactoryPages429::getPageUrl($this, $page_id, $args);
525
  }
526
 
 
527
  /**
528
  * Загружает аддоны для плагина, как часть проекта, а не как отдельный плагин
529
+ *
530
+ * @throws \Exception
531
  */
532
+ private function init_plugin_components()
533
+ {
534
+
535
+ $load_plugin_components = $this->get_load_plugin_components();
536
+
537
+ if( empty($load_plugin_components) || !is_array($load_plugin_components) ) {
538
  return;
539
  }
540
 
541
+ foreach($load_plugin_components as $component_ID => $component) {
542
+ if( !isset($this->loaded_plugin_components[$component_ID]) ) {
 
 
 
 
543
 
544
+ if( !isset($component['autoload']) || !isset($component['plugin_prefix']) ) {
545
+ throw new Exception(sprintf("Component %s cannot be loaded, you must specify the path to the component autoload file and plugin prefix!", $component_ID));
546
  }
547
 
548
+ $prefix = rtrim($component['plugin_prefix'], '_') . '_';
549
 
550
+ if( defined($prefix . 'PLUGIN_ACTIVE') ) {
551
+ continue;
552
+ }
553
 
554
+ $autoload_file = trailingslashit($this->get_paths()->absolute) . $component['autoload'];
 
555
 
556
+ if( !file_exists($autoload_file) ) {
557
+ throw new Exception(sprintf("Component %s autoload file not found!", $component_ID));
558
+ }
559
 
560
+ $plugin_var_name = strtolower($prefix . 'plugin');
561
+ global $$plugin_var_name;
562
+ $$plugin_var_name = $this;
563
+
564
+ require_once($autoload_file);
565
+
566
+ if( defined($prefix . 'PLUGIN_ACTIVE') && class_exists($prefix . 'Plugin') ) {
567
+ $this->loaded_plugin_components[$component_ID] = [
568
+ 'plugin_dir' => constant($prefix . 'PLUGIN_DIR'),
569
+ 'plugin_url' => constant($prefix . 'PLUGIN_URL'),
570
+ 'plugin_base' => constant($prefix . 'PLUGIN_BASE'),
571
+ 'text_domain' => constant($prefix . 'TEXT_DOMAIN'),
572
+ 'plugin_version' => constant($prefix . 'PLUGIN_VERSION')
573
+ ];
574
+
575
+ /**
576
+ * Оповещает внешние приложения, что компонент плагина был загружен
577
+ *
578
+ * @param array $load_plugin_components Информация о загруженном компоненте
579
+ * @param string $plugin_name Имя плагина
580
+ */
581
+ do_action("wbcr/factory/component_{$component_ID}_loaded", $this->loaded_plugin_components[$component_ID], $this->getPluginName());
582
+ } else {
583
+ throw new Exception(sprintf("Сomponent %s does not meet development standards!", $component_ID));
584
  }
585
  }
586
  }
596
  * @return void
597
  * @throws Exception
598
  */
599
+ private function init_framework_modules()
600
+ {
601
 
602
+ if( !empty($this->load_factory_modules) ) {
603
+ foreach((array)$this->load_factory_modules as $module) {
604
+ $scope = isset($module[2]) ? $module[2] : 'all';
605
 
606
+ if( $scope == 'all' || (is_admin() && $scope == 'admin') || (!is_admin() && $scope == 'public') ) {
607
 
608
+ if( !file_exists($this->get_paths()->absolute . '/' . $module[0] . '/boot.php') ) {
609
+ throw new Exception('Module ' . $module[1] . ' is not included.');
610
  }
611
 
612
  $module_boot_file = $this->get_paths()->absolute . '/' . $module[0] . '/boot.php';
613
  require_once $module_boot_file;
614
 
615
+ $this->loaded_factory_modules[$module[1]] = $module_boot_file;
616
 
617
+ do_action('wbcr_' . $module[1] . '_plugin_created', $this);
618
  }
619
  }
620
  }
622
  /**
623
  * @since 4.1.1 - deprecated
624
  */
625
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_core_modules_loaded-' . $this->plugin_name, [], '4.1.1', "wbcr/factory_429/modules_loaded-" . $this->plugin_name);
626
 
627
  /**
628
  * @since 4.1.1 - add
629
  */
630
+ do_action('wbcr/factory_429/modules_loaded-' . $this->plugin_name);
631
  }
632
 
633
 
636
  *
637
  * @since 1.0.0
638
  */
639
+ private function register_plugin_hooks()
640
+ {
641
 
642
+ add_action('plugins_loaded', function () {
643
+ $this->set_text_domain($this->plugin_text_domain, $this->paths->absolute);
644
 
645
+ if( !empty($this->loaded_plugin_components) ) {
646
+ foreach($this->loaded_plugin_components as $component) {
647
+ if( empty($component['text_domain']) ) {
648
+ continue;
649
+ }
650
 
651
+ $this->set_text_domain($component['text_domain'], $component['plugin_dir']);
652
+ }
653
+ }
654
+ });
655
+
656
+ if( is_admin() ) {
657
+ add_filter('wbcr_factory_429_core_admin_allow_multisite', '__return_true');
658
+
659
+ register_activation_hook($this->get_paths()->main_file, [$this, 'activation_hook']);
660
+ register_deactivation_hook($this->get_paths()->main_file, [$this, 'deactivation_hook']);
661
  }
662
  }
663
 
664
  /**
665
  * Инициализируем миграции плагина
666
  *
 
667
  * @return void
668
  * @throws Exception
669
+ * @since 4.1.1
670
  */
671
+ protected function init_plugin_migrations()
672
+ {
673
+ new WBCR\Factory_429\Migrations($this);
674
  }
675
 
676
  /**
677
  * Инициализируем уведомления плагина
678
  *
 
679
  * @return void
680
+ * @since 4.1.1
681
  */
682
+ protected function init_plugin_notices()
683
+ {
684
+ new Wbcr\Factory_429\Notices($this);
685
  }
686
 
687
  /**
688
  * Создает нового рабочего для проверки обновлений и апгрейда текущего плагина.
689
  *
 
 
690
  * @param array $data
691
  *
692
  * @return void
693
  * @throws Exception
694
+ * @since 4.1.1
695
+ *
696
  */
697
+ protected function init_plugin_updates()
698
+ {
699
+ if( $this->has_updates ) {
700
+ new WBCR\Factory_429\Updates\Upgrader($this);
701
  }
702
  }
703
 
708
  * Дополнительно создает рабочего, чтобы совершить апгрейд до премиум версии
709
  * и запустить проверку обновлений для этого модуля.
710
  *
 
711
  * @throws Exception
712
+ * @since 4.1.1
713
  */
714
+ protected function init_plugin_premium_features()
715
+ {
716
+ if( !$this->has_premium || !$this->license_settings ) {
717
  $this->premium = null;
718
 
719
  return;
720
  }
721
 
722
  // Создаем экземляр премиум менеджера, мы сможем к нему обращаться глобально.
723
+ $this->premium = WBCR\Factory_429\Premium\Manager::instance($this, $this->license_settings);
724
 
725
  // Подключаем премиум апгрейдер
726
+ if( isset($this->license_settings['has_updates']) && $this->license_settings['has_updates'] ) {
727
+ new WBCR\Factory_429\Updates\Premium_Upgrader($this);
728
  }
729
  }
 
 
 
 
 
 
 
 
 
 
 
 
730
  }
731
 
libs/factory/core/includes/class-factory-plugin-base.php CHANGED
@@ -5,7 +5,7 @@ if ( ! defined( 'ABSPATH' ) ) {
5
  }
6
 
7
  /**
8
- * Базовый класс для создания нового плагина. Полную реализацию класса смотрите в Wbcr_Factory420_Plugin
9
  *
10
  * Документация по классу: https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/392724484
11
  * Документация по созданию плагина: https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828
@@ -17,9 +17,9 @@ if ( ! defined( 'ABSPATH' ) ) {
17
  * @since 1.0.0
18
  * @package factory-core
19
  */
20
- class Wbcr_Factory420_Base {
21
 
22
- use WBCR\Factory_420\Options;
23
 
24
  /**
25
  * Обязательное свойство. Префикс, используется для создания пространство имен.
@@ -81,7 +81,7 @@ class Wbcr_Factory420_Base {
81
  * https://robin-image-optimizer.webcraftic.com/premium-features.
82
  *
83
  * Это свойство заполняется для того, чтобы в процессе разработки вы могли использовать
84
- * экземпляр класса \WBCR\Factory_420\Entities\Support, для получения информации о сайте плагина.
85
  * Тем самым вы избавляете себя от жесткого прописывания ссылок на лендинг плагина и
86
  * можете изменить все ссылки в одном месте.
87
  *
@@ -127,7 +127,7 @@ class Wbcr_Factory420_Base {
127
  * к примеру: freemius, codecanyon, templatemonster, вам нужно указать только настройки для
128
  * взаимодействия с выбранным вами провайдером. Каждая реализация провайдера лицензий может иметь
129
  * индивидуальный настройки, в этом примере приведены настройки для freemius провайдера
130
- * WBCR\Factory_420\Premium\Provider > WBCR\Factory_Freemius_000\Premium\Provider
131
  *
132
  * На текущий момент существует только реализация для freemius провайдера.
133
  *
@@ -162,8 +162,9 @@ class Wbcr_Factory420_Base {
162
  protected $adverts_settings = [];
163
 
164
  /**
165
- * Обязательное свойство. Подключаемые модули фреймворка. Модули фреймворка позволяют расширять его
166
- * функциональность.
 
167
  *
168
  * @var array {
169
  * Array with information about the loadable module
@@ -176,27 +177,52 @@ class Wbcr_Factory420_Base {
176
  * }
177
  */
178
  protected $load_factory_modules = [
179
- [ 'libs/factory/bootstrap', 'factory_bootstrap_421', 'admin' ],
180
- [ 'libs/factory/forms', 'factory_forms_418', 'admin' ],
181
- [ 'libs/factory/pages', 'factory_pages_420', 'admin' ],
182
  ];
183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
 
185
  /**
186
- * Экземпляр класса \WBCR\Factory_420\Entities\Support используется для получения информации
187
  * о сайте плагина. Чаще всего используется для получения ссылки на страницу с тарифами или
188
  * ссылки на форму обратной связи. Встроен механизм отслеживания по utm меткам.
189
  *
190
- * @var \WBCR\Factory_420\Entities\Support
191
  */
192
  protected $support;
193
 
194
  /**
195
- * Экземпляр класса \WBCR\Factory_420\Entities\Paths используется для получения информации о
196
  * путях плагина. Часто используется для получения путей или ссылок на место хранения плагина
197
  * или его входного файла.
198
  *
199
- * @var \WBCR\Factory_420\Entities\Paths
200
  */
201
  protected $paths;
202
 
@@ -244,8 +270,8 @@ class Wbcr_Factory420_Base {
244
  throw new Exception( 'One of the required attributes has not been passed (prefix, plugin_title, plugin_name, plugin_version, plugin_text_domain).' );
245
  }
246
 
247
- $this->support = new \WBCR\Factory_420\Entities\Support( $this->support_details );
248
- $this->paths = new \WBCR\Factory_420\Entities\Paths( $plugin_file );
249
 
250
  // used only in the module 'updates'
251
  $this->plugin_slug = ! empty( $this->plugin_name ) ? $this->plugin_name : basename( $plugin_file );
@@ -365,7 +391,7 @@ class Wbcr_Factory420_Base {
365
  * Проверяет, включен ли премиум для этого плагина или нет.
366
  *
367
  * @return bool Возвращает true, если премиум пакет включен для этого плагина.
368
- * См. Wbcr_Factory420_Base::has_premium
369
  */
370
  public function has_premium() {
371
  return $this->has_premium;
@@ -374,7 +400,7 @@ class Wbcr_Factory420_Base {
374
  /**
375
  * Позволяет получить заголовок плагина.
376
  *
377
- * @return string Возвращает заголовок плагина. См. Wbcr_Factory420_Base::plugin_title
378
  */
379
  public function getPluginTitle() {
380
  return $this->plugin_title;
@@ -383,7 +409,7 @@ class Wbcr_Factory420_Base {
383
  /**
384
  * Позволяет получить префикс плагина.
385
  *
386
- * @return string Возвращает префикс плагина.См. Wbcr_Factory420_Base::prefix
387
  */
388
  public function getPrefix() {
389
  return $this->prefix;
@@ -392,7 +418,7 @@ class Wbcr_Factory420_Base {
392
  /**
393
  * Позволяет получить имя плагина.
394
  *
395
- * @return string Возвращает имя плагина. См. Wbcr_Factory420_Base::plugin_name
396
  */
397
  public function getPluginName() {
398
  return $this->plugin_name;
@@ -401,18 +427,29 @@ class Wbcr_Factory420_Base {
401
  /**
402
  * Позволяет получить версию плагина.
403
  *
404
- * @return string Возвращает версию плагина. См. Wbcr_Factory420_Base::plugin_version
405
  */
406
  public function getPluginVersion() {
407
  return $this->plugin_version;
408
  }
409
 
 
 
 
 
 
 
 
 
 
 
 
410
  /**
411
  * Предоставляет доступ к сырым данным плагина. Может быть полезен, если вы хотите получить
412
  * какие-то данные не описанные в интерфейсе этого плагина.
413
  *
414
  * @param string $attr_name Имя атрибута, который нужно получить. Идентично ключу в массиве
415
- * Wbcr_Factory420_Base::plugin_data
416
  *
417
  * @return null
418
  */
@@ -425,18 +462,18 @@ class Wbcr_Factory420_Base {
425
  }
426
 
427
  /**
428
- * Предоставляет доступ к экземпляру класса \WBCR\Factory_420\Entities\Support.
429
  *
430
- * @return \WBCR\Factory_420\Entities\Support
431
  */
432
  public function get_support() {
433
  return $this->support;
434
  }
435
 
436
  /**
437
- * Предоставляет доступ к экземпляру класса \WBCR\Factory_420\Entities\Paths.
438
  *
439
- * @return \WBCR\Factory_420\Entities\Paths
440
  */
441
  public function get_paths() {
442
  return $this->paths;
@@ -445,14 +482,33 @@ class Wbcr_Factory420_Base {
445
  /**
446
  * Позволяет получить сырые данные плагина в виде объекта StdClass.
447
  *
448
- * @return object Возвращает объект с сырыми данными плагина. См. Wbcr_Factory420_Base::plugin_data
449
  */
450
  public function getPluginInfo() {
451
  return (object) $this->plugin_data;
452
  }
453
 
454
  /**
455
- * TODO: Вынести метод в функции
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
  *
457
  * @since 4.0.8 Добавлен
458
  *
@@ -464,7 +520,6 @@ class Wbcr_Factory420_Base {
464
 
465
  /**
466
  * Проверяет активирован ли плагин для сети. Если проект работает в режиме мультисайтов..
467
- * TODO: Вынести метод в функции
468
  *
469
  * @since 4.0.8 Добавлен
470
  * @return bool Если true, плагин активирован для сети или в текущий момент активируется для сети.
@@ -486,7 +541,6 @@ class Wbcr_Factory420_Base {
486
 
487
  /**
488
  * Позволяет получить все активные сайты сети. Если проект работает в режиме мультисайтов.
489
- * TODO: Вынести метод в функции
490
  *
491
  * @since 4.0.8
492
  * @return array|int
5
  }
6
 
7
  /**
8
+ * Базовый класс для создания нового плагина. Полную реализацию класса смотрите в Wbcr_Factory429_Plugin
9
  *
10
  * Документация по классу: https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/392724484
11
  * Документация по созданию плагина: https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828
17
  * @since 1.0.0
18
  * @package factory-core
19
  */
20
+ class Wbcr_Factory429_Base {
21
 
22
+ use WBCR\Factory_429\Options;
23
 
24
  /**
25
  * Обязательное свойство. Префикс, используется для создания пространство имен.
81
  * https://robin-image-optimizer.webcraftic.com/premium-features.
82
  *
83
  * Это свойство заполняется для того, чтобы в процессе разработки вы могли использовать
84
+ * экземпляр класса \WBCR\Factory_429\Entities\Support, для получения информации о сайте плагина.
85
  * Тем самым вы избавляете себя от жесткого прописывания ссылок на лендинг плагина и
86
  * можете изменить все ссылки в одном месте.
87
  *
127
  * к примеру: freemius, codecanyon, templatemonster, вам нужно указать только настройки для
128
  * взаимодействия с выбранным вами провайдером. Каждая реализация провайдера лицензий может иметь
129
  * индивидуальный настройки, в этом примере приведены настройки для freemius провайдера
130
+ * WBCR\Factory_429\Premium\Provider > WBCR\Factory_Freemius_000\Premium\Provider
131
  *
132
  * На текущий момент существует только реализация для freemius провайдера.
133
  *
162
  protected $adverts_settings = [];
163
 
164
  /**
165
+ * Обязательное свойство. Подключаемые модули фреймворка.
166
+ *
167
+ * Модули фреймворка позволяют расширять его функциональность.
168
  *
169
  * @var array {
170
  * Array with information about the loadable module
177
  * }
178
  */
179
  protected $load_factory_modules = [
180
+ [ 'libs/factory/bootstrap', 'factory_bootstrap_430', 'admin' ],
181
+ [ 'libs/factory/forms', 'factory_forms_427', 'admin' ],
182
+ [ 'libs/factory/pages', 'factory_pages_429', 'admin' ],
183
  ];
184
 
185
+ /**
186
+ * Не обязательное свойство. Список подключаемых компонентов плагина.
187
+ *
188
+ * Компоненты плагина, это независимые плагины, которые расширяют возможности текущего плагина.
189
+ * Вы должны указать файл для автозагрузки компонента и префикс плагина, чтобы фреймворк
190
+ * мог обращаться к классам и константам компонентов.
191
+ *
192
+ *
193
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
194
+ * @since 4.2.0 Добавлен
195
+ * @var array Пример данных
196
+ * array(
197
+ * 'component_ID' => array(
198
+ * 'autoload' => 'relative_path/autoload_filename.php',
199
+ * 'plugin_prefix' => 'WPRFX_'
200
+ * ),
201
+ * // Реальный пример
202
+ * 'cyrlitera' => array(
203
+ * 'autoload' => 'components/cyrlitera/clearfy.php',
204
+ * 'plugin_prefix' => 'WCTR_'
205
+ * ),
206
+ * )
207
+ */
208
+ protected $load_plugin_components = [];
209
+
210
 
211
  /**
212
+ * Экземпляр класса \WBCR\Factory_429\Entities\Support используется для получения информации
213
  * о сайте плагина. Чаще всего используется для получения ссылки на страницу с тарифами или
214
  * ссылки на форму обратной связи. Встроен механизм отслеживания по utm меткам.
215
  *
216
+ * @var \WBCR\Factory_429\Entities\Support
217
  */
218
  protected $support;
219
 
220
  /**
221
+ * Экземпляр класса \WBCR\Factory_429\Entities\Paths используется для получения информации о
222
  * путях плагина. Часто используется для получения путей или ссылок на место хранения плагина
223
  * или его входного файла.
224
  *
225
+ * @var \WBCR\Factory_429\Entities\Paths
226
  */
227
  protected $paths;
228
 
270
  throw new Exception( 'One of the required attributes has not been passed (prefix, plugin_title, plugin_name, plugin_version, plugin_text_domain).' );
271
  }
272
 
273
+ $this->support = new \WBCR\Factory_429\Entities\Support( $this->support_details );
274
+ $this->paths = new \WBCR\Factory_429\Entities\Paths( $plugin_file );
275
 
276
  // used only in the module 'updates'
277
  $this->plugin_slug = ! empty( $this->plugin_name ) ? $this->plugin_name : basename( $plugin_file );
391
  * Проверяет, включен ли премиум для этого плагина или нет.
392
  *
393
  * @return bool Возвращает true, если премиум пакет включен для этого плагина.
394
+ * См. Wbcr_Factory429_Base::has_premium
395
  */
396
  public function has_premium() {
397
  return $this->has_premium;
400
  /**
401
  * Позволяет получить заголовок плагина.
402
  *
403
+ * @return string Возвращает заголовок плагина. См. Wbcr_Factory429_Base::plugin_title
404
  */
405
  public function getPluginTitle() {
406
  return $this->plugin_title;
409
  /**
410
  * Позволяет получить префикс плагина.
411
  *
412
+ * @return string Возвращает префикс плагина.См. Wbcr_Factory429_Base::prefix
413
  */
414
  public function getPrefix() {
415
  return $this->prefix;
418
  /**
419
  * Позволяет получить имя плагина.
420
  *
421
+ * @return string Возвращает имя плагина. См. Wbcr_Factory429_Base::plugin_name
422
  */
423
  public function getPluginName() {
424
  return $this->plugin_name;
427
  /**
428
  * Позволяет получить версию плагина.
429
  *
430
+ * @return string Возвращает версию плагина. См. Wbcr_Factory429_Base::plugin_version
431
  */
432
  public function getPluginVersion() {
433
  return $this->plugin_version;
434
  }
435
 
436
+ /**
437
+ * Позволяет получить список подключаемых к плагином компонентов
438
+ *
439
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
440
+ * @since 4.2.0
441
+ * @return array
442
+ */
443
+ public function get_load_plugin_components() {
444
+ return $this->load_plugin_components;
445
+ }
446
+
447
  /**
448
  * Предоставляет доступ к сырым данным плагина. Может быть полезен, если вы хотите получить
449
  * какие-то данные не описанные в интерфейсе этого плагина.
450
  *
451
  * @param string $attr_name Имя атрибута, который нужно получить. Идентично ключу в массиве
452
+ * Wbcr_Factory429_Base::plugin_data
453
  *
454
  * @return null
455
  */
462
  }
463
 
464
  /**
465
+ * Предоставляет доступ к экземпляру класса \WBCR\Factory_429\Entities\Support.
466
  *
467
+ * @return \WBCR\Factory_429\Entities\Support
468
  */
469
  public function get_support() {
470
  return $this->support;
471
  }
472
 
473
  /**
474
+ * Предоставляет доступ к экземпляру класса \WBCR\Factory_429\Entities\Paths.
475
  *
476
+ * @return \WBCR\Factory_429\Entities\Paths
477
  */
478
  public function get_paths() {
479
  return $this->paths;
482
  /**
483
  * Позволяет получить сырые данные плагина в виде объекта StdClass.
484
  *
485
+ * @return object Возвращает объект с сырыми данными плагина. См. Wbcr_Factory429_Base::plugin_data
486
  */
487
  public function getPluginInfo() {
488
  return (object) $this->plugin_data;
489
  }
490
 
491
  /**
492
+ * Проверяет права пользователя
493
+ *
494
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
495
+ * @since 4.2.0 Добавлен
496
+ * @return bool
497
+ */
498
+ public function current_user_can( $capability = 'manage_options' ) {
499
+ // Просмотр страниц: read_pages
500
+ // Просмотр уведомлений: read_notices
501
+ // Редактирование: edit_forms
502
+
503
+ if ( 'manage_options' == $capability && is_multisite() && $this->isNetworkActive() ) {
504
+ $capability = 'manage_network';
505
+ }
506
+
507
+ return current_user_can( $capability );
508
+ }
509
+
510
+ /**
511
+ * Проверят, находится ли пользователь в панели усправления сетью сайтов
512
  *
513
  * @since 4.0.8 Добавлен
514
  *
520
 
521
  /**
522
  * Проверяет активирован ли плагин для сети. Если проект работает в режиме мультисайтов..
 
523
  *
524
  * @since 4.0.8 Добавлен
525
  * @return bool Если true, плагин активирован для сети или в текущий момент активируется для сети.
541
 
542
  /**
543
  * Позволяет получить все активные сайты сети. Если проект работает в режиме мультисайтов.
 
544
  *
545
  * @since 4.0.8
546
  * @return array|int
libs/factory/core/includes/class-factory-requests.php CHANGED
@@ -11,7 +11,7 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  * @package factory-core
12
  */
13
 
14
- class Wbcr_Factory420_Request {
15
 
16
  /**
17
  * @param null $param
11
  * @package factory-core
12
  */
13
 
14
+ class Wbcr_Factory429_Request {
15
 
16
  /**
17
  * @param null $param
libs/factory/core/includes/class-factory-requirements.php CHANGED
@@ -11,9 +11,9 @@
11
  * @version 2.0.0
12
  * @since 4.0.9
13
  */
14
-
15
- if ( ! class_exists( 'Wbcr_Factory420_Requirements' ) ) {
16
- class Wbcr_Factory420_Requirements {
17
 
18
  /**
19
  * Factory framework version
@@ -121,11 +121,11 @@ if ( ! class_exists( 'Wbcr_Factory420_Requirements' ) ) {
121
  $this->plugin_basename = plugin_basename( $plugin_file );
122
  $this->plugin_url = plugins_url( null, $plugin_file );
123
 
124
- $plugin_info = get_file_data( $this->plugin_file, [
125
  'Version' => 'Version',
126
  'FrameworkVersion' => 'Framework Version',
127
  'TextDomain' => 'Text Domain'
128
- ], 'plugin' );
129
 
130
  if ( isset( $plugin_info['FrameworkVersion'] ) ) {
131
  $this->factory_version = $plugin_info['FrameworkVersion'];
@@ -139,7 +139,7 @@ if ( ! class_exists( 'Wbcr_Factory420_Requirements' ) ) {
139
  $this->plugin_text_domain = $plugin_info['TextDomain'];
140
  }
141
 
142
- add_action( 'admin_init', [ $this, 'register_notices' ] );
143
  }
144
 
145
  public function get_plugin_version() {
@@ -158,13 +158,13 @@ if ( ! class_exists( 'Wbcr_Factory420_Requirements' ) ) {
158
  if ( current_user_can( 'activate_plugins' ) && current_user_can( 'edit_plugins' ) && current_user_can( 'install_plugins' ) ) {
159
 
160
  if ( is_multisite() ) {
161
- add_action( 'network_admin_notices', [ $this, 'show_notice' ] );
162
 
163
- if ( ! empty( $this->plugin_basename ) && in_array( $this->plugin_basename, (array) get_option( 'active_plugins', [] ) ) ) {
164
- add_action( 'admin_notices', [ $this, 'show_notice' ] );
165
  }
166
  } else {
167
- add_action( 'admin_notices', [ $this, 'show_notice' ] );
168
  }
169
  }
170
  }
@@ -242,7 +242,7 @@ if ( ! class_exists( 'Wbcr_Factory420_Requirements' ) ) {
242
  $notice_text = $notice_default_text = '';
243
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
244
 
245
- $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_212' ), $this->plugin_title ) . ' ';
246
  $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
247
 
248
  $has_one = false;
@@ -273,21 +273,22 @@ if ( ! class_exists( 'Wbcr_Factory420_Requirements' ) ) {
273
  * @return string
274
  */
275
  protected function get_php_incompat_text() {
276
- return sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_420' ), $this->required_php_version );
277
  }
278
 
279
  /**
280
  * @return string
281
  */
282
  protected function get_wp_incompat_text() {
283
- return sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_420' ), $this->required_wp_version );
284
  }
285
 
286
  /**
287
  * @return string
288
  */
289
  protected function get_plugin_already_activate_text() {
290
- return sprintf( __( 'Plugin %s is already activated, you are trying to activate it again.', 'wbcr_factory_420' ), $this->plugin_title );
291
  }
292
  }
293
- }
 
11
  * @version 2.0.0
12
  * @since 4.0.9
13
  */
14
+ // @formatter:off
15
+ if ( ! class_exists( 'Wbcr_Factory429_Requirements' ) ) {
16
+ class Wbcr_Factory429_Requirements {
17
 
18
  /**
19
  * Factory framework version
121
  $this->plugin_basename = plugin_basename( $plugin_file );
122
  $this->plugin_url = plugins_url( null, $plugin_file );
123
 
124
+ $plugin_info = get_file_data( $this->plugin_file, array(
125
  'Version' => 'Version',
126
  'FrameworkVersion' => 'Framework Version',
127
  'TextDomain' => 'Text Domain'
128
+ ), 'plugin' );
129
 
130
  if ( isset( $plugin_info['FrameworkVersion'] ) ) {
131
  $this->factory_version = $plugin_info['FrameworkVersion'];
139
  $this->plugin_text_domain = $plugin_info['TextDomain'];
140
  }
141
 
142
+ add_action( 'admin_init', array( $this, 'register_notices' ) );
143
  }
144
 
145
  public function get_plugin_version() {
158
  if ( current_user_can( 'activate_plugins' ) && current_user_can( 'edit_plugins' ) && current_user_can( 'install_plugins' ) ) {
159
 
160
  if ( is_multisite() ) {
161
+ add_action( 'network_admin_notices', array( $this, 'show_notice' ) );
162
 
163
+ if ( ! empty( $this->plugin_basename ) && in_array( $this->plugin_basename, (array) get_option( 'active_plugins', array() ) ) ) {
164
+ add_action( 'admin_notices', array( $this, 'show_notice' ) );
165
  }
166
  } else {
167
+ add_action( 'admin_notices', array( $this, 'show_notice' ) );
168
  }
169
  }
170
  }
242
  $notice_text = $notice_default_text = '';
243
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
244
 
245
+ $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_221' ), $this->plugin_title ) . ' ';
246
  $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
247
 
248
  $has_one = false;
273
  * @return string
274
  */
275
  protected function get_php_incompat_text() {
276
+ return sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_429' ), $this->required_php_version );
277
  }
278
 
279
  /**
280
  * @return string
281
  */
282
  protected function get_wp_incompat_text() {
283
+ return sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_429' ), $this->required_wp_version );
284
  }
285
 
286
  /**
287
  * @return string
288
  */
289
  protected function get_plugin_already_activate_text() {
290
+ return sprintf( __( 'Plugin %s is already activated, you are trying to activate it again.', 'wbcr_factory_429' ), $this->plugin_title );
291
  }
292
  }
293
+ }
294
+ // @formatter:on
libs/factory/core/includes/entities/class-factory-paths.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
libs/factory/core/includes/entities/class-factory-support.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
libs/factory/core/includes/functions.php CHANGED
@@ -53,17 +53,17 @@ if ( ! function_exists( 'get_user_locale' ) ) {
53
  * @param string $message Optional. A message regarding the change.
54
  *
55
  * @return mixed
56
- * @see wbcr_factory_420_deprecated_hook()
57
  *
58
  */
59
- function wbcr_factory_420_apply_filters_deprecated( $tag, $args, $version, $replacement = false, $message = null ) {
60
  if ( function_exists( 'apply_filters_deprecated' ) ) {
61
  return apply_filters_deprecated( $tag, $args, $version, $replacement, $message );
62
  }
63
  if ( ! has_filter( $tag ) ) {
64
  return $args[0];
65
  }
66
- wbcr_factory_420_deprecated_hook( $tag, $version, $replacement, $message );
67
 
68
  return apply_filters_ref_array( $tag, $args );
69
  }
@@ -89,7 +89,7 @@ function wbcr_factory_420_apply_filters_deprecated( $tag, $args, $version, $repl
89
  * @see _deprecated_hook()
90
  *
91
  */
92
- function wbcr_factory_420_do_action_deprecated( $tag, $args, $version, $replacement = false, $message = null ) {
93
  if ( function_exists( 'do_action_deprecated' ) ) {
94
  do_action_deprecated( $tag, $args, $version, $replacement, $message );
95
 
@@ -98,14 +98,14 @@ function wbcr_factory_420_do_action_deprecated( $tag, $args, $version, $replacem
98
  if ( ! has_action( $tag ) ) {
99
  return;
100
  }
101
- wbcr_factory_420_deprecated_hook( $tag, $version, $replacement, $message );
102
  do_action_ref_array( $tag, $args );
103
  }
104
 
105
  /**
106
  * Marks a deprecated action or filter hook as deprecated and throws a notice.
107
  *
108
- * Use the 'wbcr_factory_420_deprecated_hook_run' action to get the backtrace describing where the
109
  * deprecated hook was called.
110
  *
111
  * Default behavior is to trigger a user error if WP_DEBUG is true.
@@ -123,7 +123,7 @@ function wbcr_factory_420_do_action_deprecated( $tag, $args, $version, $replacem
123
  * @param string $replacement Optional. The hook that should have been used.
124
  * @param string $message Optional. A message regarding the change.
125
  */
126
- function wbcr_factory_420_deprecated_hook( $hook, $version, $replacement = null, $message = null ) {
127
  /**
128
  * Fires when a deprecated hook is called.
129
  *
53
  * @param string $message Optional. A message regarding the change.
54
  *
55
  * @return mixed
56
+ * @see wbcr_factory_429_deprecated_hook()
57
  *
58
  */
59
+ function wbcr_factory_429_apply_filters_deprecated( $tag, $args, $version, $replacement = false, $message = null ) {
60
  if ( function_exists( 'apply_filters_deprecated' ) ) {
61
  return apply_filters_deprecated( $tag, $args, $version, $replacement, $message );
62
  }
63
  if ( ! has_filter( $tag ) ) {
64
  return $args[0];
65
  }
66
+ wbcr_factory_429_deprecated_hook( $tag, $version, $replacement, $message );
67
 
68
  return apply_filters_ref_array( $tag, $args );
69
  }
89
  * @see _deprecated_hook()
90
  *
91
  */
92
+ function wbcr_factory_429_do_action_deprecated( $tag, $args, $version, $replacement = false, $message = null ) {
93
  if ( function_exists( 'do_action_deprecated' ) ) {
94
  do_action_deprecated( $tag, $args, $version, $replacement, $message );
95
 
98
  if ( ! has_action( $tag ) ) {
99
  return;
100
  }
101
+ wbcr_factory_429_deprecated_hook( $tag, $version, $replacement, $message );
102
  do_action_ref_array( $tag, $args );
103
  }
104
 
105
  /**
106
  * Marks a deprecated action or filter hook as deprecated and throws a notice.
107
  *
108
+ * Use the 'wbcr_factory_429_deprecated_hook_run' action to get the backtrace describing where the
109
  * deprecated hook was called.
110
  *
111
  * Default behavior is to trigger a user error if WP_DEBUG is true.
123
  * @param string $replacement Optional. The hook that should have been used.
124
  * @param string $message Optional. A message regarding the change.
125
  */
126
+ function wbcr_factory_429_deprecated_hook( $hook, $version, $replacement = null, $message = null ) {
127
  /**
128
  * Fires when a deprecated hook is called.
129
  *
libs/factory/core/includes/premium/class-factory-license-interface.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Premium\Interfaces;
4
 
5
  // Exit if accessed directly
6
  if ( ! defined( 'ABSPATH' ) ) {
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Premium\Interfaces;
4
 
5
  // Exit if accessed directly
6
  if ( ! defined( 'ABSPATH' ) ) {
libs/factory/core/includes/premium/class-factory-manager.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Premium;
4
 
5
  use Exception;
6
- use Wbcr_Factory420_Plugin;
7
 
8
  // Exit if accessed directly
9
  if ( ! defined( 'ABSPATH' ) ) {
@@ -24,7 +24,7 @@ class Manager {
24
  public static $providers;
25
 
26
  /**
27
- * @var Wbcr_Factory420_Plugin
28
  */
29
  protected $plugin;
30
 
@@ -36,24 +36,24 @@ class Manager {
36
  /**
37
  * Manager constructor.
38
  *
39
- * @param Wbcr_Factory420_Plugin $plugin
40
  * @param array $settings
41
  *
42
  * @throws Exception
43
  */
44
- public function __construct( Wbcr_Factory420_Plugin $plugin, array $settings ) {
45
  $this->plugin = $plugin;
46
  $this->settings = $settings;
47
  }
48
 
49
  /**
50
- * @param Wbcr_Factory420_Plugin $plugin
51
  * @param array $settings
52
  *
53
  * @return \WBCR\Factory_Freemius_000\Premium\Provider
54
  * @throws Exception
55
  */
56
- public static function instance( Wbcr_Factory420_Plugin $plugin, array $settings ) {
57
  $premium_manager = new Manager( $plugin, $settings );
58
 
59
  return $premium_manager->instance_provider();
@@ -70,7 +70,7 @@ class Manager {
70
 
71
  if ( isset( self::$providers[ $provider_name ] ) && class_exists( self::$providers[ $provider_name ] ) ) {
72
  if ( self::$providers[ $provider_name ] instanceof Provider ) {
73
- throw new Exception( "Provider {$provider_name} must extend the class WBCR\Factory_420\Premium\Provider interface!" );
74
  }
75
 
76
  return new self::$providers[ $provider_name ]( $this->plugin, $this->settings );
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Premium;
4
 
5
  use Exception;
6
+ use Wbcr_Factory429_Plugin;
7
 
8
  // Exit if accessed directly
9
  if ( ! defined( 'ABSPATH' ) ) {
24
  public static $providers;
25
 
26
  /**
27
+ * @var Wbcr_Factory429_Plugin
28
  */
29
  protected $plugin;
30
 
36
  /**
37
  * Manager constructor.
38
  *
39
+ * @param Wbcr_Factory429_Plugin $plugin
40
  * @param array $settings
41
  *
42
  * @throws Exception
43
  */
44
+ public function __construct( Wbcr_Factory429_Plugin $plugin, array $settings ) {
45
  $this->plugin = $plugin;
46
  $this->settings = $settings;
47
  }
48
 
49
  /**
50
+ * @param Wbcr_Factory429_Plugin $plugin
51
  * @param array $settings
52
  *
53
  * @return \WBCR\Factory_Freemius_000\Premium\Provider
54
  * @throws Exception
55
  */
56
+ public static function instance( Wbcr_Factory429_Plugin $plugin, array $settings ) {
57
  $premium_manager = new Manager( $plugin, $settings );
58
 
59
  return $premium_manager->instance_provider();
70
 
71
  if ( isset( self::$providers[ $provider_name ] ) && class_exists( self::$providers[ $provider_name ] ) ) {
72
  if ( self::$providers[ $provider_name ] instanceof Provider ) {
73
+ throw new Exception( "Provider {$provider_name} must extend the class WBCR\Factory_429\Premium\Provider interface!" );
74
  }
75
 
76
  return new self::$providers[ $provider_name ]( $this->plugin, $this->settings );
libs/factory/core/includes/premium/class-factory-provider-abstract.php CHANGED
@@ -1,12 +1,12 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Premium;
4
 
5
  use Exception;
6
- use Wbcr_Factory420_Plugin;
7
 
8
  // Exit if accessed directly
9
- if ( ! defined( 'ABSPATH' ) ) {
10
  exit;
11
  }
12
 
@@ -21,7 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) {
21
  abstract class Provider {
22
 
23
  /**
24
- * @var Wbcr_Factory420_Plugin
25
  */
26
  protected $plugin;
27
 
@@ -38,22 +38,22 @@ abstract class Provider {
38
  /**
39
  * Provider constructor.
40
  *
41
- * @param Wbcr_Factory420_Plugin $plugin
42
- * @param array $settings
43
  */
44
- public function __construct( Wbcr_Factory420_Plugin $plugin, array $settings ) {
45
- $this->plugin = $plugin;
 
46
  $this->settings = $settings;
47
 
48
- add_action( 'wbcr/factory/license_activate', [ $this, 'register_cron_hooks' ], 10, 2 );
49
- add_action( 'wbcr/factory/license_deactivate', [ $this, 'register_cron_hooks' ], 10, 2 );
50
- add_action( "{$this->plugin->getPluginName()}_license_autosync", [ $this, 'license_cron_sync' ] );
51
  }
52
 
53
  /**
54
  * @return array
55
  */
56
- public function get_settings() {
 
57
  return $this->settings;
58
  }
59
 
@@ -63,72 +63,83 @@ abstract class Provider {
63
  *
64
  * @return bool|mixed
65
  */
66
- public function get_setting( $name, $default = false ) {
67
- return isset( $this->settings[ $name ] ) && ! empty( $this->settings[ $name ] ) ? $this->settings[ $name ] : $default;
 
68
  }
69
 
70
  /**
71
  * @return bool|mixed
72
  */
73
- public function get_price() {
74
- return $this->get_setting( 'price' );
75
- }
76
-
77
- /**
78
- * todo: Вынести с лицензионный менеджер
79
- *
80
- * @param array $license_info
81
- * @param string $plugin_name
82
- */
83
- public function register_cron_hooks( $license_info, $plugin_name ) {
84
- if ( $this->plugin->getPluginName() == $plugin_name ) {
85
- if ( ! wp_next_scheduled( "{$plugin_name}_license_autosync" ) ) {
86
- wp_schedule_event( time(), 'twicedaily', "{$plugin_name}_license_autosync" );
87
- }
88
- }
89
- }
90
-
91
- /**
92
- * todo: вынести в лицензионный менеджер
93
- *
94
- * @param array $license_info
95
- * @param string $plugin_name
96
- */
97
- public function clear_cron_hooks( $license_info, $plugin_name ) {
98
- if ( $this->plugin->getPluginName() == $plugin_name ) {
99
- if ( wp_next_scheduled( "{$plugin_name}_license_autosync" ) ) {
100
- wp_clear_scheduled_hook( "{$plugin_name}_license_autosync" );
101
- }
102
- }
103
- }
104
-
105
- public function license_cron_sync() {
106
- $this->sync();
107
  }
108
 
109
  /**
110
  * @return bool
111
  */
112
- public function is_install_package() {
113
- if ( ! is_null( $this->is_install_package ) ) {
 
114
  return $this->is_install_package;
115
  }
116
 
 
117
  $premium_package = $this->get_package_data();
118
 
119
- if ( ! empty( $premium_package ) && ! empty( $premium_package['basename'] ) ) {
120
- $basename_part = explode( '/', $premium_package['basename'] );
121
- $is_valid_basename = sizeof( $basename_part ) === 2;
122
 
123
- if ( $is_valid_basename && ! file_exists( WP_PLUGIN_DIR . '/' . $premium_package['basename'] ) ) {
124
  $this->delete_package();
125
  $this->is_install_package = false;
126
 
127
  return false;
128
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  }
130
 
131
- $this->is_install_package = ! empty( $premium_package );
132
 
133
  return $this->is_install_package;
134
  }
@@ -136,15 +147,16 @@ abstract class Provider {
136
  /**
137
  * @return bool|mixed|null
138
  */
139
- public function get_package_data() {
140
- $premium_package = $this->plugin->getPopulateOption( 'premium_package' );
141
-
142
- if ( ! empty( $premium_package ) ) {
143
- return wp_parse_args( $premium_package, [
144
- 'basename' => null,
145
- 'version' => null,
 
146
  'framework_version' => null
147
- ] );
148
  }
149
 
150
  return null;
@@ -155,26 +167,62 @@ abstract class Provider {
155
  *
156
  * @throws Exception
157
  */
158
- public function update_package_data( array $package ) {
159
- $parsed_args = wp_parse_args( $package, [
160
- 'basename' => null,
161
- 'version' => null,
 
162
  'framework_version' => null
163
- ] );
164
 
165
- if ( empty( $parsed_args['basename'] ) || empty( $parsed_args['version'] ) ) {
166
- throw new Exception( 'You must pass the required attributes (basename, version).' );
167
  }
168
 
169
- $this->plugin->updatePopulateOption( 'premium_package', $parsed_args );
170
  $this->is_install_package = true;
171
  }
172
 
173
- public function delete_package() {
174
- $this->plugin->deletePopulateOption( 'premium_package' );
 
175
  $this->is_install_package = false;
176
  }
177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  /**
179
  * @return bool
180
  */
@@ -196,7 +244,7 @@ abstract class Provider {
196
  abstract public function get_billing_cycle();
197
 
198
  /**
199
- * @return \WBCR\Factory_420\Premium\Interfaces\License
200
  */
201
  abstract public function get_license();
202
 
@@ -210,7 +258,7 @@ abstract class Provider {
210
  *
211
  * @return mixed
212
  */
213
- abstract public function activate( $key );
214
 
215
  /**
216
  * @return bool
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Premium;
4
 
5
  use Exception;
6
+ use Wbcr_Factory429_Plugin;
7
 
8
  // Exit if accessed directly
9
+ if( !defined('ABSPATH') ) {
10
  exit;
11
  }
12
 
21
  abstract class Provider {
22
 
23
  /**
24
+ * @var Wbcr_Factory429_Plugin
25
  */
26
  protected $plugin;
27
 
38
  /**
39
  * Provider constructor.
40
  *
41
+ * @param Wbcr_Factory429_Plugin $plugin
42
+ * @param array $settings
43
  */
44
+ public function __construct(Wbcr_Factory429_Plugin $plugin, array $settings)
45
+ {
46
+ $this->plugin = $plugin;
47
  $this->settings = $settings;
48
 
49
+ $this->register_hooks();
 
 
50
  }
51
 
52
  /**
53
  * @return array
54
  */
55
+ public function get_settings()
56
+ {
57
  return $this->settings;
58
  }
59
 
63
  *
64
  * @return bool|mixed
65
  */
66
+ public function get_setting($name, $default = false)
67
+ {
68
+ return isset($this->settings[$name]) && !empty($this->settings[$name]) ? $this->settings[$name] : $default;
69
  }
70
 
71
  /**
72
  * @return bool|mixed
73
  */
74
+ public function get_price()
75
+ {
76
+ return $this->get_setting('price');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  }
78
 
79
  /**
80
  * @return bool
81
  */
82
+ public function is_install_package()
83
+ {
84
+ if( !is_null($this->is_install_package) ) {
85
  return $this->is_install_package;
86
  }
87
 
88
+ $premium_plugin_slug = $this->get_setting('slug');
89
  $premium_package = $this->get_package_data();
90
 
91
+ if( !empty($premium_package) && !empty($premium_package['basename']) ) {
92
+ $basename_part = explode('/', $premium_package['basename']);
93
+ $is_valid_basename = sizeof($basename_part) === 2;
94
 
95
+ if( $is_valid_basename && !file_exists(WP_PLUGIN_DIR . '/' . $premium_package['basename']) ) {
96
  $this->delete_package();
97
  $this->is_install_package = false;
98
 
99
  return false;
100
  }
101
+ } else if( $premium_plugin_slug && file_exists(WP_PLUGIN_DIR . '/' . $premium_plugin_slug) ) {
102
+ // If plugin is installed before we update the premium package in database.
103
+ // ------------------------------------------------------------------------
104
+ $plugins = get_plugins($plugin_folder = '');
105
+
106
+ if( !empty($plugins) ) {
107
+ foreach((array)$plugins as $plugin_base => $plugin) {
108
+ $basename_parts = explode('/', $plugin_base);
109
+ if( sizeof($basename_parts) == 2 && $basename_parts[0] == $premium_plugin_slug ) {
110
+
111
+ $plugin_basename = $plugin_base;
112
+ $plugin_main_file = WP_PLUGIN_DIR . '/' . $plugin_base;
113
+
114
+ $default_headers = [
115
+ 'Version' => 'Version',
116
+ 'FrameworkVersion' => 'Framework Version'
117
+ ];
118
+
119
+ $plugin_data = get_file_data($plugin_main_file, $default_headers, 'plugin');
120
+
121
+ $this->update_package_data([
122
+ 'basename' => $plugin_basename,
123
+ 'version' => $plugin_data['Version'],
124
+ 'framework_version' => isset($plugin_data['FrameworkVersion']) ? $plugin_data['FrameworkVersion'] : null,
125
+ ]);
126
+
127
+ $premium_package = $this->get_package_data();
128
+
129
+ /**
130
+ * @param string $plugin_name Имя плагина
131
+ *
132
+ * @param string $package Дополнительная информация о лицензии
133
+ * @since 4.1.1
134
+ *
135
+ */
136
+ do_action('wbcr/factory/premium/installed_package', $premium_package, $this->plugin->getPluginName());
137
+ }
138
+ }
139
+ }
140
  }
141
 
142
+ $this->is_install_package = !empty($premium_package);
143
 
144
  return $this->is_install_package;
145
  }
147
  /**
148
  * @return bool|mixed|null
149
  */
150
+ public function get_package_data()
151
+ {
152
+ $premium_package = $this->plugin->getPopulateOption('premium_package');
153
+
154
+ if( !empty($premium_package) ) {
155
+ return wp_parse_args($premium_package, [
156
+ 'basename' => null,
157
+ 'version' => null,
158
  'framework_version' => null
159
+ ]);
160
  }
161
 
162
  return null;
167
  *
168
  * @throws Exception
169
  */
170
+ public function update_package_data(array $package)
171
+ {
172
+ $parsed_args = wp_parse_args($package, [
173
+ 'basename' => null,
174
+ 'version' => null,
175
  'framework_version' => null
176
+ ]);
177
 
178
+ if( empty($parsed_args['basename']) || empty($parsed_args['version']) ) {
179
+ throw new Exception('You must pass the required attributes (basename, version).');
180
  }
181
 
182
+ $this->plugin->updatePopulateOption('premium_package', $parsed_args);
183
  $this->is_install_package = true;
184
  }
185
 
186
+ public function delete_package()
187
+ {
188
+ $this->plugin->deletePopulateOption('premium_package');
189
  $this->is_install_package = false;
190
  }
191
 
192
+ protected function register_hooks()
193
+ {
194
+ /**
195
+ * Добавляет крон задачу на синхронизацию лицензии
196
+ *
197
+ * @param array $license_info
198
+ * @param string $provider
199
+ */
200
+ add_action("{$this->plugin->getPluginName()}/factory/premium/license_activate", function ($provider, $license_info) {
201
+ if( !wp_next_scheduled("{$this->plugin->getPluginName()}_license_autosync") ) {
202
+ wp_schedule_event(time(), 'twicedaily', "{$this->plugin->getPluginName()}_license_autosync");
203
+ }
204
+ }, 10, 2);
205
+
206
+ /**
207
+ * Удаляет крон задачу на синхронизацию лицензии, когда лицензия деактивирована
208
+ *
209
+ * @param array $license_info
210
+ * @param string $provider
211
+ */
212
+ add_action("{$this->plugin->getPluginName()}/factory/premium/license_deactivate", function ($provider, $license_info) {
213
+ if( wp_next_scheduled("{$this->plugin->getPluginName()}_license_autosync") ) {
214
+ wp_clear_scheduled_hook("{$this->plugin->getPluginName()}_license_autosync");
215
+ }
216
+ }, 10, 2);
217
+
218
+ /**
219
+ * Обработчик крон задачи на синхронизацию лицензии, выполняется 2 раза в день.
220
+ */
221
+ add_action("{$this->plugin->getPluginName()}_license_autosync", function () {
222
+ $this->sync();
223
+ });
224
+ }
225
+
226
  /**
227
  * @return bool
228
  */
244
  abstract public function get_billing_cycle();
245
 
246
  /**
247
+ * @return \WBCR\Factory_429\Premium\Interfaces\License
248
  */
249
  abstract public function get_license();
250
 
258
  *
259
  * @return mixed
260
  */
261
+ abstract public function activate($key);
262
 
263
  /**
264
  * @return bool
libs/factory/core/includes/updates/class-factory-premium-upgrader.php CHANGED
@@ -1,18 +1,18 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Updates;
4
 
5
  use Exception;
6
  use Plugin_Installer_Skin;
7
  use Plugin_Upgrader;
8
- use Wbcr_Factory420_Plugin;
9
- use Wbcr_FactoryPages420_ImpressiveThemplate;
10
  use WP_Filesystem_Base;
11
  use WP_Upgrader;
12
  use WP_Upgrader_Skin;
13
 
14
  // Exit if accessed directly
15
- if ( ! defined( 'ABSPATH' ) ) {
16
  exit;
17
  }
18
 
@@ -34,97 +34,106 @@ class Premium_Upgrader extends Upgrader {
34
  /**
35
  * Manager constructor.
36
  *
37
- * @since 4.1.1
38
- *
39
  * @param $args
40
- * @param bool $is_premium
41
  *
42
- * @param Wbcr_Factory420_Plugin $plugin
43
  *
44
  * @throws Exception
 
 
45
  */
46
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
47
- parent::__construct( $plugin );
 
48
 
49
- $this->plugin_basename = null;
50
- $this->plugin_main_file = null;
51
  $this->plugin_absolute_path = null;
52
 
53
- if ( $this->plugin->premium->is_activate() && $this->plugin->premium->is_install_package() ) {
54
  $premium_package = $this->plugin->premium->get_package_data();
55
 
56
- if ( $premium_package ) {
57
- $this->plugin_basename = $premium_package['basename'];
58
- $this->plugin_main_file = WP_PLUGIN_DIR . '/' . $premium_package['basename'];
59
- $this->plugin_absolute_path = dirname( WP_PLUGIN_DIR . '/' . $premium_package['basename'] );
60
  }
61
  }
62
 
63
- if ( ! $this->repository->is_support_premium() ) {
64
  $settings = $this->get_settings();
65
- throw new Exception( "Repository {$settings['repository']} does not have support premium." );
66
  }
 
 
67
  }
68
 
69
  /**
70
  * @throws Exception
71
  */
72
- protected function set_repository() {
73
- $settings = $this->get_settings();
74
- $this->repository = $this->get_repository( $settings['repository'] );
 
75
 
76
- if ( $this->plugin->premium->is_activate() ) {
77
  $this->repository->init();
78
  }
79
  }
80
 
81
  /**
82
- * @since 4.1.1
83
  * @throws Exception
 
84
  */
85
- protected function init_hooks() {
86
- parent::init_hooks();
 
87
 
88
- if ( $this->need_intall_or_activate_premium() || $this->need_renew_license() || $this->need_activate_license() ) {
89
  // Показываем уведомление под бесплатным плагином, если требуется установить или активировать премиум пакет
90
- if ( $this->need_intall_or_activate_premium() ) {
91
  $free_plugin_base = $this->plugin->get_paths()->basename;
92
 
93
- add_action( "after_plugin_row_{$free_plugin_base}", [ $this, "notice_in_plugin_row" ], 100, 3 );
94
  }
95
 
96
  // Если установлен премиум пакет, то показываем уведомление под премиум плагином.
97
- if ( ( $this->need_renew_license() || $this->need_activate_license() ) && $this->plugin->premium->is_install_package() ) {
98
- $package = $this->plugin->premium->get_package_data();
99
  $premium_plugin_base = $package['basename'];
100
 
101
- add_action( "after_plugin_row_{$premium_plugin_base}", [ $this, "notice_in_plugin_row" ], 100, 3 );
102
  }
103
 
104
- add_action( "admin_print_styles-plugins.php", [ $this, "print_styles_for_plugin_row" ] );
105
- add_action( "wbcr/factory/admin_notices", [ $this, "admin_notices_hook" ], 10, 2 );
106
- add_action( 'wbcr/factory/pages/impressive/print_all_notices', [
107
  $this,
108
  'install_notice_in_plugin_interface'
109
- ], 10, 2 );
110
  }
111
 
112
- add_action( 'admin_init', [ $this, 'init_admin_actions' ] );
113
 
114
- add_action( 'deleted_plugin', [ $this, 'delete_plugin_hook' ], 10, 2 );
115
- add_action( 'upgrader_process_complete', [ $this, 'upgrader_process_complete_hook' ], 10, 2 );
116
  }
117
 
118
  /**
 
119
  * @since 4.1.1
120
  */
121
- public function init_admin_actions() {
122
- if ( isset( $_GET['wbcr_factory_premium_updates_action'] ) ) {
123
- $action = $this->plugin->request->get( 'wbcr_factory_premium_updates_action' );
124
 
125
- check_admin_referer( "factory_premium_{$action}" );
 
 
 
126
  try {
127
- switch ( $action ) {
128
  case 'install':
129
  $this->install();
130
  break;
@@ -143,7 +152,7 @@ class Premium_Upgrader extends Upgrader {
143
  break;
144
  }
145
  } catch( Exception $e ) {
146
- wp_die( $e->getMessage() );
147
  }
148
  }
149
  }
@@ -151,20 +160,21 @@ class Premium_Upgrader extends Upgrader {
151
  /**
152
  * Удаляет данные о пакете, если пользовать удалил премиум плагин
153
  *
154
- * @since 4.1.1
155
- *
156
  * @param $success
157
  *
158
  * @param $plugin_basename
 
 
159
  */
160
- public function delete_plugin_hook( $plugin_basename, $success ) {
161
- if ( ! $this->plugin->premium->is_install_package() ) {
 
162
  return;
163
  }
164
 
165
  $package = $this->plugin->premium->get_package_data();
166
 
167
- if ( $package['basename'] == $plugin_basename && $success ) {
168
  $this->plugin->premium->delete_package();
169
  }
170
  }
@@ -172,48 +182,49 @@ class Premium_Upgrader extends Upgrader {
172
  /**
173
  * Выводит уведомление на всех страницах админ панели Wordpress
174
  *
175
- * @since 4.1.1
176
- *
177
  * @param $notices
178
  *
179
  * @return array
 
 
180
  */
181
- public function admin_notices_hook( $notices, $plugin_name ) {
 
182
 
183
- if ( $plugin_name !== $this->plugin->getPluginName() || ! current_user_can( 'update_plugins' ) ) {
184
  return $notices;
185
  }
186
 
187
- if ( $this->need_intall_or_activate_premium() ) {
188
- $notice_text = $this->get_notice_text( 'please_activate_premium' );
189
 
190
- if ( ! $this->plugin->premium->is_install_package() ) {
191
- $notice_text = $this->get_notice_text( 'please_install_premium' );
192
  }
193
 
194
  $notices[] = [
195
- 'id' => 'please_install_premium_for_' . $this->plugin->getPluginName(),
196
- 'type' => 'warning',
197
- 'dismissible' => false,
198
  'dismiss_expires' => 0,
199
- 'text' => "<p><b>{$this->plugin->getPluginTitle()}:</b> " . $notice_text . '</p>'
200
  ];
201
- } else if ( $this->need_activate_license() ) {
202
  $notices[] = [
203
- 'id' => 'need_activate_premium_for_' . $this->plugin->getPluginName(),
204
- 'type' => 'warning',
205
- 'dismissible' => false,
206
  'dismiss_expires' => 0,
207
- 'text' => "<p><b>{$this->plugin->getPluginTitle()}:</b> " . $this->get_notice_text( 'need_activate_license' ) . '</p>'
208
  ];
209
- } else if ( $this->need_renew_license() ) {
210
  // todo: может быть перенести уведомление в премиум менеджер?
211
  $notices[] = [
212
- 'id' => 'license_exired_for_' . $this->plugin->getPluginName(),
213
- 'type' => 'warning',
214
- 'dismissible' => false,
215
  'dismiss_expires' => 0,
216
- 'text' => "<p><b>{$this->plugin->getPluginTitle()}:</b> " . $this->get_notice_text( 'need_renew_license' ) . '</p>'
217
  ];
218
  }
219
 
@@ -223,174 +234,188 @@ class Premium_Upgrader extends Upgrader {
223
  /**
224
  * Выводит уведомление внутри интерфейса плагина, на всех страницах плагина.
225
  *
226
- * @since 4.1.1
227
- *
228
- * @param Wbcr_FactoryPages420_ImpressiveThemplate $obj
229
  *
230
- * @param Wbcr_Factory420_Plugin $plugin
231
  *
232
  * @return void
 
 
233
  */
234
- public function install_notice_in_plugin_interface( $plugin, $obj ) {
235
- if ( $plugin->getPluginName() != $this->plugin->getPluginName() ) {
 
236
  return;
237
  }
238
 
239
  $notice_text = '';
240
 
241
- if ( $this->need_intall_or_activate_premium() ) {
242
- $notice_text = $this->get_notice_text( 'please_activate_premium' );
243
 
244
- if ( ! $this->plugin->premium->is_install_package() ) {
245
- $notice_text = $this->get_notice_text( 'please_install_premium' );
246
  }
247
- } else if ( $this->need_activate_license() ) {
248
- $notice_text = $this->get_notice_text( 'need_activate_license' );
249
- } else if ( $this->need_renew_license() ) {
250
- $notice_text = $this->get_notice_text( 'need_renew_license' );
251
  }
252
 
253
- $obj->printWarningNotice( $notice_text );
254
  }
255
 
256
  /**
257
  * Выводит уведомление в строке плагина (на странице плагинов),
258
  * что нужно установить премиум плагин.
259
  *
260
- * @since 4.1.1
261
- *
262
- * @param array $plugin_data
263
  * @param string $status
264
  *
265
  * @param string $plugin_file
266
  *
267
  * @return void
 
 
268
  * @see WP_Plugins_List_Table
269
  *
270
  */
271
- public function notice_in_plugin_row( $plugin_file, $plugin_data, $status ) {
 
272
 
273
- if ( ! current_user_can( 'update_plugins' ) ) {
274
  return;
275
  };
276
 
277
  $notice_text = '';
278
 
279
- if ( $this->need_intall_or_activate_premium() ) {
280
- $notice_text = $this->get_notice_text( 'please_activate_premium' );
281
 
282
- if ( ! $this->plugin->premium->is_install_package() ) {
283
- $notice_text = $this->get_notice_text( 'please_install_premium' );
284
  }
285
- } else if ( $this->need_activate_license() ) {
286
- $notice_text = $this->get_notice_text( 'need_activate_license' );
287
- } else if ( $this->need_renew_license() ) {
288
- $notice_text = $this->get_notice_text( 'need_renew_license' );
289
  }
290
 
291
  ?>
292
- <tr class="plugin-update-tr active update wbcr-factory-updates">
293
- <td colspan="3" class="plugin-update colspanchange">
294
- <div class="update-message notice inline notice-warning notice-alt">
295
- <p>
296
  <?php echo $notice_text; ?>
297
- </p>
298
- </div>
299
- </td>
300
- </tr>
301
  <?php
302
  }
303
 
304
  /**
305
  * Печатает стили для уведомления о загрузке премиум версии на странице плагинов.
306
  *
307
- * @since 4.1.1
308
  * @return void
 
309
  */
310
- public function print_styles_for_plugin_row() {
 
311
 
312
- if ( ! current_user_can( 'update_plugins' ) ) {
313
  return;
314
  }
315
 
316
  $plugin_base = $this->plugin->get_paths()->basename;
317
 
318
- if ( $this->need_intall_or_activate_premium() ) {
319
  $message_background_color = '#f5e9f5';
320
- $message_border_color = '#dab9da';
321
- } else if ( $this->need_renew_license() || $this->need_activate_license() ) {
322
  $message_background_color = '#ffe2e0';
323
- $message_border_color = '#F44336';
324
- if ( $this->plugin->premium->is_install_package() ) {
325
- $package = $this->plugin->premium->get_package_data();
326
  $plugin_base = $package['basename'];
327
  }
328
  }
329
 
330
  ?>
331
- <style>
332
- tr[data-plugin="<?php echo $plugin_base; ?>"] th,
333
- tr[data-plugin="<?php echo $plugin_base; ?>"] td {
334
- box-shadow: none !important;
335
- }
336
-
337
- .wbcr-factory-updates .update-message {
338
- background-color: <?php echo esc_attr($message_background_color); ?> !important;
339
- border-color: <?php echo esc_attr($message_border_color); ?> !important;
340
- }
341
- </style>
342
  <?php
343
  }
344
 
 
345
  /**
346
  * Обновляет данные о премиум пакете в базе данных, после обновления плагина.
347
  *
348
- * @since 4.1.1
349
- *
350
- * @param array $options
351
- *
352
- * @param WP_Upgrader $upgrader_object
353
  *
 
354
  * @throws Exception
355
  */
356
- public function upgrader_process_complete_hook( $upgrader_object, $options ) {
357
- if ( ! empty( $options ) && $options['action'] == 'update' && $options['type'] == 'plugin' ) {
358
- if ( is_array( $options['plugins'] ) && in_array( $this->plugin_basename, $options['plugins'] ) ) {
 
 
 
 
 
 
 
 
 
 
359
  $this->update_package_data();
360
  }
361
  }
362
  }
363
 
364
  /**
365
- * @since 4.1.1
366
  * @return array
 
367
  */
368
- protected function get_settings() {
369
- $settings = $this->plugin->getPluginInfoAttr( 'license_settings' );
 
370
 
371
- $updates_settings = isset( $settings['updates_settings'] ) ? $settings['updates_settings'] : [];
372
 
373
- if ( is_array( $settings ) ) {
374
  $updates_settings['repository'] = $settings['provider'];
375
- $updates_settings['slug'] = $settings['slug'];
376
  }
377
 
378
- return wp_parse_args( $updates_settings, [
379
- 'repository' => 'wordpress',
380
- 'slug' => '',
381
- 'maybe_rollback' => false,
382
  'rollback_settings' => [
383
  'prev_stable_version' => '0.0.0'
384
  ]
385
- ] );
386
  }
387
 
388
  /**
389
- * @since 4.1.1
390
  * @return string
 
391
  */
392
- protected function get_plugin_version() {
393
- if ( ! $this->plugin->premium->is_install_package() ) {
 
394
  return '0.0.0';
395
  }
396
 
@@ -400,57 +425,64 @@ class Premium_Upgrader extends Upgrader {
400
  }
401
 
402
  /**
403
- * @since 4.1.1
404
- *
405
  * @param $args
406
  *
407
  * @return string
 
 
408
  */
409
- protected function get_admin_url( $args ) {
410
- $url = admin_url( 'plugins.php', $args );
 
411
 
412
- if ( $this->plugin->isNetworkActive() ) {
413
- $url = network_admin_url( 'plugins.php', $args );
414
  }
415
 
416
- return add_query_arg( $args, $url );
417
  }
418
 
419
  /**
420
- * @since 4.1.1
421
- *
422
  * @param string $action
423
  *
424
  * @return string
 
 
425
  */
426
- protected function get_action_url( $action ) {
427
- $args = [ 'wbcr_factory_premium_updates_action' => $action ];
 
 
 
 
428
 
429
- return wp_nonce_url( $this->get_admin_url( $args ), "factory_premium_{$action}" );
430
  }
431
 
432
  /**
433
- * @since 4.1.1
434
  * @return string
 
435
  */
436
- protected function get_activate_premium_url() {
 
437
  $args = [
438
  'action' => 'activate',
439
  'plugin' => $this->plugin_basename,
440
  ];
441
 
442
- return wp_nonce_url( $this->get_admin_url( $args ), "activate-plugin_{$this->plugin_basename}" );
443
  }
444
 
445
  /**
446
  * Нужно установить или обновить премиум?
447
  *
448
- * @since 4.1.1
449
  * @return bool
 
450
  */
451
- protected function need_intall_or_activate_premium() {
452
- if ( $this->plugin->premium->is_activate() && $this->plugin->premium->is_active() ) {
453
- if ( $this->plugin->premium->is_install_package() && is_plugin_active( $this->plugin_basename ) ) {
 
454
  return false;
455
  }
456
 
@@ -463,164 +495,167 @@ class Premium_Upgrader extends Upgrader {
463
  /**
464
  * Требуется активировать лицензию?
465
  *
466
- * @since 4.1.1
467
  * @return bool
 
468
  */
469
- protected function need_activate_license() {
470
- return ! $this->plugin->premium->is_activate() && $this->plugin->premium->is_install_package();
 
471
  }
472
 
473
  /**
474
  * Нужно продлить лицензию?
475
  *
476
- * @since 4.1.1
477
  * @return bool
 
478
  */
479
- protected function need_renew_license() {
480
- return $this->plugin->premium->is_activate() && ! $this->plugin->premium->is_active();
 
481
  }
482
 
483
  /**
484
- * @since 4.1.1
485
  * @throws Exception
 
486
  */
487
- protected function install() {
 
488
  global $wp_filesystem;
489
 
490
- if ( ! current_user_can( 'install_plugins' ) ) {
491
- throw new Exception( 'Sorry, you are not allowed to install plugins on this site.', 'not_allowed_install_plugin' );
492
  }
493
 
494
- if ( $this->plugin->premium->is_install_package() ) {
495
  return;
496
  }
497
 
498
- if ( ! $wp_filesystem ) {
499
- if ( ! function_exists( 'WP_Filesystem' ) ) {
500
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
501
  }
502
  WP_Filesystem();
503
  }
504
 
505
- if ( ! WP_Filesystem( false, WP_PLUGIN_DIR ) ) {
506
- throw new Exception( 'You are not allowed to edt folders/files on this site', 'not_allowed_edit_filesystem' );
507
  } else {
508
 
509
  $download_url = $this->repository->get_download_url();
510
 
511
  /**
512
- * @since 4.1.1
513
  *
514
- * @param string $plugin_name Имя плагина
 
515
  *
516
- * @param string $package Дополнительная информация о лицензии
517
  */
518
- do_action( 'wbcr/factory/premium/install_package', $download_url, $this->plugin->getPluginName() );
519
 
520
  // If plugin is installed before we update the premium package in database.
521
  // ------------------------------------------------------------------------
522
- $plugins = get_plugins( $plugin_folder = '' );
523
-
524
- if ( ! empty( $plugins ) ) {
525
- foreach ( (array) $plugins as $plugin_base => $plugin ) {
526
- $basename_parts = explode( '/', $plugin_base );
527
- if ( sizeof( $basename_parts ) == 2 && $basename_parts[0] == $this->plugin_slug ) {
528
-
529
- $this->plugin_basename = $plugin_base;
530
- $this->plugin_main_file = WP_PLUGIN_DIR . '/' . $plugin_base;
531
- $this->plugin_absolute_path = dirname( WP_PLUGIN_DIR . '/' . $plugin_base );
532
-
533
- $this->update_package_data();
534
-
535
- $package = $this->plugin->premium->get_package_data();
536
-
537
- /**
538
- * @since 4.1.1
539
- *
540
- * @param string $plugin_name Имя плагина
541
- *
542
- * @param string $package Дополнительная информация о лицензии
543
- */
544
- do_action( 'wbcr/factory/premium/installed_package', $package, $this->plugin->getPluginName() );
545
-
546
- return;
547
- }
548
- }
549
- }
550
  // ------------------------------------------------------------------------
551
 
552
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
553
- require_once( ABSPATH . 'wp-admin/includes/misc.php' );
554
 
555
- if ( ! class_exists( 'Plugin_Upgrader', false ) ) {
556
  // Include required resources for the installation.
557
  require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
558
  }
559
 
560
  $skin_args = [
561
- 'type' => 'web',
562
- 'title' => sprintf( 'Installing plugin: %s', $this->plugin->getPluginTitle() . ' Premium' ),
563
- 'url' => esc_url_raw( $download_url ),
564
- 'nonce' => 'install-plugin_' . $this->plugin_slug,
565
  'plugin' => '',
566
- 'api' => null,
567
- 'extra' => [
568
  'slug' => $this->plugin_slug
569
  ],
570
  ];
571
 
572
- require_once( ABSPATH . 'wp-admin/admin-header.php' );
573
 
574
- if ( ! $this->plugin->premium->is_install_package() ) {
575
- $skin = new Plugin_Installer_Skin( $skin_args );
576
  } else {
577
- $skin = new WP_Upgrader_Skin( $skin_args );
578
  }
579
 
580
- $upgrader = new Plugin_Upgrader( $skin );
581
 
582
- if ( empty( $download_url ) ) {
583
- throw new Exception( 'You must pass the download url to upgrade up premium package.', "not_passed_download_url" );
584
  }
585
 
586
- $install_result = $upgrader->install( $download_url );
587
 
588
- include( ABSPATH . 'wp-admin/admin-footer.php' );
589
 
590
- if ( is_wp_error( $install_result ) ) {
591
- throw new Exception( $install_result->get_error_message(), $install_result->get_error_code() );
592
- } else if ( is_wp_error( $skin->result ) ) {
593
- throw new Exception( $skin->result->get_error_message(), $skin->result->get_error_code() );
594
- } else if ( is_null( $install_result ) ) {
595
  global $wp_filesystem;
596
 
597
- $error_code = 'unable_to_connect_to_filesystem';
598
  $error_message = 'Unable to connect to the filesystem. Please confirm your credentials.';
599
 
600
  // Pass through the error from WP_Filesystem if one was raised.
601
- if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
602
  $error_message = $wp_filesystem->errors->get_error_message();
603
  }
604
 
605
- throw new Exception( $error_message, $error_code );
606
  }
607
 
608
- $this->plugin_basename = $upgrader->plugin_info();
609
- $this->plugin_main_file = WP_PLUGIN_DIR . '/' . $this->plugin_basename;
610
- $this->plugin_absolute_path = dirname( WP_PLUGIN_DIR . '/' . $this->plugin_basename );
611
 
612
  $this->update_package_data();
613
 
614
  $package = $this->plugin->premium->get_package_data();
615
 
616
  /**
617
- * @since 4.1.1
618
  *
619
- * @param string $plugin_name Имя плагина
 
620
  *
621
- * @param string $package Дополнительная информация о лицензии
622
  */
623
- do_action( 'wbcr/factory/premium/installed_package', $package, $this->plugin->getPluginName() );
624
 
625
  die();
626
  }
@@ -630,147 +665,151 @@ class Premium_Upgrader extends Upgrader {
630
  * @return bool
631
  * @throws Exception
632
  */
633
- protected function delete() {
634
- if ( ! $this->plugin->premium->is_install_package() ) {
 
635
  return false;
636
  }
637
 
638
  $package = $this->plugin->premium->get_package_data();
639
 
640
  /**
641
- * @since 4.1.1
642
  *
643
- * @param string $plugin_name Имя плагина
 
644
  *
645
- * @param string $package Дополнительная информация о лицензии
646
  */
647
- do_action( 'wbcr/factory/premium/delete_package', $package, $this->plugin->getPluginName() );
648
 
649
- if ( is_plugin_active( $package['basename'] ) ) {
650
- if ( is_multisite() && is_plugin_active_for_network( $package['basename'] ) ) {
651
- deactivate_plugins( $package['basename'], false, true );
652
  } else {
653
- deactivate_plugins( $package['basename'] );
654
  }
655
  }
656
 
657
- $result = delete_plugins( [ $package['basename'] ] );
658
 
659
- if ( is_wp_error( $result ) ) {
660
- throw new Exception( $result->get_error_message(), $result->get_error_code() );
661
  }
662
 
663
  $this->plugin->premium->delete_package();
664
 
665
  /**
666
- * @since 4.1.1
667
  *
668
- * @param string $plugin_name Имя плагина
 
669
  *
670
- * @param string $package Дополнительная информация о лицензии
671
  */
672
- do_action( 'wbcr/factory/premium/deleted_package', $package, $this->plugin->getPluginName() );
673
 
674
  return true;
675
  }
676
 
677
  /**
678
- * @since 4.1.1
679
  * @return bool
 
680
  */
681
- protected function deactivate() {
682
- if ( ! $this->plugin->premium->is_install_package() || ! is_plugin_active( $this->plugin_basename ) ) {
 
683
  return false;
684
  }
685
 
686
  $package = $this->plugin->premium->get_package_data();
687
 
688
  /**
689
- * @since 4.1.1
690
  *
691
- * @param string $plugin_name Имя плагина
 
692
  *
693
- * @param string $package Дополнительная информация о лицензии
694
  */
695
- do_action( 'wbcr/factory/premium/deactivate_package', $package, $this->plugin->getPluginName() );
696
 
697
- if ( is_multisite() && is_plugin_active_for_network( $this->plugin_basename ) ) {
698
- deactivate_plugins( $this->plugin_basename, false, true );
699
  } else {
700
- deactivate_plugins( $this->plugin_basename );
701
  }
702
 
703
  /**
704
- * @since 4.1.1
705
  *
706
- * @param string $plugin_name Имя плагина
 
707
  *
708
- * @param string $package Дополнительная информация о лицензии
709
  */
710
- do_action( 'wbcr/factory/premium/deactivated_package', $package, $this->plugin->getPluginName() );
711
 
712
  return true;
713
  }
714
 
715
  /**
716
- * @since 4.1.1
717
- *
718
  * @param array $plugin_data
719
  *
720
  * @throws Exception
 
 
721
  */
722
- protected function update_package_data() {
 
723
 
724
- if ( ! $this->plugin_main_file ) {
725
  return;
726
  }
727
 
728
  $default_headers = [
729
- 'Version' => 'Version',
730
  'FrameworkVersion' => 'Framework Version'
731
  ];
732
 
733
- $plugin_data = get_file_data( $this->plugin_main_file, $default_headers, 'plugin' );
734
 
735
- $this->plugin->premium->update_package_data( [
736
- 'basename' => $this->plugin_basename,
737
- 'version' => $plugin_data['Version'],
738
- 'framework_version' => isset( $plugin_data['FrameworkVersion'] ) ? $plugin_data['FrameworkVersion'] : null,
739
- ] );
740
  }
741
 
742
  /**
743
- * @since 4.1.1
744
- *
745
  * @param string $type
746
  *
747
  * @return string|null
 
 
748
  */
749
- private function get_notice_text( $type ) {
750
- $upgrade_url = $this->get_action_url( 'install' );
 
751
  $activate_plugin_url = $this->get_activate_premium_url();
752
- $cancel_license_url = $this->get_action_url( 'cancel_license' );
753
 
754
  $texts = [
755
- 'need_activate_license' => __( 'License activation required. A license is required to get premium plugin updates, as well as to get additional services.', 'wbcr_factory_420' ),
756
- 'need_renew_license' => __( 'Your license has expired. You can no longer get premium plugin updates, premium support and your access to Webcraftic services has been suspended.', 'wbcr_factory_420' ),
757
- 'please_install_premium' => sprintf( __( 'Congratulations, you have activated a premium license! Please install premium add-on to use pro features now.
758
- <a href="%s">Install</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_420' ), $upgrade_url, $cancel_license_url ),
759
- 'please_activate_premium' => sprintf( __( 'Congratulations, you have activated a premium license! Please activate premium add-on to use pro features now.
760
- <a href="%s">Activate</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_420' ), $activate_plugin_url, $cancel_license_url )
761
  ];
762
 
763
- if ( isset( $texts[ $type ] ) ) {
764
 
765
  /**
766
- * @since 4.1.1
767
- *
768
  * @param string $type
769
  * @param string $plugin_name
770
  *
771
- * @param array $messages
 
 
772
  */
773
- return apply_filters( 'wbcr/factory/premium/notice_text', $texts[ $type ], $type, $this->plugin->getPluginName() );
774
  }
775
 
776
  return null;
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Updates;
4
 
5
  use Exception;
6
  use Plugin_Installer_Skin;
7
  use Plugin_Upgrader;
8
+ use Wbcr_Factory429_Plugin;
9
+ use Wbcr_FactoryPages429_ImpressiveThemplate;
10
  use WP_Filesystem_Base;
11
  use WP_Upgrader;
12
  use WP_Upgrader_Skin;
13
 
14
  // Exit if accessed directly
15
+ if( !defined('ABSPATH') ) {
16
  exit;
17
  }
18
 
34
  /**
35
  * Manager constructor.
36
  *
 
 
37
  * @param $args
38
+ * @param bool $is_premium
39
  *
40
+ * @param Wbcr_Factory429_Plugin $plugin
41
  *
42
  * @throws Exception
43
+ * @since 4.1.1
44
+ *
45
  */
46
+ public function __construct(Wbcr_Factory429_Plugin $plugin)
47
+ {
48
+ parent::__construct($plugin);
49
 
50
+ $this->plugin_basename = null;
51
+ $this->plugin_main_file = null;
52
  $this->plugin_absolute_path = null;
53
 
54
+ if( $this->plugin->premium->is_activate() && $this->plugin->premium->is_install_package() ) {
55
  $premium_package = $this->plugin->premium->get_package_data();
56
 
57
+ if( $premium_package ) {
58
+ $this->plugin_basename = $premium_package['basename'];
59
+ $this->plugin_main_file = WP_PLUGIN_DIR . '/' . $premium_package['basename'];
60
+ $this->plugin_absolute_path = dirname(WP_PLUGIN_DIR . '/' . $premium_package['basename']);
61
  }
62
  }
63
 
64
+ if( !$this->repository->is_support_premium() ) {
65
  $settings = $this->get_settings();
66
+ throw new Exception("Repository {$settings['repository']} does not have support premium.");
67
  }
68
+
69
+ $this->init_premium_hooks();
70
  }
71
 
72
  /**
73
  * @throws Exception
74
  */
75
+ protected function set_repository()
76
+ {
77
+ $settings = $this->get_settings();
78
+ $this->repository = $this->get_repository($settings['repository']);
79
 
80
+ if( $this->plugin->premium->is_activate() ) {
81
  $this->repository->init();
82
  }
83
  }
84
 
85
  /**
 
86
  * @throws Exception
87
+ * @since 4.1.1
88
  */
89
+ protected function init_premium_hooks()
90
+ {
91
+ //parent::init_hooks();
92
 
93
+ if( $this->need_intall_or_activate_premium() || $this->need_renew_license() || $this->need_activate_license() ) {
94
  // Показываем уведомление под бесплатным плагином, если требуется установить или активировать премиум пакет
95
+ if( $this->need_intall_or_activate_premium() ) {
96
  $free_plugin_base = $this->plugin->get_paths()->basename;
97
 
98
+ add_action("after_plugin_row_{$free_plugin_base}", [$this, "notice_in_plugin_row"], 100, 3);
99
  }
100
 
101
  // Если установлен премиум пакет, то показываем уведомление под премиум плагином.
102
+ if( ($this->need_renew_license() || $this->need_activate_license()) && $this->plugin->premium->is_install_package() ) {
103
+ $package = $this->plugin->premium->get_package_data();
104
  $premium_plugin_base = $package['basename'];
105
 
106
+ add_action("after_plugin_row_{$premium_plugin_base}", [$this, "notice_in_plugin_row"], 100, 3);
107
  }
108
 
109
+ add_action("admin_print_styles-plugins.php", [$this, "print_styles_for_plugin_row"]);
110
+ add_action("wbcr/factory/admin_notices", [$this, "admin_notices_hook"], 10, 2);
111
+ add_action('wbcr/factory/pages/impressive/print_all_notices', [
112
  $this,
113
  'install_notice_in_plugin_interface'
114
+ ], 10, 2);
115
  }
116
 
117
+ add_action('admin_init', [$this, 'init_admin_actions']);
118
 
119
+ add_action('deleted_plugin', [$this, 'delete_plugin_hook'], 10, 2);
120
+ add_action('upgrader_process_complete', [$this, 'upgrader_process_complete_hook'], 10, 2);
121
  }
122
 
123
  /**
124
+ * @since 4.2.2 Fixed bug with plugins namespace (ISW-4)
125
  * @since 4.1.1
126
  */
127
+ public function init_admin_actions()
128
+ {
129
+ $plugin_slug = $this->plugin->request->get('wfactory_premium_updates_plugin', null);
130
 
131
+ if( isset($_GET['wfactory_premium_updates_action']) && $this->plugin_slug === $plugin_slug ) {
132
+ $action = $this->plugin->request->get('wfactory_premium_updates_action');
133
+
134
+ check_admin_referer("factory_premium_{$action}");
135
  try {
136
+ switch( $action ) {
137
  case 'install':
138
  $this->install();
139
  break;
152
  break;
153
  }
154
  } catch( Exception $e ) {
155
+ wp_die($e->getMessage());
156
  }
157
  }
158
  }
160
  /**
161
  * Удаляет данные о пакете, если пользовать удалил премиум плагин
162
  *
 
 
163
  * @param $success
164
  *
165
  * @param $plugin_basename
166
+ * @since 4.1.1
167
+ *
168
  */
169
+ public function delete_plugin_hook($plugin_basename, $success)
170
+ {
171
+ if( !$this->plugin->premium->is_install_package() ) {
172
  return;
173
  }
174
 
175
  $package = $this->plugin->premium->get_package_data();
176
 
177
+ if( $package['basename'] == $plugin_basename && $success ) {
178
  $this->plugin->premium->delete_package();
179
  }
180
  }
182
  /**
183
  * Выводит уведомление на всех страницах админ панели Wordpress
184
  *
 
 
185
  * @param $notices
186
  *
187
  * @return array
188
+ * @since 4.1.1
189
+ *
190
  */
191
+ public function admin_notices_hook($notices, $plugin_name)
192
+ {
193
 
194
+ if( $plugin_name !== $this->plugin->getPluginName() || !current_user_can('update_plugins') ) {
195
  return $notices;
196
  }
197
 
198
+ if( $this->need_intall_or_activate_premium() ) {
199
+ $notice_text = $this->get_notice_text('please_activate_premium');
200
 
201
+ if( !$this->plugin->premium->is_install_package() ) {
202
+ $notice_text = $this->get_notice_text('please_install_premium');
203
  }
204
 
205
  $notices[] = [
206
+ 'id' => 'please_install_premium_for_' . $this->plugin->getPluginName(),
207
+ 'type' => 'warning',
208
+ 'dismissible' => false,
209
  'dismiss_expires' => 0,
210
+ 'text' => "<p><b>{$this->plugin->getPluginTitle()}:</b> " . $notice_text . '</p>'
211
  ];
212
+ } else if( $this->need_activate_license() ) {
213
  $notices[] = [
214
+ 'id' => 'need_activate_premium_for_' . $this->plugin->getPluginName(),
215
+ 'type' => 'warning',
216
+ 'dismissible' => false,
217
  'dismiss_expires' => 0,
218
+ 'text' => "<p><b>{$this->plugin->getPluginTitle()}:</b> " . $this->get_notice_text('need_activate_license') . '</p>'
219
  ];
220
+ } else if( $this->need_renew_license() ) {
221
  // todo: может быть перенести уведомление в премиум менеджер?
222
  $notices[] = [
223
+ 'id' => 'license_exired_for_' . $this->plugin->getPluginName(),
224
+ 'type' => 'warning',
225
+ 'dismissible' => false,
226
  'dismiss_expires' => 0,
227
+ 'text' => "<p><b>{$this->plugin->getPluginTitle()}:</b> " . $this->get_notice_text('need_renew_license') . '</p>'
228
  ];
229
  }
230
 
234
  /**
235
  * Выводит уведомление внутри интерфейса плагина, на всех страницах плагина.
236
  *
237
+ * @param Wbcr_FactoryPages429_ImpressiveThemplate $obj
 
 
238
  *
239
+ * @param Wbcr_Factory429_Plugin $plugin
240
  *
241
  * @return void
242
+ * @since 4.1.1
243
+ *
244
  */
245
+ public function install_notice_in_plugin_interface($plugin, $obj)
246
+ {
247
+ if( $plugin->getPluginName() != $this->plugin->getPluginName() ) {
248
  return;
249
  }
250
 
251
  $notice_text = '';
252
 
253
+ if( $this->need_intall_or_activate_premium() ) {
254
+ $notice_text = $this->get_notice_text('please_activate_premium');
255
 
256
+ if( !$this->plugin->premium->is_install_package() ) {
257
+ $notice_text = $this->get_notice_text('please_install_premium');
258
  }
259
+ } else if( $this->need_activate_license() ) {
260
+ $notice_text = $this->get_notice_text('need_activate_license');
261
+ } else if( $this->need_renew_license() ) {
262
+ $notice_text = $this->get_notice_text('need_renew_license');
263
  }
264
 
265
+ $obj->printWarningNotice($notice_text);
266
  }
267
 
268
  /**
269
  * Выводит уведомление в строке плагина (на странице плагинов),
270
  * что нужно установить премиум плагин.
271
  *
272
+ * @param array $plugin_data
 
 
273
  * @param string $status
274
  *
275
  * @param string $plugin_file
276
  *
277
  * @return void
278
+ * @since 4.1.1
279
+ *
280
  * @see WP_Plugins_List_Table
281
  *
282
  */
283
+ public function notice_in_plugin_row($plugin_file, $plugin_data, $status)
284
+ {
285
 
286
+ if( !current_user_can('update_plugins') ) {
287
  return;
288
  };
289
 
290
  $notice_text = '';
291
 
292
+ if( $this->need_intall_or_activate_premium() ) {
293
+ $notice_text = $this->get_notice_text('please_activate_premium');
294
 
295
+ if( !$this->plugin->premium->is_install_package() ) {
296
+ $notice_text = $this->get_notice_text('please_install_premium');
297
  }
298
+ } else if( $this->need_activate_license() ) {
299
+ $notice_text = $this->get_notice_text('need_activate_license');
300
+ } else if( $this->need_renew_license() ) {
301
+ $notice_text = $this->get_notice_text('need_renew_license');
302
  }
303
 
304
  ?>
305
+ <tr class="plugin-update-tr active update wbcr-factory-updates">
306
+ <td colspan="3" class="plugin-update colspanchange">
307
+ <div class="update-message notice inline notice-warning notice-alt">
308
+ <p>
309
  <?php echo $notice_text; ?>
310
+ </p>
311
+ </div>
312
+ </td>
313
+ </tr>
314
  <?php
315
  }
316
 
317
  /**
318
  * Печатает стили для уведомления о загрузке премиум версии на странице плагинов.
319
  *
 
320
  * @return void
321
+ * @since 4.1.1
322
  */
323
+ public function print_styles_for_plugin_row()
324
+ {
325
 
326
+ if( !current_user_can('update_plugins') ) {
327
  return;
328
  }
329
 
330
  $plugin_base = $this->plugin->get_paths()->basename;
331
 
332
+ if( $this->need_intall_or_activate_premium() ) {
333
  $message_background_color = '#f5e9f5';
334
+ $message_border_color = '#dab9da';
335
+ } else if( $this->need_renew_license() || $this->need_activate_license() ) {
336
  $message_background_color = '#ffe2e0';
337
+ $message_border_color = '#F44336';
338
+ if( $this->plugin->premium->is_install_package() ) {
339
+ $package = $this->plugin->premium->get_package_data();
340
  $plugin_base = $package['basename'];
341
  }
342
  }
343
 
344
  ?>
345
+ <style>
346
+ tr[data-plugin="<?php echo $plugin_base; ?>"] th,
347
+ tr[data-plugin="<?php echo $plugin_base; ?>"] td {
348
+ box-shadow: none !important;
349
+ }
350
+
351
+ .wbcr-factory-updates .update-message {
352
+ background-color: <?php echo esc_attr($message_background_color); ?> !important;
353
+ border-color: <?php echo esc_attr($message_border_color); ?> !important;
354
+ }
355
+ </style>
356
  <?php
357
  }
358
 
359
+
360
  /**
361
  * Обновляет данные о премиум пакете в базе данных, после обновления плагина.
362
  *
363
+ * @param WP_Upgrader $wp_upgrader WP_Upgrader instance.
364
+ * @param array $hook_extra Array of bulk item update data.
 
 
 
365
  *
366
+ * @return void
367
  * @throws Exception
368
  */
369
+ public function upgrader_process_complete_hook($upgrader_object, $hook_extra)
370
+ {
371
+ if( !empty($hook_extra) && $hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' ) {
372
+
373
+ # if it isn't bulk upgrade
374
+ if( isset($hook_extra['plugin']) && $this->plugin_basename === $hook_extra['plugin'] ) {
375
+ $this->update_package_data();
376
+
377
+ return;
378
+ }
379
+
380
+ # if it is bulk upgrade
381
+ if( is_array($hook_extra['plugins']) && in_array($this->plugin_basename, $hook_extra['plugins']) ) {
382
  $this->update_package_data();
383
  }
384
  }
385
  }
386
 
387
  /**
 
388
  * @return array
389
+ * @since 4.1.1
390
  */
391
+ protected function get_settings()
392
+ {
393
+ $settings = $this->plugin->getPluginInfoAttr('license_settings');
394
 
395
+ $updates_settings = isset($settings['updates_settings']) ? $settings['updates_settings'] : [];
396
 
397
+ if( is_array($settings) ) {
398
  $updates_settings['repository'] = $settings['provider'];
399
+ $updates_settings['slug'] = $settings['slug'];
400
  }
401
 
402
+ return wp_parse_args($updates_settings, [
403
+ 'repository' => 'wordpress',
404
+ 'slug' => '',
405
+ 'maybe_rollback' => false,
406
  'rollback_settings' => [
407
  'prev_stable_version' => '0.0.0'
408
  ]
409
+ ]);
410
  }
411
 
412
  /**
 
413
  * @return string
414
+ * @since 4.1.1
415
  */
416
+ protected function get_plugin_version()
417
+ {
418
+ if( !$this->plugin->premium->is_install_package() ) {
419
  return '0.0.0';
420
  }
421
 
425
  }
426
 
427
  /**
 
 
428
  * @param $args
429
  *
430
  * @return string
431
+ * @since 4.1.1
432
+ *
433
  */
434
+ protected function get_admin_url($args)
435
+ {
436
+ $url = admin_url('plugins.php', $args);
437
 
438
+ if( $this->plugin->isNetworkActive() ) {
439
+ $url = network_admin_url('plugins.php', $args);
440
  }
441
 
442
+ return add_query_arg($args, $url);
443
  }
444
 
445
  /**
 
 
446
  * @param string $action
447
  *
448
  * @return string
449
+ * @since 4.1.1
450
+ *
451
  */
452
+ protected function get_action_url($action)
453
+ {
454
+ $args = [
455
+ 'wfactory_premium_updates_action' => $action,
456
+ 'wfactory_premium_updates_plugin' => $this->plugin_slug
457
+ ];
458
 
459
+ return wp_nonce_url($this->get_admin_url($args), "factory_premium_{$action}");
460
  }
461
 
462
  /**
 
463
  * @return string
464
+ * @since 4.1.1
465
  */
466
+ protected function get_activate_premium_url()
467
+ {
468
  $args = [
469
  'action' => 'activate',
470
  'plugin' => $this->plugin_basename,
471
  ];
472
 
473
+ return wp_nonce_url($this->get_admin_url($args), "activate-plugin_{$this->plugin_basename}");
474
  }
475
 
476
  /**
477
  * Нужно установить или обновить премиум?
478
  *
 
479
  * @return bool
480
+ * @since 4.1.1
481
  */
482
+ protected function need_intall_or_activate_premium()
483
+ {
484
+ if( $this->plugin->premium->is_activate() && $this->plugin->premium->is_active() ) {
485
+ if( $this->plugin->premium->is_install_package() && is_plugin_active($this->plugin_basename) ) {
486
  return false;
487
  }
488
 
495
  /**
496
  * Требуется активировать лицензию?
497
  *
 
498
  * @return bool
499
+ * @since 4.1.1
500
  */
501
+ protected function need_activate_license()
502
+ {
503
+ return !$this->plugin->premium->is_activate() && $this->plugin->premium->is_install_package();
504
  }
505
 
506
  /**
507
  * Нужно продлить лицензию?
508
  *
 
509
  * @return bool
510
+ * @since 4.1.1
511
  */
512
+ protected function need_renew_license()
513
+ {
514
+ return $this->plugin->premium->is_activate() && !$this->plugin->premium->is_active();
515
  }
516
 
517
  /**
 
518
  * @throws Exception
519
+ * @since 4.1.1
520
  */
521
+ protected function install()
522
+ {
523
  global $wp_filesystem;
524
 
525
+ if( !current_user_can('install_plugins') ) {
526
+ throw new Exception('Sorry, you are not allowed to install plugins on this site.', 'not_allowed_install_plugin');
527
  }
528
 
529
+ if( $this->plugin->premium->is_install_package() ) {
530
  return;
531
  }
532
 
533
+ if( !$wp_filesystem ) {
534
+ if( !function_exists('WP_Filesystem') ) {
535
+ require_once(ABSPATH . 'wp-admin/includes/file.php');
536
  }
537
  WP_Filesystem();
538
  }
539
 
540
+ if( !WP_Filesystem(false, WP_PLUGIN_DIR) ) {
541
+ throw new Exception('You are not allowed to edt folders/files on this site', 'not_allowed_edit_filesystem');
542
  } else {
543
 
544
  $download_url = $this->repository->get_download_url();
545
 
546
  /**
547
+ * @param string $plugin_name Имя плагина
548
  *
549
+ * @param string $package Дополнительная информация о лицензии
550
+ * @since 4.1.1
551
  *
 
552
  */
553
+ do_action('wbcr/factory/premium/install_package', $download_url, $this->plugin->getPluginName());
554
 
555
  // If plugin is installed before we update the premium package in database.
556
  // ------------------------------------------------------------------------
557
+ //$plugins = get_plugins( $plugin_folder = '' );
558
+ //
559
+ //if ( ! empty( $plugins ) ) {
560
+ // foreach ( (array) $plugins as $plugin_base => $plugin ) {
561
+ // $basename_parts = explode( '/', $plugin_base );
562
+ // if ( sizeof( $basename_parts ) == 2 && $basename_parts[0] == $this->plugin_slug ) {
563
+ //
564
+ // $this->plugin_basename = $plugin_base;
565
+ // $this->plugin_main_file = WP_PLUGIN_DIR . '/' . $plugin_base;
566
+ // $this->plugin_absolute_path = dirname( WP_PLUGIN_DIR . '/' . $plugin_base );
567
+ //
568
+ // $this->update_package_data();
569
+ //
570
+ // $package = $this->plugin->premium->get_package_data();
571
+ //
572
+ // /**
573
+ // * @since 4.1.1
574
+ // *
575
+ // * @param string $plugin_name Имя плагина
576
+ // *
577
+ // * @param string $package Дополнительная информация о лицензии
578
+ // */
579
+ // do_action( 'wbcr/factory/premium/installed_package', $package, $this->plugin->getPluginName() );
580
+ //
581
+ // return;
582
+ // }
583
+ // }
584
+ //}
585
  // ------------------------------------------------------------------------
586
 
587
+ require_once(ABSPATH . 'wp-admin/includes/file.php');
588
+ require_once(ABSPATH . 'wp-admin/includes/misc.php');
589
 
590
+ if( !class_exists('Plugin_Upgrader', false) ) {
591
  // Include required resources for the installation.
592
  require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
593
  }
594
 
595
  $skin_args = [
596
+ 'type' => 'web',
597
+ 'title' => sprintf('Installing plugin: %s', $this->plugin->getPluginTitle() . ' Premium'),
598
+ 'url' => esc_url_raw($download_url),
599
+ 'nonce' => 'install-plugin_' . $this->plugin_slug,
600
  'plugin' => '',
601
+ 'api' => null,
602
+ 'extra' => [
603
  'slug' => $this->plugin_slug
604
  ],
605
  ];
606
 
607
+ require_once(ABSPATH . 'wp-admin/admin-header.php');
608
 
609
+ if( !$this->plugin->premium->is_install_package() ) {
610
+ $skin = new Plugin_Installer_Skin($skin_args);
611
  } else {
612
+ $skin = new WP_Upgrader_Skin($skin_args);
613
  }
614
 
615
+ $upgrader = new Plugin_Upgrader($skin);
616
 
617
+ if( empty($download_url) ) {
618
+ throw new Exception('You must pass the download url to upgrade up premium package.', "not_passed_download_url");
619
  }
620
 
621
+ $install_result = $upgrader->install($download_url);
622
 
623
+ include(ABSPATH . 'wp-admin/admin-footer.php');
624
 
625
+ if( is_wp_error($install_result) ) {
626
+ throw new Exception($install_result->get_error_message(), $install_result->get_error_code());
627
+ } else if( is_wp_error($skin->result) ) {
628
+ throw new Exception($skin->result->get_error_message(), $skin->result->get_error_code());
629
+ } else if( is_null($install_result) ) {
630
  global $wp_filesystem;
631
 
632
+ $error_code = 'unable_to_connect_to_filesystem';
633
  $error_message = 'Unable to connect to the filesystem. Please confirm your credentials.';
634
 
635
  // Pass through the error from WP_Filesystem if one was raised.
636
+ if( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() ) {
637
  $error_message = $wp_filesystem->errors->get_error_message();
638
  }
639
 
640
+ throw new Exception($error_message, $error_code);
641
  }
642
 
643
+ $this->plugin_basename = $upgrader->plugin_info();
644
+ $this->plugin_main_file = WP_PLUGIN_DIR . '/' . $this->plugin_basename;
645
+ $this->plugin_absolute_path = dirname(WP_PLUGIN_DIR . '/' . $this->plugin_basename);
646
 
647
  $this->update_package_data();
648
 
649
  $package = $this->plugin->premium->get_package_data();
650
 
651
  /**
652
+ * @param string $plugin_name Имя плагина
653
  *
654
+ * @param string $package Дополнительная информация о лицензии
655
+ * @since 4.1.1
656
  *
 
657
  */
658
+ do_action('wbcr/factory/premium/installed_package', $package, $this->plugin->getPluginName());
659
 
660
  die();
661
  }
665
  * @return bool
666
  * @throws Exception
667
  */
668
+ protected function delete()
669
+ {
670
+ if( !$this->plugin->premium->is_install_package() ) {
671
  return false;
672
  }
673
 
674
  $package = $this->plugin->premium->get_package_data();
675
 
676
  /**
677
+ * @param string $plugin_name Имя плагина
678
  *
679
+ * @param string $package Дополнительная информация о лицензии
680
+ * @since 4.1.1
681
  *
 
682
  */
683
+ do_action('wbcr/factory/premium/delete_package', $package, $this->plugin->getPluginName());
684
 
685
+ if( is_plugin_active($package['basename']) ) {
686
+ if( is_multisite() && is_plugin_active_for_network($package['basename']) ) {
687
+ deactivate_plugins($package['basename'], false, true);
688
  } else {
689
+ deactivate_plugins($package['basename']);
690
  }
691
  }
692
 
693
+ $result = delete_plugins([$package['basename']]);
694
 
695
+ if( is_wp_error($result) ) {
696
+ throw new Exception($result->get_error_message(), $result->get_error_code());
697
  }
698
 
699
  $this->plugin->premium->delete_package();
700
 
701
  /**
702
+ * @param string $plugin_name Имя плагина
703
  *
704
+ * @param string $package Дополнительная информация о лицензии
705
+ * @since 4.1.1
706
  *
 
707
  */
708
+ do_action('wbcr/factory/premium/deleted_package', $package, $this->plugin->getPluginName());
709
 
710
  return true;
711
  }
712
 
713
  /**
 
714
  * @return bool
715
+ * @since 4.1.1
716
  */
717
+ protected function deactivate()
718
+ {
719
+ if( !$this->plugin->premium->is_install_package() || !is_plugin_active($this->plugin_basename) ) {
720
  return false;
721
  }
722
 
723
  $package = $this->plugin->premium->get_package_data();
724
 
725
  /**
726
+ * @param string $plugin_name Имя плагина
727
  *
728
+ * @param string $package Дополнительная информация о лицензии
729
+ * @since 4.1.1
730
  *
 
731
  */
732
+ do_action('wbcr/factory/premium/deactivate_package', $package, $this->plugin->getPluginName());
733
 
734
+ if( is_multisite() && is_plugin_active_for_network($this->plugin_basename) ) {
735
+ deactivate_plugins($this->plugin_basename, false, true);
736
  } else {
737
+ deactivate_plugins($this->plugin_basename);
738
  }
739
 
740
  /**
741
+ * @param string $plugin_name Имя плагина
742
  *
743
+ * @param string $package Дополнительная информация о лицензии
744
+ * @since 4.1.1
745
  *
 
746
  */
747
+ do_action('wbcr/factory/premium/deactivated_package', $package, $this->plugin->getPluginName());
748
 
749
  return true;
750
  }
751
 
752
  /**
 
 
753
  * @param array $plugin_data
754
  *
755
  * @throws Exception
756
+ * @since 4.1.1
757
+ *
758
  */
759
+ protected function update_package_data()
760
+ {
761
 
762
+ if( !$this->plugin_main_file ) {
763
  return;
764
  }
765
 
766
  $default_headers = [
767
+ 'Version' => 'Version',
768
  'FrameworkVersion' => 'Framework Version'
769
  ];
770
 
771
+ $plugin_data = get_file_data($this->plugin_main_file, $default_headers, 'plugin');
772
 
773
+ $this->plugin->premium->update_package_data([
774
+ 'basename' => $this->plugin_basename,
775
+ 'version' => $plugin_data['Version'],
776
+ 'framework_version' => isset($plugin_data['FrameworkVersion']) ? $plugin_data['FrameworkVersion'] : null,
777
+ ]);
778
  }
779
 
780
  /**
 
 
781
  * @param string $type
782
  *
783
  * @return string|null
784
+ * @since 4.1.1
785
+ *
786
  */
787
+ private function get_notice_text($type)
788
+ {
789
+ $upgrade_url = $this->get_action_url('install');
790
  $activate_plugin_url = $this->get_activate_premium_url();
791
+ $cancel_license_url = $this->get_action_url('cancel_license');
792
 
793
  $texts = [
794
+ 'need_activate_license' => __('License activation required. A license is required to get premium plugin updates, as well as to get additional services.', 'wbcr_factory_429'),
795
+ 'need_renew_license' => __('Your license has expired. You can no longer get premium plugin updates, premium support and your access to Webcraftic services has been suspended.', 'wbcr_factory_429'),
796
+ 'please_install_premium' => sprintf(__('Congratulations, you have activated a premium license! Please install premium add-on to use pro features now.
797
+ <a href="%s">Install</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_429'), $upgrade_url, $cancel_license_url),
798
+ 'please_activate_premium' => sprintf(__('Congratulations, you have activated a premium license! Please activate premium add-on to use pro features now.
799
+ <a href="%s">Activate</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_429'), $activate_plugin_url, $cancel_license_url)
800
  ];
801
 
802
+ if( isset($texts[$type]) ) {
803
 
804
  /**
 
 
805
  * @param string $type
806
  * @param string $plugin_name
807
  *
808
+ * @param array $messages
809
+ * @since 4.1.1
810
+ *
811
  */
812
+ return apply_filters('wbcr/factory/premium/notice_text', $texts[$type], $type, $this->plugin->getPluginName());
813
  }
814
 
815
  return null;
libs/factory/core/includes/updates/class-factory-upgrader.php CHANGED
@@ -1,10 +1,10 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Updates;
4
 
5
  use Exception;
6
  use stdClass;
7
- use Wbcr_Factory420_Plugin;
8
 
9
  // Exit if accessed directly
10
  if ( ! defined( 'ABSPATH' ) ) {
@@ -29,7 +29,7 @@ class Upgrader {
29
  * @var array хранит имя репозитория и его имя класса
30
  * [
31
  * 'wordpress' => 'WBCR\Factory_Freemius_000\Updates\Freemius_Repository',
32
- * 'freemius' => '\WBCR\Factory_420\Updates\Wordpress_Repository'
33
  * ]
34
  */
35
  public static $repositories = [];
@@ -42,7 +42,7 @@ class Upgrader {
42
  protected $type = 'default';
43
 
44
  /**
45
- * @var Wbcr_Factory420_Plugin
46
  */
47
  protected $plugin;
48
 
@@ -90,13 +90,13 @@ class Upgrader {
90
  *
91
  * @since 4.1.1
92
  *
93
- * @param Wbcr_Factory420_Plugin $plugin
94
  * @param $args
95
  * @param bool $is_premium
96
  *
97
  * @throws Exception
98
  */
99
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
100
 
101
  $this->plugin = $plugin;
102
 
@@ -106,7 +106,7 @@ class Upgrader {
106
  $this->is_debug = defined( 'FACTORY_UPDATES_DEBUG' ) && FACTORY_UPDATES_DEBUG;
107
 
108
  # Добавляем Wordpress репозиторий в список доступных репозиториев по умолчанию
109
- self::$repositories['wordpress'] = '\WBCR\Factory_420\Updates\Wordpress_Repository';
110
 
111
  $settings = $this->get_settings();
112
 
@@ -287,7 +287,7 @@ class Upgrader {
287
 
288
  if ( isset( self::$repositories[ $repository_name ] ) && class_exists( self::$repositories[ $repository_name ] ) ) {
289
  if ( self::$repositories[ $repository_name ] instanceof Repository ) {
290
- throw new Exception( "Repository {$repository_name} must extend the class WBCR\Factory_420\Updates\Repository interface!" );
291
  }
292
 
293
  return new self::$repositories[ $repository_name ]( $this->plugin );
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Updates;
4
 
5
  use Exception;
6
  use stdClass;
7
+ use Wbcr_Factory429_Plugin;
8
 
9
  // Exit if accessed directly
10
  if ( ! defined( 'ABSPATH' ) ) {
29
  * @var array хранит имя репозитория и его имя класса
30
  * [
31
  * 'wordpress' => 'WBCR\Factory_Freemius_000\Updates\Freemius_Repository',
32
+ * 'freemius' => '\WBCR\Factory_429\Updates\Wordpress_Repository'
33
  * ]
34
  */
35
  public static $repositories = [];
42
  protected $type = 'default';
43
 
44
  /**
45
+ * @var Wbcr_Factory429_Plugin
46
  */
47
  protected $plugin;
48
 
90
  *
91
  * @since 4.1.1
92
  *
93
+ * @param Wbcr_Factory429_Plugin $plugin
94
  * @param $args
95
  * @param bool $is_premium
96
  *
97
  * @throws Exception
98
  */
99
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
100
 
101
  $this->plugin = $plugin;
102
 
106
  $this->is_debug = defined( 'FACTORY_UPDATES_DEBUG' ) && FACTORY_UPDATES_DEBUG;
107
 
108
  # Добавляем Wordpress репозиторий в список доступных репозиториев по умолчанию
109
+ self::$repositories['wordpress'] = '\WBCR\Factory_429\Updates\Wordpress_Repository';
110
 
111
  $settings = $this->get_settings();
112
 
287
 
288
  if ( isset( self::$repositories[ $repository_name ] ) && class_exists( self::$repositories[ $repository_name ] ) ) {
289
  if ( self::$repositories[ $repository_name ] instanceof Repository ) {
290
+ throw new Exception( "Repository {$repository_name} must extend the class WBCR\Factory_429\Updates\Repository interface!" );
291
  }
292
 
293
  return new self::$repositories[ $repository_name ]( $this->plugin );
libs/factory/core/includes/updates/repositories/class-factory-repository-abstract.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Updates;
4
 
5
  // Exit if accessed directly
6
- use Wbcr_Factory420_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
@@ -23,17 +23,17 @@ abstract class Repository {
23
  protected $initialized = false;
24
 
25
  /**
26
- * @var Wbcr_Factory420_Plugin
27
  */
28
  protected $plugin;
29
 
30
  /**
31
  * Repository constructor.
32
  *
33
- * @param Wbcr_Factory420_Plugin $plugin
34
  * @param bool $is_premium
35
  */
36
- abstract public function __construct( Wbcr_Factory420_Plugin $plugin );
37
 
38
  /**
39
  * @return void
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Updates;
4
 
5
  // Exit if accessed directly
6
+ use Wbcr_Factory429_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
23
  protected $initialized = false;
24
 
25
  /**
26
+ * @var Wbcr_Factory429_Plugin
27
  */
28
  protected $plugin;
29
 
30
  /**
31
  * Repository constructor.
32
  *
33
+ * @param Wbcr_Factory429_Plugin $plugin
34
  * @param bool $is_premium
35
  */
36
+ abstract public function __construct( Wbcr_Factory429_Plugin $plugin );
37
 
38
  /**
39
  * @return void
libs/factory/core/includes/updates/repositories/class-factory-wordpress.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_420\Updates;
4
 
5
  // Exit if accessed directly
6
- use Wbcr_Factory420_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
@@ -20,10 +20,10 @@ class Wordpress_Repository extends Repository {
20
  /**
21
  * Wordpress constructor.
22
  *
23
- * @param Wbcr_Factory420_Plugin $plugin
24
  * @param bool $is_premium
25
  */
26
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
27
  $this->plugin = $plugin;
28
  }
29
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_429\Updates;
4
 
5
  // Exit if accessed directly
6
+ use Wbcr_Factory429_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
20
  /**
21
  * Wordpress constructor.
22
  *
23
+ * @param Wbcr_Factory429_Plugin $plugin
24
  * @param bool $is_premium
25
  */
26
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
27
  $this->plugin = $plugin;
28
  }
29
 
libs/factory/core/langs/{wbcr_factory_420-ru_RU.mo → wbcr_factory_429-ru_RU.mo} RENAMED
File without changes
libs/factory/core/langs/{wbcr_factory_420-ru_RU.po → wbcr_factory_429-ru_RU.po} RENAMED
File without changes
libs/factory/forms/boot.php CHANGED
@@ -10,264 +10,265 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
  // the module provides function for the admin area only
18
 
19
- if ( ! is_admin() ) {
20
  return;
21
  }
22
 
23
  // checks if the module is already loaded in order to
24
  // prevent loading the same version of the module twice.
25
- if ( defined( 'FACTORY_FORMS_418_LOADED' ) ) {
26
  return;
27
  }
28
 
29
- define( 'FACTORY_FORMS_418_LOADED', true );
30
 
31
- define( 'FACTORY_FORMS_418_VERSION', '4.1.8' );
32
 
33
  // absolute path and URL to the files and resources of the module.
34
- define( 'FACTORY_FORMS_418_DIR', dirname( __FILE__ ) );
35
- define( 'FACTORY_FORMS_418_URL', plugins_url( null, __FILE__ ) );
36
 
37
  #comp merge
38
- require_once( FACTORY_FORMS_418_DIR . '/includes/providers/value-provider.interface.php' );
39
- require_once( FACTORY_FORMS_418_DIR . '/includes/providers/meta-value-provider.class.php' );
40
- require_once( FACTORY_FORMS_418_DIR . '/includes/providers/options-value-provider.class.php' );
41
 
42
- require_once( FACTORY_FORMS_418_DIR . '/includes/form.class.php' );
43
  #endcomp
44
 
45
- load_plugin_textdomain( 'wbcr_factory_forms_418', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
46
 
47
  /**
48
  * We add this code into the hook because all these controls quite heavy. So in order to get better perfomance,
49
  * we load the form controls only on pages where the forms are created.
50
  *
51
  * @since 3.0.7
52
- * @see the 'wbcr_factory_forms_418_register_controls' hook
53
  *
54
  */
55
- if ( ! function_exists( 'wbcr_factory_forms_418_register_default_controls' ) ) {
56
 
57
  /**
58
- * @param Wbcr_Factory420_Plugin $plugin
59
  *
60
  * @throws Exception
61
  */
62
- function wbcr_factory_forms_418_register_default_controls( Wbcr_Factory420_Plugin $plugin ) {
 
63
 
64
- if ( $plugin && ! isset( $plugin->forms ) ) {
65
- throw new Exception( "The module Factory Forms is not loaded for the plugin '{$plugin->getPluginName()}'." );
66
  }
67
 
68
- require_once( FACTORY_FORMS_418_DIR . '/includes/html-builder.class.php' );
69
- require_once( FACTORY_FORMS_418_DIR . '/includes/form-element.class.php' );
70
- require_once( FACTORY_FORMS_418_DIR . '/includes/control.class.php' );
71
- require_once( FACTORY_FORMS_418_DIR . '/includes/complex-control.class.php' );
72
- require_once( FACTORY_FORMS_418_DIR . '/includes/holder.class.php' );
73
- require_once( FACTORY_FORMS_418_DIR . '/includes/control-holder.class.php' );
74
- require_once( FACTORY_FORMS_418_DIR . '/includes/custom-element.class.php' );
75
- require_once( FACTORY_FORMS_418_DIR . '/includes/form-layout.class.php' );
76
 
77
  // registration of controls
78
- $plugin->forms->registerControls( [
79
  [
80
- 'type' => 'checkbox',
81
- 'class' => 'Wbcr_FactoryForms418_CheckboxControl',
82
- 'include' => FACTORY_FORMS_418_DIR . '/controls/checkbox.php'
83
  ],
84
  [
85
- 'type' => 'list',
86
- 'class' => 'Wbcr_FactoryForms418_ListControl',
87
- 'include' => FACTORY_FORMS_418_DIR . '/controls/list.php'
88
  ],
89
  [
90
- 'type' => 'dropdown',
91
- 'class' => 'Wbcr_FactoryForms418_DropdownControl',
92
- 'include' => FACTORY_FORMS_418_DIR . '/controls/dropdown.php'
93
  ],
94
  [
95
- 'type' => 'dropdown-and-colors',
96
- 'class' => 'Wbcr_FactoryForms418_DropdownAndColorsControl',
97
- 'include' => FACTORY_FORMS_418_DIR . '/controls/dropdown-and-colors.php'
98
  ],
99
  [
100
- 'type' => 'hidden',
101
- 'class' => 'Wbcr_FactoryForms418_HiddenControl',
102
- 'include' => FACTORY_FORMS_418_DIR . '/controls/hidden.php'
103
  ],
104
  [
105
- 'type' => 'hidden',
106
- 'class' => 'Wbcr_FactoryForms418_HiddenControl',
107
- 'include' => FACTORY_FORMS_418_DIR . '/controls/hidden.php'
108
  ],
109
  [
110
- 'type' => 'radio',
111
- 'class' => 'Wbcr_FactoryForms418_RadioControl',
112
- 'include' => FACTORY_FORMS_418_DIR . '/controls/radio.php'
113
  ],
114
  [
115
- 'type' => 'radio-colors',
116
- 'class' => 'Wbcr_FactoryForms418_RadioColorsControl',
117
- 'include' => FACTORY_FORMS_418_DIR . '/controls/radio-colors.php'
118
  ],
119
  [
120
- 'type' => 'textarea',
121
- 'class' => 'Wbcr_FactoryForms418_TextareaControl',
122
- 'include' => FACTORY_FORMS_418_DIR . '/controls/textarea.php'
123
  ],
124
  [
125
- 'type' => 'textbox',
126
- 'class' => 'Wbcr_FactoryForms418_TextboxControl',
127
- 'include' => FACTORY_FORMS_418_DIR . '/controls/textbox.php'
128
  ],
129
  [
130
- 'type' => 'multiple-textbox',
131
- 'class' => 'Wbcr_FactoryForms418_MultipleTextboxControl',
132
- 'include' => FACTORY_FORMS_418_DIR . '/controls/multiple-textbox.php'
133
  ],
134
  [
135
- 'type' => 'datetimepicker-range',
136
- 'class' => 'Wbcr_FactoryForms418_DatepickerRangeControl',
137
- 'include' => FACTORY_FORMS_418_DIR . '/controls/datepicker-range.php'
138
  ],
139
  [
140
- 'type' => 'url',
141
- 'class' => 'Wbcr_FactoryForms418_UrlControl',
142
- 'include' => FACTORY_FORMS_418_DIR . '/controls/url.php'
143
  ],
144
  [
145
- 'type' => 'wp-editor',
146
- 'class' => 'Wbcr_FactoryForms418_WpEditorControl',
147
- 'include' => FACTORY_FORMS_418_DIR . '/controls/wp-editor.php'
148
  ],
149
  [
150
- 'type' => 'color',
151
- 'class' => 'Wbcr_FactoryForms418_ColorControl',
152
- 'include' => FACTORY_FORMS_418_DIR . '/controls/color.php'
153
  ],
154
  [
155
- 'type' => 'color-and-opacity',
156
- 'class' => 'Wbcr_FactoryForms418_ColorAndOpacityControl',
157
- 'include' => FACTORY_FORMS_418_DIR . '/controls/color-and-opacity.php'
158
  ],
159
  [
160
- 'type' => 'gradient',
161
- 'class' => 'Wbcr_FactoryForms418_GradientControl',
162
- 'include' => FACTORY_FORMS_418_DIR . '/controls/gradient.php'
163
  ],
164
  [
165
- 'type' => 'font',
166
- 'class' => 'Wbcr_FactoryForms418_FontControl',
167
- 'include' => FACTORY_FORMS_418_DIR . '/controls/font.php'
168
  ],
169
  [
170
- 'type' => 'google-font',
171
- 'class' => 'Wbcr_FactoryForms418_GoogleFontControl',
172
- 'include' => FACTORY_FORMS_418_DIR . '/controls/google-font.php'
173
  ],
174
  [
175
- 'type' => 'pattern',
176
- 'class' => 'Wbcr_FactoryForms418_PatternControl',
177
- 'include' => FACTORY_FORMS_418_DIR . '/controls/pattern.php'
178
  ],
179
  [
180
- 'type' => 'integer',
181
- 'class' => 'Wbcr_FactoryForms418_IntegerControl',
182
- 'include' => FACTORY_FORMS_418_DIR . '/controls/integer.php'
183
  ],
184
  [
185
- 'type' => 'control-group',
186
- 'class' => 'Wbcr_FactoryForms418_ControlGroupHolder',
187
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/control-group.php'
188
  ],
189
  [
190
- 'type' => 'paddings-editor',
191
- 'class' => 'Wbcr_FactoryForms418_PaddingsEditorControl',
192
- 'include' => FACTORY_FORMS_418_DIR . '/controls/paddings-editor.php'
193
  ],
194
- ] );
195
 
196
  // registration of control holders
197
- $plugin->forms->registerHolders( [
198
  [
199
- 'type' => 'tab',
200
- 'class' => 'Wbcr_FactoryForms418_TabHolder',
201
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/tab.php'
202
  ],
203
  [
204
- 'type' => 'tab-item',
205
- 'class' => 'Wbcr_FactoryForms418_TabItemHolder',
206
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/tab-item.php'
207
  ],
208
  [
209
- 'type' => 'accordion',
210
- 'class' => 'Wbcr_FactoryForms418_AccordionHolder',
211
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/accordion.php'
212
  ],
213
  [
214
- 'type' => 'accordion-item',
215
- 'class' => 'Wbcr_FactoryForms418_AccordionItemHolder',
216
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/accordion-item.php'
217
  ],
218
  [
219
- 'type' => 'control-group',
220
- 'class' => 'Wbcr_FactoryForms418_ControlGroupHolder',
221
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/control-group.php'
222
  ],
223
  [
224
- 'type' => 'control-group-item',
225
- 'class' => 'Wbcr_FactoryForms418_ControlGroupItem',
226
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/control-group-item.php'
227
  ],
228
  [
229
- 'type' => 'form-group',
230
- 'class' => 'Wbcr_FactoryForms418_FormGroupHolder',
231
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/form-group.php'
232
  ],
233
  [
234
- 'type' => 'more-link',
235
- 'class' => 'Wbcr_FactoryForms418_MoreLinkHolder',
236
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/more-link.php'
237
  ],
238
  [
239
- 'type' => 'div',
240
- 'class' => 'Wbcr_FactoryForms418_DivHolder',
241
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/div.php'
242
  ],
243
  [
244
- 'type' => 'columns',
245
- 'class' => 'Wbcr_FactoryForms418_ColumnsHolder',
246
- 'include' => FACTORY_FORMS_418_DIR . '/controls/holders/columns.php'
247
  ]
248
- ] );
249
 
250
  // registration custom form elements
251
- $plugin->forms->registerCustomElements( [
252
  [
253
- 'type' => 'html',
254
- 'class' => 'Wbcr_FactoryForms418_Html',
255
- 'include' => FACTORY_FORMS_418_DIR . '/controls/customs/html.php',
256
  ],
257
  [
258
- 'type' => 'separator',
259
- 'class' => 'Wbcr_FactoryForms418_Separator',
260
- 'include' => FACTORY_FORMS_418_DIR . '/controls/customs/separator.php',
261
  ],
262
- ] );
263
 
264
  // registration of form layouts
265
- $plugin->forms->registerFormLayout( [
266
- 'name' => 'bootstrap-3',
267
- 'class' => 'Wbcr_FactoryForms418_Bootstrap3FormLayout',
268
- 'include' => FACTORY_FORMS_418_DIR . '/layouts/bootstrap-3/bootstrap-3.php'
269
- ] );
270
  }
271
 
272
- add_action( 'wbcr_factory_forms_418_register_controls', 'wbcr_factory_forms_418_register_default_controls' );
273
  }
10
  */
11
 
12
  // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
 
17
  // the module provides function for the admin area only
18
 
19
+ if( !is_admin() ) {
20
  return;
21
  }
22
 
23
  // checks if the module is already loaded in order to
24
  // prevent loading the same version of the module twice.
25
+ if( defined('FACTORY_FORMS_427_LOADED') ) {
26
  return;
27
  }
28
 
29
+ define('FACTORY_FORMS_427_LOADED', true);
30
 
31
+ define('FACTORY_FORMS_427_VERSION', '4.2.7');
32
 
33
  // absolute path and URL to the files and resources of the module.
34
+ define('FACTORY_FORMS_427_DIR', dirname(__FILE__));
35
+ define('FACTORY_FORMS_427_URL', plugins_url(null, __FILE__));
36
 
37
  #comp merge
38
+ require_once(FACTORY_FORMS_427_DIR . '/includes/providers/value-provider.interface.php');
39
+ require_once(FACTORY_FORMS_427_DIR . '/includes/providers/meta-value-provider.class.php');
40
+ require_once(FACTORY_FORMS_427_DIR . '/includes/providers/options-value-provider.class.php');
41
 
42
+ require_once(FACTORY_FORMS_427_DIR . '/includes/form.class.php');
43
  #endcomp
44
 
45
+ load_plugin_textdomain('wbcr_factory_forms_427', false, dirname(plugin_basename(__FILE__)) . '/langs');
46
 
47
  /**
48
  * We add this code into the hook because all these controls quite heavy. So in order to get better perfomance,
49
  * we load the form controls only on pages where the forms are created.
50
  *
51
  * @since 3.0.7
52
+ * @see the 'wbcr_factory_forms_427_register_controls' hook
53
  *
54
  */
55
+ if( !function_exists('wbcr_factory_forms_427_register_default_controls') ) {
56
 
57
  /**
58
+ * @param Wbcr_Factory429_Plugin $plugin
59
  *
60
  * @throws Exception
61
  */
62
+ function wbcr_factory_forms_427_register_default_controls(Wbcr_Factory429_Plugin $plugin)
63
+ {
64
 
65
+ if( $plugin && !isset($plugin->forms) ) {
66
+ throw new Exception("The module Factory Forms is not loaded for the plugin '{$plugin->getPluginName()}'.");
67
  }
68
 
69
+ require_once(FACTORY_FORMS_427_DIR . '/includes/html-builder.class.php');
70
+ require_once(FACTORY_FORMS_427_DIR . '/includes/form-element.class.php');
71
+ require_once(FACTORY_FORMS_427_DIR . '/includes/control.class.php');
72
+ require_once(FACTORY_FORMS_427_DIR . '/includes/complex-control.class.php');
73
+ require_once(FACTORY_FORMS_427_DIR . '/includes/holder.class.php');
74
+ require_once(FACTORY_FORMS_427_DIR . '/includes/control-holder.class.php');
75
+ require_once(FACTORY_FORMS_427_DIR . '/includes/custom-element.class.php');
76
+ require_once(FACTORY_FORMS_427_DIR . '/includes/form-layout.class.php');
77
 
78
  // registration of controls
79
+ $plugin->forms->registerControls([
80
  [
81
+ 'type' => 'checkbox',
82
+ 'class' => 'Wbcr_FactoryForms427_CheckboxControl',
83
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/checkbox.php'
84
  ],
85
  [
86
+ 'type' => 'list',
87
+ 'class' => 'Wbcr_FactoryForms427_ListControl',
88
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/list.php'
89
  ],
90
  [
91
+ 'type' => 'dropdown',
92
+ 'class' => 'Wbcr_FactoryForms427_DropdownControl',
93
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/dropdown.php'
94
  ],
95
  [
96
+ 'type' => 'dropdown-and-colors',
97
+ 'class' => 'Wbcr_FactoryForms427_DropdownAndColorsControl',
98
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/dropdown-and-colors.php'
99
  ],
100
  [
101
+ 'type' => 'hidden',
102
+ 'class' => 'Wbcr_FactoryForms427_HiddenControl',
103
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/hidden.php'
104
  ],
105
  [
106
+ 'type' => 'hidden',
107
+ 'class' => 'Wbcr_FactoryForms427_HiddenControl',
108
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/hidden.php'
109
  ],
110
  [
111
+ 'type' => 'radio',
112
+ 'class' => 'Wbcr_FactoryForms427_RadioControl',
113
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/radio.php'
114
  ],
115
  [
116
+ 'type' => 'radio-colors',
117
+ 'class' => 'Wbcr_FactoryForms427_RadioColorsControl',
118
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/radio-colors.php'
119
  ],
120
  [
121
+ 'type' => 'textarea',
122
+ 'class' => 'Wbcr_FactoryForms427_TextareaControl',
123
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/textarea.php'
124
  ],
125
  [
126
+ 'type' => 'textbox',
127
+ 'class' => 'Wbcr_FactoryForms427_TextboxControl',
128
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/textbox.php'
129
  ],
130
  [
131
+ 'type' => 'multiple-textbox',
132
+ 'class' => 'Wbcr_FactoryForms427_MultipleTextboxControl',
133
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/multiple-textbox.php'
134
  ],
135
  [
136
+ 'type' => 'datetimepicker-range',
137
+ 'class' => 'Wbcr_FactoryForms427_DatepickerRangeControl',
138
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/datepicker-range.php'
139
  ],
140
  [
141
+ 'type' => 'url',
142
+ 'class' => 'Wbcr_FactoryForms427_UrlControl',
143
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/url.php'
144
  ],
145
  [
146
+ 'type' => 'wp-editor',
147
+ 'class' => 'Wbcr_FactoryForms427_WpEditorControl',
148
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/wp-editor.php'
149
  ],
150
  [
151
+ 'type' => 'color',
152
+ 'class' => 'Wbcr_FactoryForms427_ColorControl',
153
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/color.php'
154
  ],
155
  [
156
+ 'type' => 'color-and-opacity',
157
+ 'class' => 'Wbcr_FactoryForms427_ColorAndOpacityControl',
158
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/color-and-opacity.php'
159
  ],
160
  [
161
+ 'type' => 'gradient',
162
+ 'class' => 'Wbcr_FactoryForms427_GradientControl',
163
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/gradient.php'
164
  ],
165
  [
166
+ 'type' => 'font',
167
+ 'class' => 'Wbcr_FactoryForms427_FontControl',
168
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/font.php'
169
  ],
170
  [
171
+ 'type' => 'google-font',
172
+ 'class' => 'Wbcr_FactoryForms427_GoogleFontControl',
173
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/google-font.php'
174
  ],
175
  [
176
+ 'type' => 'pattern',
177
+ 'class' => 'Wbcr_FactoryForms427_PatternControl',
178
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/pattern.php'
179
  ],
180
  [
181
+ 'type' => 'integer',
182
+ 'class' => 'Wbcr_FactoryForms427_IntegerControl',
183
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/integer.php'
184
  ],
185
  [
186
+ 'type' => 'control-group',
187
+ 'class' => 'Wbcr_FactoryForms427_ControlGroupHolder',
188
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/control-group.php'
189
  ],
190
  [
191
+ 'type' => 'paddings-editor',
192
+ 'class' => 'Wbcr_FactoryForms427_PaddingsEditorControl',
193
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/paddings-editor.php'
194
  ],
195
+ ]);
196
 
197
  // registration of control holders
198
+ $plugin->forms->registerHolders([
199
  [
200
+ 'type' => 'tab',
201
+ 'class' => 'Wbcr_FactoryForms427_TabHolder',
202
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/tab.php'
203
  ],
204
  [
205
+ 'type' => 'tab-item',
206
+ 'class' => 'Wbcr_FactoryForms427_TabItemHolder',
207
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/tab-item.php'
208
  ],
209
  [
210
+ 'type' => 'accordion',
211
+ 'class' => 'Wbcr_FactoryForms427_AccordionHolder',
212
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/accordion.php'
213
  ],
214
  [
215
+ 'type' => 'accordion-item',
216
+ 'class' => 'Wbcr_FactoryForms427_AccordionItemHolder',
217
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/accordion-item.php'
218
  ],
219
  [
220
+ 'type' => 'control-group',
221
+ 'class' => 'Wbcr_FactoryForms427_ControlGroupHolder',
222
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/control-group.php'
223
  ],
224
  [
225
+ 'type' => 'control-group-item',
226
+ 'class' => 'Wbcr_FactoryForms427_ControlGroupItem',
227
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/control-group-item.php'
228
  ],
229
  [
230
+ 'type' => 'form-group',
231
+ 'class' => 'Wbcr_FactoryForms427_FormGroupHolder',
232
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/form-group.php'
233
  ],
234
  [
235
+ 'type' => 'more-link',
236
+ 'class' => 'Wbcr_FactoryForms427_MoreLinkHolder',
237
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/more-link.php'
238
  ],
239
  [
240
+ 'type' => 'div',
241
+ 'class' => 'Wbcr_FactoryForms427_DivHolder',
242
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/div.php'
243
  ],
244
  [
245
+ 'type' => 'columns',
246
+ 'class' => 'Wbcr_FactoryForms427_ColumnsHolder',
247
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/holders/columns.php'
248
  ]
249
+ ]);
250
 
251
  // registration custom form elements
252
+ $plugin->forms->registerCustomElements([
253
  [
254
+ 'type' => 'html',
255
+ 'class' => 'Wbcr_FactoryForms427_Html',
256
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/customs/html.php',
257
  ],
258
  [
259
+ 'type' => 'separator',
260
+ 'class' => 'Wbcr_FactoryForms427_Separator',
261
+ 'include' => FACTORY_FORMS_427_DIR . '/controls/customs/separator.php',
262
  ],
263
+ ]);
264
 
265
  // registration of form layouts
266
+ $plugin->forms->registerFormLayout([
267
+ 'name' => 'bootstrap-3',
268
+ 'class' => 'Wbcr_FactoryForms427_Bootstrap3FormLayout',
269
+ 'include' => FACTORY_FORMS_427_DIR . '/layouts/bootstrap-3/bootstrap-3.php'
270
+ ]);
271
  }
272
 
273
+ add_action('wbcr_factory_forms_427_register_controls', 'wbcr_factory_forms_427_register_default_controls');
274
  }
libs/factory/forms/controls/checkbox.php CHANGED
@@ -20,9 +20,9 @@
20
  exit;
21
  }
22
 
23
- if( !class_exists('Wbcr_FactoryForms418_CheckboxControl') ) {
24
 
25
- class Wbcr_FactoryForms418_CheckboxControl extends Wbcr_FactoryForms418_Control {
26
 
27
  public $type = 'checkbox';
28
 
@@ -130,10 +130,10 @@
130
  <div <?php $this->attrs() ?>>
131
  <button type="button" class="btn btn-default btn-small btn-sm factory-on <?php if( $value ) {
132
  echo 'active';
133
- } ?>"><?php _e('On', 'wbcr_factory_forms_418') ?></button>
134
  <button type="button" class="btn btn-default btn-small btn-sm factory-off <?php if( !$value ) {
135
  echo 'active';
136
- } ?>" data-value="0"><?php _e('Off', 'wbcr_factory_forms_418') ?></button>
137
  <input type="checkbox" style="display: none" id="<?php echo $name_on_form ?>" class="factory-result" name="<?php echo $name_on_form ?>" value="<?= $value ?>" <?php if( $value ) {
138
  echo 'checked="checked"';
139
  } ?>" />
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms427_CheckboxControl') ) {
24
 
25
+ class Wbcr_FactoryForms427_CheckboxControl extends Wbcr_FactoryForms427_Control {
26
 
27
  public $type = 'checkbox';
28
 
130
  <div <?php $this->attrs() ?>>
131
  <button type="button" class="btn btn-default btn-small btn-sm factory-on <?php if( $value ) {
132
  echo 'active';
133
+ } ?>"><?php _e('On', 'wbcr_factory_forms_427') ?></button>
134
  <button type="button" class="btn btn-default btn-small btn-sm factory-off <?php if( !$value ) {
135
  echo 'active';
136
+ } ?>" data-value="0"><?php _e('Off', 'wbcr_factory_forms_427') ?></button>
137
  <input type="checkbox" style="display: none" id="<?php echo $name_on_form ?>" class="factory-result" name="<?php echo $name_on_form ?>" value="<?= $value ?>" <?php if( $value ) {
138
  echo 'checked="checked"';
139
  } ?>" />
libs/factory/forms/controls/color-and-opacity.php CHANGED
@@ -20,10 +20,10 @@
20
  exit;
21
  }
22
 
23
- if( !class_exists('Wbcr_FactoryForms418_ColorAndOpacityControl') ) {
24
  }
25
 
26
- class Wbcr_FactoryForms418_ColorAndOpacityControl extends Wbcr_FactoryForms418_ComplexControl {
27
 
28
  public $type = 'color-and-opacity';
29
 
@@ -57,8 +57,8 @@
57
  'way' => 'slider'
58
  ));
59
 
60
- $this->color = new Wbcr_FactoryForms418_ColorControl($options['color'], $form, $provider);
61
- $this->opacity = new Wbcr_FactoryForms418_IntegerControl($options['opacity'], $form, $provider);
62
 
63
  $this->innerControls = array($this->color, $this->opacity);
64
  }
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms427_ColorAndOpacityControl') ) {
24
  }
25
 
26
+ class Wbcr_FactoryForms427_ColorAndOpacityControl extends Wbcr_FactoryForms427_ComplexControl {
27
 
28
  public $type = 'color-and-opacity';
29
 
57
  'way' => 'slider'
58
  ));
59
 
60
+ $this->color = new Wbcr_FactoryForms427_ColorControl($options['color'], $form, $provider);
61
+ $this->opacity = new Wbcr_FactoryForms427_IntegerControl($options['opacity'], $form, $provider);
62
 
63
  $this->innerControls = array($this->color, $this->opacity);
64
  }
libs/factory/forms/controls/color.php CHANGED
@@ -20,9 +20,9 @@
20
  exit;
21
  }
22
 
23
- if( !class_exists('Wbcr_FactoryForms418_ColorControl') ) {
24
 
25
- class Wbcr_FactoryForms418_ColorControl extends Wbcr_FactoryForms418_Control {
26
 
27
  public $type = 'color';
28
 
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms427_ColorControl') ) {
24
 
25
+ class Wbcr_FactoryForms427_ColorControl extends Wbcr_FactoryForms427_Control {
26
 
27
  public $type = 'color';
28
 
libs/factory/forms/controls/customs/html.php CHANGED
@@ -14,9 +14,9 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_Html') ) {
18
 
19
- class Wbcr_FactoryForms418_Html extends Wbcr_FactoryForms418_CustomElement {
20
 
21
  public $type = 'html';
22
 
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_Html') ) {
18
 
19
+ class Wbcr_FactoryForms427_Html extends Wbcr_FactoryForms427_CustomElement {
20
 
21
  public $type = 'html';
22
 
libs/factory/forms/controls/customs/separator.php CHANGED
@@ -14,8 +14,8 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_Separator') ) {
18
- class Wbcr_FactoryForms418_Separator extends Wbcr_FactoryForms418_CustomElement {
19
 
20
  public $type = 'separator';
21
 
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_Separator') ) {
18
+ class Wbcr_FactoryForms427_Separator extends Wbcr_FactoryForms427_CustomElement {
19
 
20
  public $type = 'separator';
21
 
libs/factory/forms/controls/datepicker-range.php CHANGED
@@ -29,9 +29,9 @@
29
  exit;
30
  }
31
 
32
- if( !class_exists('Wbcr_FactoryForms418_DatepickerRangeControl') ) {
33
 
34
- class Wbcr_FactoryForms418_DatepickerRangeControl extends Wbcr_FactoryForms418_ComplexControl {
35
 
36
  public $type = 'datetimepicker-range';
37
 
@@ -65,8 +65,8 @@
65
  'default' => date('Y/m/d H:i', strtotime("+1 month"))
66
  ), $options['range_2']);
67
 
68
- $this->range_1 = new Wbcr_FactoryForms418_TextboxControl($options['range_1'], $form, $provider);
69
- $this->range_2 = new Wbcr_FactoryForms418_TextboxControl($options['range_2'], $form, $provider);
70
  $this->inner_controls = array($this->range_1, $this->range_2);
71
 
72
  foreach($this->inner_controls as $key => $control) {
29
  exit;
30
  }
31
 
32
+ if( !class_exists('Wbcr_FactoryForms427_DatepickerRangeControl') ) {
33
 
34
+ class Wbcr_FactoryForms427_DatepickerRangeControl extends Wbcr_FactoryForms427_ComplexControl {
35
 
36
  public $type = 'datetimepicker-range';
37
 
65
  'default' => date('Y/m/d H:i', strtotime("+1 month"))
66
  ), $options['range_2']);
67
 
68
+ $this->range_1 = new Wbcr_FactoryForms427_TextboxControl($options['range_1'], $form, $provider);
69
+ $this->range_2 = new Wbcr_FactoryForms427_TextboxControl($options['range_2'], $form, $provider);
70
  $this->inner_controls = array($this->range_1, $this->range_2);
71
 
72
  foreach($this->inner_controls as $key => $control) {
libs/factory/forms/controls/dropdown-and-colors.php CHANGED
@@ -5,14 +5,14 @@
5
  *
6
  * Main options:
7
  * name => a name of the control
8
- * // see FactoryForms418_DropdownControl
9
  * 'dropdown' => array(
10
  * // a callback to return items or an array of items to select
11
  * 'data' => OPanda_ThemeManager::getThemes(OPanda_Items::getCurrentItemName(), 'dropdown'),
12
  * 'default' => 'default',
13
  * 'value' => 'value' // a value to show in the control
14
  * ),
15
- * // see FactoryForms418_RadioColorsControl
16
  * 'colors' => array(
17
  * // a callback to return items or an array of items to select
18
  * 'data' => array(
@@ -37,9 +37,9 @@
37
  exit;
38
  }
39
 
40
- if( !class_exists('Wbcr_FactoryForms418_DropdownAndColorsControl') ) {
41
 
42
- class Wbcr_FactoryForms418_DropdownAndColorsControl extends Wbcr_FactoryForms418_ComplexControl {
43
 
44
  public $type = 'dropdown-and-colors';
45
 
@@ -69,8 +69,8 @@
69
  'name' => $this->options['name'] . '__colors',
70
  ));
71
 
72
- $this->dropdown = new Wbcr_FactoryForms418_DropdownControl($options['dropdown'], $form, $provider);
73
- $this->colors = new Wbcr_FactoryForms418_RadioColorsControl($options['colors'], $form, $provider);
74
  $this->inner_controls = array($this->dropdown, $this->colors);
75
 
76
  $colors = $this->colors->getOption('data');
5
  *
6
  * Main options:
7
  * name => a name of the control
8
+ * // see FactoryForms427_DropdownControl
9
  * 'dropdown' => array(
10
  * // a callback to return items or an array of items to select
11
  * 'data' => OPanda_ThemeManager::getThemes(OPanda_Items::getCurrentItemName(), 'dropdown'),
12
  * 'default' => 'default',
13
  * 'value' => 'value' // a value to show in the control
14
  * ),
15
+ * // see FactoryForms427_RadioColorsControl
16
  * 'colors' => array(
17
  * // a callback to return items or an array of items to select
18
  * 'data' => array(
37
  exit;
38
  }
39
 
40
+ if( !class_exists('Wbcr_FactoryForms427_DropdownAndColorsControl') ) {
41
 
42
+ class Wbcr_FactoryForms427_DropdownAndColorsControl extends Wbcr_FactoryForms427_ComplexControl {
43
 
44
  public $type = 'dropdown-and-colors';
45
 
69
  'name' => $this->options['name'] . '__colors',
70
  ));
71
 
72
+ $this->dropdown = new Wbcr_FactoryForms427_DropdownControl($options['dropdown'], $form, $provider);
73
+ $this->colors = new Wbcr_FactoryForms427_RadioColorsControl($options['colors'], $form, $provider);
74
  $this->inner_controls = array($this->dropdown, $this->colors);
75
 
76
  $colors = $this->colors->getOption('data');
libs/factory/forms/controls/dropdown.php CHANGED
@@ -21,9 +21,9 @@
21
  exit;
22
  }
23
 
24
- if ( ! class_exists( 'Wbcr_FactoryForms418_DropdownControl' ) ) {
25
 
26
- class Wbcr_FactoryForms418_DropdownControl extends Wbcr_FactoryForms418_Control {
27
 
28
  public $type = 'dropdown';
29
 
@@ -123,7 +123,7 @@
123
  'url': '<?php echo $data['url'] ?>',
124
  'data': <?php echo json_encode( $data['data'] ) ?>,
125
  'selected': '<?php echo $value ?>',
126
- 'empty_list': '<?php echo $this->getOption( 'empty', __( 'The list is empty.', 'wbcr_factory_forms_418' ) ) ?>'
127
  };
128
  </script>
129
  <?php
@@ -268,7 +268,7 @@
268
  }
269
 
270
  $is_empty = $this->isAjax() || empty( $items );
271
- $empty_list = $this->getOption( 'empty', __( '- empty -', 'wbcr_factory_forms_418' ) );
272
 
273
  ?>
274
  <select <?php $this->attrs() ?>>
@@ -349,7 +349,7 @@
349
  }
350
 
351
  $value = isset( $item['value'] ) ? $item['value'] : '';
352
- $title = isset( $item['title'] ) ? $item['title'] : __( '- empty -', 'wbcr_factory_forms_418' );
353
 
354
  $data = isset( $item['data'] ) ? $item['data'] : null;
355
  } else {
21
  exit;
22
  }
23
 
24
+ if ( ! class_exists( 'Wbcr_FactoryForms427_DropdownControl' ) ) {
25
 
26
+ class Wbcr_FactoryForms427_DropdownControl extends Wbcr_FactoryForms427_Control {
27
 
28
  public $type = 'dropdown';
29
 
123
  'url': '<?php echo $data['url'] ?>',
124
  'data': <?php echo json_encode( $data['data'] ) ?>,
125
  'selected': '<?php echo $value ?>',
126
+ 'empty_list': '<?php echo $this->getOption( 'empty', __( 'The list is empty.', 'wbcr_factory_forms_427' ) ) ?>'
127
  };
128
  </script>
129
  <?php
268
  }
269
 
270
  $is_empty = $this->isAjax() || empty( $items );
271
+ $empty_list = $this->getOption( 'empty', __( '- empty -', 'wbcr_factory_forms_427' ) );
272
 
273
  ?>
274
  <select <?php $this->attrs() ?>>
349
  }
350
 
351
  $value = isset( $item['value'] ) ? $item['value'] : '';
352
+ $title = isset( $item['title'] ) ? $item['title'] : __( '- empty -', 'wbcr_factory_forms_427' );
353
 
354
  $data = isset( $item['data'] ) ? $item['data'] : null;
355
  } else {
libs/factory/forms/controls/font.php CHANGED
@@ -20,9 +20,9 @@
20
  exit;
21
  }
22
 
23
- if( !class_exists('Wbcr_FactoryForms418_FontControl') ) {
24
 
25
- class Wbcr_FactoryForms418_FontControl extends Wbcr_FactoryForms418_ComplexControl {
26
 
27
  public $type = 'font';
28
 
@@ -54,9 +54,9 @@
54
  'pickerTarget' => '.factory-control-' . $this->options['name'] . ' .factory-picker-target'
55
  );
56
 
57
- $this->size = new Wbcr_FactoryForms418_IntegerControl($option_font_size, $form, $provider);
58
- $this->family = new Wbcr_FactoryForms418_DropdownControl($option_font_family, $form, $provider);
59
- $this->color = new Wbcr_FactoryForms418_ColorControl($optionFontColor, $form, $provider);
60
 
61
  $this->innerControls = array($this->family, $this->size, $this->color);
62
  }
@@ -66,8 +66,8 @@
66
 
67
  $fonts = $this->getDefaultFonts();
68
 
69
- $fonts = apply_filters('wbcr_factory_forms_418_fonts', $fonts);
70
- $fonts = apply_filters('wbcr_factory_forms_418_fonts-' . $this->options['name'], $fonts);
71
 
72
  return $fonts;
73
  }
@@ -77,10 +77,10 @@
77
 
78
  $fonts = array(
79
 
80
- array('inherit', __('(use default website font)', 'wbcr_factory_forms_418')),
81
  array(
82
  'group',
83
- __('Sans Serif:', 'wbcr_factory_forms_418'),
84
  array(
85
  array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
86
  array('"Arial Black", "Arial Bold", Gadget, sans-serif', 'Arial Black'),
@@ -131,7 +131,7 @@
131
  ),
132
  array(
133
  'group',
134
- __('Serif:', 'wbcr_factory_forms_418'),
135
  array(
136
  array(
137
  'Baskerville, "Baskerville Old Face", "Hoefler Text", Garamond, "Times New Roman", serif',
@@ -187,7 +187,7 @@
187
  ),
188
  array(
189
  'group',
190
- __('Monospaced:', 'wbcr_factory_forms_418'),
191
  array(
192
  array('"Andale Mono", AndaleMono, monospace', 'Andale Mono'),
193
  array('Consolas, monaco, monospace', 'Consolas'),
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms427_FontControl') ) {
24
 
25
+ class Wbcr_FactoryForms427_FontControl extends Wbcr_FactoryForms427_ComplexControl {
26
 
27
  public $type = 'font';
28
 
54
  'pickerTarget' => '.factory-control-' . $this->options['name'] . ' .factory-picker-target'
55
  );
56
 
57
+ $this->size = new Wbcr_FactoryForms427_IntegerControl($option_font_size, $form, $provider);
58
+ $this->family = new Wbcr_FactoryForms427_DropdownControl($option_font_family, $form, $provider);
59
+ $this->color = new Wbcr_FactoryForms427_ColorControl($optionFontColor, $form, $provider);
60
 
61
  $this->innerControls = array($this->family, $this->size, $this->color);
62
  }
66
 
67
  $fonts = $this->getDefaultFonts();
68
 
69
+ $fonts = apply_filters('wbcr_factory_forms_427_fonts', $fonts);
70
+ $fonts = apply_filters('wbcr_factory_forms_427_fonts-' . $this->options['name'], $fonts);
71
 
72
  return $fonts;
73
  }
77
 
78
  $fonts = array(
79
 
80
+ array('inherit', __('(use default website font)', 'wbcr_factory_forms_427')),
81
  array(
82
  'group',
83
+ __('Sans Serif:', 'wbcr_factory_forms_427'),
84
  array(
85
  array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
86
  array('"Arial Black", "Arial Bold", Gadget, sans-serif', 'Arial Black'),
131
  ),
132
  array(
133
  'group',
134
+ __('Serif:', 'wbcr_factory_forms_427'),
135
  array(
136
  array(
137
  'Baskerville, "Baskerville Old Face", "Hoefler Text", Garamond, "Times New Roman", serif',
187
  ),
188
  array(
189
  'group',
190
+ __('Monospaced:', 'wbcr_factory_forms_427'),
191
  array(
192
  array('"Andale Mono", AndaleMono, monospace', 'Andale Mono'),
193
  array('Consolas, monaco, monospace', 'Consolas'),
libs/factory/forms/controls/google-font.php CHANGED
@@ -15,7 +15,7 @@
15
  * @package core
16
  * @since 1.0.0
17
  */
18
- class Wbcr_FactoryForms418_GoogleFontControl extends Wbcr_FactoryForms418_FontControl {
19
 
20
  public $type = 'google-font';
21
  const APIKEY = 'AIzaSyB-3vazYv7Q-5QZA04bmSKFrWcw_VhC40w';
@@ -30,7 +30,7 @@
30
  'cssClass' => 'factory-google-font-data'
31
  );
32
 
33
- $this->google_font_data = new Wbcr_FactoryForms418_HiddenControl($option_google_font_data, $form, $provider);
34
  $this->inner_controls[] = $this->google_font_data;
35
  }
36
 
@@ -49,12 +49,12 @@
49
  $google_fonts = $this->getGoogleFonts();
50
 
51
  $fonts = array(
52
- array('inherit', __('(use default website font)', 'wbcr_factory_forms_418'))
53
  );
54
 
55
  $fontsCommon = array(
56
  'group',
57
- __('Standard:', 'wbcr_factory_forms_418'),
58
  array(
59
 
60
  array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
@@ -65,7 +65,7 @@
65
  )
66
  );
67
 
68
- $fontsGoogleFonts = array('group', __('Google Fonts:', 'wbcr_factory_forms_418'), array());
69
 
70
  foreach($google_fonts->items as $item) {
71
 
@@ -115,7 +115,7 @@
115
 
116
  if( is_wp_error($response) ) {
117
 
118
- $this->error = __('Unable to retrieve the list of Google Fonts.', 'wbcr_factory_forms_418');
119
  $this->defailed_error = $response->get_error_message();
120
 
121
  return $body;
@@ -123,7 +123,7 @@
123
 
124
  if( !isset($response['body']) ) {
125
 
126
- $this->error = __('Invalide response from the Google Fonts API.', 'wbcr_factory_forms_418');
127
  $this->defailed_error = $response['body'];
128
 
129
  return $body;
@@ -133,7 +133,7 @@
133
 
134
  if( empty($body->items) ) {
135
 
136
- $this->error = __('Unexpected error. The list of Google Fonts are empty.', 'wbcr_factory_forms_418');
137
 
138
  return $body;
139
  }
15
  * @package core
16
  * @since 1.0.0
17
  */
18
+ class Wbcr_FactoryForms427_GoogleFontControl extends Wbcr_FactoryForms427_FontControl {
19
 
20
  public $type = 'google-font';
21
  const APIKEY = 'AIzaSyB-3vazYv7Q-5QZA04bmSKFrWcw_VhC40w';
30
  'cssClass' => 'factory-google-font-data'
31
  );
32
 
33
+ $this->google_font_data = new Wbcr_FactoryForms427_HiddenControl($option_google_font_data, $form, $provider);
34
  $this->inner_controls[] = $this->google_font_data;
35
  }
36
 
49
  $google_fonts = $this->getGoogleFonts();
50
 
51
  $fonts = array(
52
+ array('inherit', __('(use default website font)', 'wbcr_factory_forms_427'))
53
  );
54
 
55
  $fontsCommon = array(
56
  'group',
57
+ __('Standard:', 'wbcr_factory_forms_427'),
58
  array(
59
 
60
  array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
65
  )
66
  );
67
 
68
+ $fontsGoogleFonts = array('group', __('Google Fonts:', 'wbcr_factory_forms_427'), array());
69
 
70
  foreach($google_fonts->items as $item) {
71
 
115
 
116
  if( is_wp_error($response) ) {
117
 
118
+ $this->error = __('Unable to retrieve the list of Google Fonts.', 'wbcr_factory_forms_427');
119
  $this->defailed_error = $response->get_error_message();
120
 
121
  return $body;
123
 
124
  if( !isset($response['body']) ) {
125
 
126
+ $this->error = __('Invalide response from the Google Fonts API.', 'wbcr_factory_forms_427');
127
  $this->defailed_error = $response['body'];
128
 
129
  return $body;
133
 
134
  if( empty($body->items) ) {
135
 
136
+ $this->error = __('Unexpected error. The list of Google Fonts are empty.', 'wbcr_factory_forms_427');
137
 
138
  return $body;
139
  }
libs/factory/forms/controls/gradient.php CHANGED
@@ -25,8 +25,8 @@
25
  exit;
26
  }
27
 
28
- if( !class_exists('Wbcr_FactoryForms418_GradientControl') ) {
29
- class Wbcr_FactoryForms418_GradientControl extends Wbcr_FactoryForms418_Control {
30
 
31
  public $type = 'gradient';
32
 
@@ -66,8 +66,8 @@
66
  if( !window.factory.res ) {
67
  window.factory.res = {};
68
  }
69
- factory.res.resVertical = '<?php _e( 'vertical', 'wbcr_factory_forms_418' ) ?>';
70
- factory.res.resHorizontal = '<?php _e( 'horizontal', 'wbcr_factory_forms_418' ) ?>';
71
  </script>
72
  <div <?php $this->attrs() ?>>
73
  <div class="factory-gradient-picker">
25
  exit;
26
  }
27
 
28
+ if( !class_exists('Wbcr_FactoryForms427_GradientControl') ) {
29
+ class Wbcr_FactoryForms427_GradientControl extends Wbcr_FactoryForms427_Control {
30
 
31
  public $type = 'gradient';
32
 
66
  if( !window.factory.res ) {
67
  window.factory.res = {};
68
  }
69
+ factory.res.resVertical = '<?php _e( 'vertical', 'wbcr_factory_forms_427' ) ?>';
70
+ factory.res.resHorizontal = '<?php _e( 'horizontal', 'wbcr_factory_forms_427' ) ?>';
71
  </script>
72
  <div <?php $this->attrs() ?>>
73
  <div class="factory-gradient-picker">
libs/factory/forms/controls/hidden.php CHANGED
@@ -20,9 +20,9 @@
20
  exit;
21
  }
22
 
23
- if( !class_exists('Wbcr_FactoryForms418_HiddenControl') ) {
24
 
25
- class Wbcr_FactoryForms418_HiddenControl extends Wbcr_FactoryForms418_Control {
26
 
27
  public $type = 'hidden';
28
 
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms427_HiddenControl') ) {
24
 
25
+ class Wbcr_FactoryForms427_HiddenControl extends Wbcr_FactoryForms427_Control {
26
 
27
  public $type = 'hidden';
28
 
libs/factory/forms/controls/holders/accordion-item.php CHANGED
@@ -14,14 +14,14 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_AccordionItemHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms418_AccordionItemHolder extends Wbcr_FactoryForms418_Holder {
25
 
26
  /**
27
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_AccordionItemHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms427_AccordionItemHolder extends Wbcr_FactoryForms427_Holder {
25
 
26
  /**
27
  * A holder type.
libs/factory/forms/controls/holders/accordion.php CHANGED
@@ -13,13 +13,13 @@
13
  if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
- if( !class_exists('Wbcr_FactoryForms418_AccordionHolder') ) {
17
  /**
18
  * Tab Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_FactoryForms418_AccordionHolder extends Wbcr_FactoryForms418_Holder {
23
 
24
  /**
25
  * A holder type.
13
  if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
+ if( !class_exists('Wbcr_FactoryForms427_AccordionHolder') ) {
17
  /**
18
  * Tab Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
+ class Wbcr_FactoryForms427_AccordionHolder extends Wbcr_FactoryForms427_Holder {
23
 
24
  /**
25
  * A holder type.
libs/factory/forms/controls/holders/columns.php CHANGED
@@ -14,13 +14,13 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_ColumnsHolder') ) {
18
  /**
19
  * Columns Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms418_ColumnsHolder extends Wbcr_FactoryForms418_Holder {
24
 
25
  /**
26
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_ColumnsHolder') ) {
18
  /**
19
  * Columns Holder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms427_ColumnsHolder extends Wbcr_FactoryForms427_Holder {
24
 
25
  /**
26
  * A holder type.
libs/factory/forms/controls/holders/control-group-item.php CHANGED
@@ -14,14 +14,14 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_ControlGroupItem') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms418_ControlGroupItem extends Wbcr_FactoryForms418_Holder {
25
 
26
  /**
27
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_ControlGroupItem') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms427_ControlGroupItem extends Wbcr_FactoryForms427_Holder {
25
 
26
  /**
27
  * A holder type.
libs/factory/forms/controls/holders/control-group.php CHANGED
@@ -14,14 +14,14 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_ControlGroupHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms418_ControlGroupHolder extends Wbcr_FactoryForms418_ControlHolder {
25
 
26
  /**
27
  * A holder type.
@@ -61,7 +61,7 @@
61
  continue;
62
  }
63
 
64
- $builder = new Wbcr_FactoryForms418_HtmlAttributeBuilder();
65
 
66
  $builder->addCssClass('factory-control-group-nav-label');
67
  $builder->addCssClass('factory-control-group-nav-label-' . $element->getOption('name'));
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_ControlGroupHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms427_ControlGroupHolder extends Wbcr_FactoryForms427_ControlHolder {
25
 
26
  /**
27
  * A holder type.
61
  continue;
62
  }
63
 
64
+ $builder = new Wbcr_FactoryForms427_HtmlAttributeBuilder();
65
 
66
  $builder->addCssClass('factory-control-group-nav-label');
67
  $builder->addCssClass('factory-control-group-nav-label-' . $element->getOption('name'));
libs/factory/forms/controls/holders/div.php CHANGED
@@ -14,13 +14,13 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_DivHolder') ) {
18
  /**
19
  * Div Control Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms418_DivHolder extends Wbcr_FactoryForms418_Holder {
24
 
25
  /**
26
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_DivHolder') ) {
18
  /**
19
  * Div Control Holder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms427_DivHolder extends Wbcr_FactoryForms427_Holder {
24
 
25
  /**
26
  * A holder type.
libs/factory/forms/controls/holders/form-group.php CHANGED
@@ -14,13 +14,13 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_FormGroupHolder') ) {
18
  /**
19
  * Group Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms418_FormGroupHolder extends Wbcr_FactoryForms418_Holder {
24
 
25
  /**
26
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_FormGroupHolder') ) {
18
  /**
19
  * Group Holder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms427_FormGroupHolder extends Wbcr_FactoryForms427_Holder {
24
 
25
  /**
26
  * A holder type.
libs/factory/forms/controls/holders/more-link.php CHANGED
@@ -14,14 +14,14 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_MoreLinkHolder') ) {
18
 
19
  /**
20
  * Collapsed Group Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms418_MoreLinkHolder extends Wbcr_FactoryForms418_Holder {
25
 
26
  /**
27
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_MoreLinkHolder') ) {
18
 
19
  /**
20
  * Collapsed Group Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms427_MoreLinkHolder extends Wbcr_FactoryForms427_Holder {
25
 
26
  /**
27
  * A holder type.
libs/factory/forms/controls/holders/tab-item.php CHANGED
@@ -13,13 +13,13 @@
13
  exit;
14
  }
15
 
16
- if( !class_exists('Wbcr_FactoryForms418_TabItemHolder') ) {
17
  /**
18
  * Tab Item Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_FactoryForms418_TabItemHolder extends Wbcr_FactoryForms418_Holder {
23
 
24
  /**
25
  * A holder type.
13
  exit;
14
  }
15
 
16
+ if( !class_exists('Wbcr_FactoryForms427_TabItemHolder') ) {
17
  /**
18
  * Tab Item Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
+ class Wbcr_FactoryForms427_TabItemHolder extends Wbcr_FactoryForms427_Holder {
23
 
24
  /**
25
  * A holder type.
libs/factory/forms/controls/holders/tab.php CHANGED
@@ -14,14 +14,14 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_TabHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms418_TabHolder extends Wbcr_FactoryForms418_Holder {
25
 
26
  /**
27
  * A holder type.
@@ -44,7 +44,7 @@
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
- * @param FactoryForms418_Form $form A parent form.
48
  */
49
  public function __construct($options, $form)
50
  {
@@ -88,7 +88,7 @@
88
  $tab_icon = $element->options['icon'];
89
  }
90
 
91
- $builder = new Wbcr_FactoryForms418_HtmlAttributeBuilder();
92
 
93
  $builder->addCssClass('factory-tab-item-header');
94
  $builder->addCssClass('factory-tab-item-header-' . $element->getName());
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_TabHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms427_TabHolder extends Wbcr_FactoryForms427_Holder {
25
 
26
  /**
27
  * A holder type.
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
+ * @param FactoryForms427_Form $form A parent form.
48
  */
49
  public function __construct($options, $form)
50
  {
88
  $tab_icon = $element->options['icon'];
89
  }
90
 
91
+ $builder = new Wbcr_FactoryForms427_HtmlAttributeBuilder();
92
 
93
  $builder->addCssClass('factory-tab-item-header');
94
  $builder->addCssClass('factory-tab-item-header-' . $element->getName());
libs/factory/forms/controls/integer.php CHANGED
@@ -32,9 +32,9 @@
32
  exit;
33
  }
34
 
35
- if( !class_exists('Wbcr_FactoryForms418_IntegerControl') ) {
36
 
37
- class Wbcr_FactoryForms418_IntegerControl extends Wbcr_FactoryForms418_Control {
38
 
39
  public $type = 'integer';
40
 
32
  exit;
33
  }
34
 
35
+ if( !class_exists('Wbcr_FactoryForms427_IntegerControl') ) {
36
 
37
+ class Wbcr_FactoryForms427_IntegerControl extends Wbcr_FactoryForms427_Control {
38
 
39
  public $type = 'integer';
40
 
libs/factory/forms/controls/list.php CHANGED
@@ -21,9 +21,9 @@
21
  exit;
22
  }
23
 
24
- if( !class_exists('Wbcr_FactoryForms418_ListControl') ) {
25
 
26
- class Wbcr_FactoryForms418_ListControl extends Wbcr_FactoryForms418_Control {
27
 
28
  public $type = 'list';
29
 
@@ -93,7 +93,7 @@
93
  'url': '<?php echo $data['url'] ?>',
94
  'data': <?php echo json_encode( $data['data'] ) ?>,
95
  'selected': <?php echo json_encode( $value ) ?>,
96
- 'emptyList': '<?php echo $this->getOption('empty', __('The list is empty.', 'wbcr_factory_forms_418') ) ?>'
97
  };
98
  </script>
99
  <?php
@@ -136,7 +136,7 @@
136
  : array();
137
 
138
  $is_empty = $this->isAjax() || empty($items);
139
- $emptyList = $this->getOption('empty', __('The list is empty.', 'wbcr_factory_forms_418'));
140
 
141
  if( $is_empty ) {
142
  $this->addCssClass('factory-empty');
21
  exit;
22
  }
23
 
24
+ if( !class_exists('Wbcr_FactoryForms427_ListControl') ) {
25
 
26
+ class Wbcr_FactoryForms427_ListControl extends Wbcr_FactoryForms427_Control {
27
 
28
  public $type = 'list';
29
 
93
  'url': '<?php echo $data['url'] ?>',
94
  'data': <?php echo json_encode( $data['data'] ) ?>,
95
  'selected': <?php echo json_encode( $value ) ?>,
96
+ 'emptyList': '<?php echo $this->getOption('empty', __('The list is empty.', 'wbcr_factory_forms_427') ) ?>'
97
  };
98
  </script>
99
  <?php
136
  : array();
137
 
138
  $is_empty = $this->isAjax() || empty($items);
139
+ $emptyList = $this->getOption('empty', __('The list is empty.', 'wbcr_factory_forms_427'));
140
 
141
  if( $is_empty ) {
142
  $this->addCssClass('factory-empty');
libs/factory/forms/controls/multiple-textbox.php CHANGED
@@ -15,9 +15,9 @@
15
  exit;
16
  }
17
 
18
- if( !class_exists('Wbcr_FactoryForms418_MultipleTextboxControl') ) {
19
 
20
- class Wbcr_FactoryForms418_MultipleTextboxControl extends Wbcr_FactoryForms418_Control {
21
 
22
  public $type = 'multiple-textbox';
23
 
@@ -86,7 +86,7 @@
86
  <?php endif; ?>
87
  </div>
88
  <button class="btn btn-default btn-small factory-mtextbox-add-item">
89
- <i class="fa fa-plus" aria-hidden="true"></i> <?php _e('Add new', 'wbcr_factory_forms_418') ?>
90
  </button>
91
  </div>
92
 
15
  exit;
16
  }
17
 
18
+ if( !class_exists('Wbcr_FactoryForms427_MultipleTextboxControl') ) {
19
 
20
+ class Wbcr_FactoryForms427_MultipleTextboxControl extends Wbcr_FactoryForms427_Control {
21
 
22
  public $type = 'multiple-textbox';
23
 
86
  <?php endif; ?>
87
  </div>
88
  <button class="btn btn-default btn-small factory-mtextbox-add-item">
89
+ <i class="fa fa-plus" aria-hidden="true"></i> <?php _e('Add new', 'wbcr_factory_forms_427') ?>
90
  </button>
91
  </div>
92
 
libs/factory/forms/controls/paddings-editor.php CHANGED
@@ -14,9 +14,9 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_PaddingsEditorControl') ) {
18
 
19
- class Wbcr_FactoryForms418_PaddingsEditorControl extends Wbcr_FactoryForms418_Control {
20
 
21
  public $type = 'paddings-editor';
22
 
@@ -67,7 +67,7 @@
67
  </div>
68
  <div class="factory-slider-container">
69
  <label class="factory-title">
70
- <?php _e('Select a side and move the slider to set up:', 'wbcr_factory_forms_418') ?>
71
  </label>
72
 
73
  <div class="factory-slider">
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_PaddingsEditorControl') ) {
18
 
19
+ class Wbcr_FactoryForms427_PaddingsEditorControl extends Wbcr_FactoryForms427_Control {
20
 
21
  public $type = 'paddings-editor';
22
 
67
  </div>
68
  <div class="factory-slider-container">
69
  <label class="factory-title">
70
+ <?php _e('Select a side and move the slider to set up:', 'wbcr_factory_forms_427') ?>
71
  </label>
72
 
73
  <div class="factory-slider">
libs/factory/forms/controls/pattern.php CHANGED
@@ -15,9 +15,9 @@
15
  exit;
16
  }
17
 
18
- if( !class_exists('Wbcr_FactoryForms418_PatternControl') ) {
19
 
20
- class Wbcr_FactoryForms418_PatternControl extends Wbcr_FactoryForms418_Control {
21
 
22
  public $type = 'pattern';
23
 
@@ -52,12 +52,12 @@
52
  $name = $this->getOption('name');
53
 
54
  // filters to get available patterns for the given background contols
55
- $this->patterns = apply_filters('wbcr_factory_forms_418_patterns', array());
56
- $this->patterns = apply_filters('wbcr_factory_forms_418_patterns-' . $name, $this->patterns);
57
 
58
  $this->custom_patterns = $this->getOption('patterns', array());
59
 
60
- $this->color = new Wbcr_FactoryForms418_ColorControl($options['color'], $form, $provider);
61
  }
62
 
63
  /**
@@ -102,19 +102,19 @@
102
  </div>
103
  <a href="#" class="button button-default factory-button factory-change-color-btn <?php if( $hasColor ) {
104
  echo 'button-active';
105
- } ?>" title="<?php _e('Change color', 'wbcr_factory_forms_418') ?>">
106
  <i class="fa fa-flask"></i>
107
- <span><?php _e('re-color', 'wbcr_factory_forms_418') ?></span>
108
  </a>
109
  <input type="hidden" id="<?php echo $name[0]; ?>" name="<?php echo $name[0]; ?>" value="<?php echo esc_url($values['url']); ?>" class="factory-pattern-result">
110
  <input type="hidden" id="<?php echo $name[1]; ?>" name="<?php echo $name[1]; ?>" value="<?php echo esc_attr($values['color']); ?>" class="factory-color-result">
111
  </div>
112
  <div class="factory-color-panel">
113
  <div class="factory-color-wrap">
114
- <span class="factory-color-label"><?php _e('Select color:', 'wbcr_factory_forms_418') ?></span>
115
  <?php $this->color->html() ?>
116
  <div class="factory-hint">
117
- <i><?php _e('Changing the color may takes a minute or more. Please be patient.', 'wbcr_factory_forms_418') ?></i>
118
  </div>
119
  </div>
120
  <div class="factory-picker-target"></div>
15
  exit;
16
  }
17
 
18
+ if( !class_exists('Wbcr_FactoryForms427_PatternControl') ) {
19
 
20
+ class Wbcr_FactoryForms427_PatternControl extends Wbcr_FactoryForms427_Control {
21
 
22
  public $type = 'pattern';
23
 
52
  $name = $this->getOption('name');
53
 
54
  // filters to get available patterns for the given background contols
55
+ $this->patterns = apply_filters('wbcr_factory_forms_427_patterns', array());
56
+ $this->patterns = apply_filters('wbcr_factory_forms_427_patterns-' . $name, $this->patterns);
57
 
58
  $this->custom_patterns = $this->getOption('patterns', array());
59
 
60
+ $this->color = new Wbcr_FactoryForms427_ColorControl($options['color'], $form, $provider);
61
  }
62
 
63
  /**
102
  </div>
103
  <a href="#" class="button button-default factory-button factory-change-color-btn <?php if( $hasColor ) {
104
  echo 'button-active';
105
+ } ?>" title="<?php _e('Change color', 'wbcr_factory_forms_427') ?>">
106
  <i class="fa fa-flask"></i>
107
+ <span><?php _e('re-color', 'wbcr_factory_forms_427') ?></span>
108
  </a>
109
  <input type="hidden" id="<?php echo $name[0]; ?>" name="<?php echo $name[0]; ?>" value="<?php echo esc_url($values['url']); ?>" class="factory-pattern-result">
110
  <input type="hidden" id="<?php echo $name[1]; ?>" name="<?php echo $name[1]; ?>" value="<?php echo esc_attr($values['color']); ?>" class="factory-color-result">
111
  </div>
112
  <div class="factory-color-panel">
113
  <div class="factory-color-wrap">
114
+ <span class="factory-color-label"><?php _e('Select color:', 'wbcr_factory_forms_427') ?></span>
115
  <?php $this->color->html() ?>
116
  <div class="factory-hint">
117
+ <i><?php _e('Changing the color may takes a minute or more. Please be patient.', 'wbcr_factory_forms_427') ?></i>
118
  </div>
119
  </div>
120
  <div class="factory-picker-target"></div>
libs/factory/forms/controls/radio-colors.php CHANGED
@@ -27,9 +27,9 @@
27
  exit;
28
  }
29
 
30
- if( !class_exists('Wbcr_FactoryForms418_RadioColorsControl') ) {
31
 
32
- class Wbcr_FactoryForms418_RadioColorsControl extends Wbcr_FactoryForms418_Control {
33
 
34
  public $type = 'radio-color';
35
 
27
  exit;
28
  }
29
 
30
+ if( !class_exists('Wbcr_FactoryForms427_RadioColorsControl') ) {
31
 
32
+ class Wbcr_FactoryForms427_RadioColorsControl extends Wbcr_FactoryForms427_Control {
33
 
34
  public $type = 'radio-color';
35
 
libs/factory/forms/controls/radio.php CHANGED
@@ -21,9 +21,9 @@
21
  exit;
22
  }
23
 
24
- if( !class_exists('Wbcr_FactoryForms418_RadioControl') ) {
25
 
26
- class Wbcr_FactoryForms418_RadioControl extends Wbcr_FactoryForms418_Control {
27
 
28
  public $type = 'radio';
29
 
21
  exit;
22
  }
23
 
24
+ if( !class_exists('Wbcr_FactoryForms427_RadioControl') ) {
25
 
26
+ class Wbcr_FactoryForms427_RadioControl extends Wbcr_FactoryForms427_Control {
27
 
28
  public $type = 'radio';
29
 
libs/factory/forms/controls/textarea.php CHANGED
@@ -20,9 +20,9 @@
20
  exit;
21
  }
22
 
23
- if( !class_exists('Wbcr_FactoryForms418_TextareaControl') ) {
24
 
25
- class Wbcr_FactoryForms418_TextareaControl extends Wbcr_FactoryForms418_Control {
26
 
27
  public $type = 'textarea';
28
 
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms427_TextareaControl') ) {
24
 
25
+ class Wbcr_FactoryForms427_TextareaControl extends Wbcr_FactoryForms427_Control {
26
 
27
  public $type = 'textarea';
28
 
libs/factory/forms/controls/textbox.php CHANGED
@@ -29,9 +29,9 @@
29
  exit;
30
  }
31
 
32
- if( !class_exists('Wbcr_FactoryForms418_TextboxControl') ) {
33
 
34
- class Wbcr_FactoryForms418_TextboxControl extends Wbcr_FactoryForms418_Control {
35
 
36
  public $type = 'textbox';
37
 
29
  exit;
30
  }
31
 
32
+ if( !class_exists('Wbcr_FactoryForms427_TextboxControl') ) {
33
 
34
+ class Wbcr_FactoryForms427_TextboxControl extends Wbcr_FactoryForms427_Control {
35
 
36
  public $type = 'textbox';
37
 
libs/factory/forms/controls/url.php CHANGED
@@ -4,7 +4,7 @@
4
  * Url Control
5
  *
6
  * Main options:
7
- * @see FactoryForms418_TextboxControl
8
  *
9
  * @author Alex Kovalev <alex.kovalevv@gmail.com>
10
  * @copyright (c) 2018, Webcraftic Ltd
@@ -18,9 +18,9 @@
18
  exit;
19
  }
20
 
21
- if( !class_exists('Wbcr_FactoryForms418_UrlControl') ) {
22
 
23
- class Wbcr_FactoryForms418_UrlControl extends Wbcr_FactoryForms418_TextboxControl {
24
 
25
  public $type = 'url';
26
 
4
  * Url Control
5
  *
6
  * Main options:
7
+ * @see FactoryForms427_TextboxControl
8
  *
9
  * @author Alex Kovalev <alex.kovalevv@gmail.com>
10
  * @copyright (c) 2018, Webcraftic Ltd
18
  exit;
19
  }
20
 
21
+ if( !class_exists('Wbcr_FactoryForms427_UrlControl') ) {
22
 
23
+ class Wbcr_FactoryForms427_UrlControl extends Wbcr_FactoryForms427_TextboxControl {
24
 
25
  public $type = 'url';
26
 
libs/factory/forms/controls/wp-editor.php CHANGED
@@ -22,9 +22,9 @@
22
  exit;
23
  }
24
 
25
- if( !class_exists('Wbcr_FactoryForms418_WpEditorControl') ) {
26
 
27
- class Wbcr_FactoryForms418_WpEditorControl extends Wbcr_FactoryForms418_Control {
28
 
29
  public $type = 'wp-editor';
30
 
@@ -42,7 +42,7 @@
42
  }
43
 
44
  if( !isset($this->options['tinymce']['content_css']) ) {
45
- $this->options['tinymce']['content_css'] = FACTORY_FORMS_418_URL . '/assets/css/editor.css';
46
  }
47
  }
48
 
22
  exit;
23
  }
24
 
25
+ if( !class_exists('Wbcr_FactoryForms427_WpEditorControl') ) {
26
 
27
+ class Wbcr_FactoryForms427_WpEditorControl extends Wbcr_FactoryForms427_Control {
28
 
29
  public $type = 'wp-editor';
30
 
42
  }
43
 
44
  if( !isset($this->options['tinymce']['content_css']) ) {
45
+ $this->options['tinymce']['content_css'] = FACTORY_FORMS_427_URL . '/assets/css/editor.css';
46
  }
47
  }
48
 
libs/factory/forms/includes/complex-control.class.php CHANGED
@@ -13,13 +13,13 @@
13
  if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
- if( !class_exists('Wbcr_FactoryForms418_ComplexControl') ) {
17
  /**
18
  * The base class for all controls.
19
  *
20
  * @since 1.0.0
21
  */
22
- abstract class Wbcr_FactoryForms418_ComplexControl extends Wbcr_FactoryForms418_Control {
23
 
24
  /**
25
  * Is this element a complex control?
@@ -33,7 +33,7 @@
33
  * Contains a set of internal controls.
34
  *
35
  * @since 1.0.0
36
- * @var Wbcr_FactoryForms418_Control[]
37
  */
38
  public $inner_controls = array();
39
 
@@ -41,7 +41,7 @@
41
  * Sets a provider for the control.
42
  *
43
  * @since 1.0.0
44
- * @param Wbcr_IFactoryForms418_ValueProvider $provider
45
  * @return void
46
  */
47
  public function setProvider($provider)
13
  if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
+ if( !class_exists('Wbcr_FactoryForms427_ComplexControl') ) {
17
  /**
18
  * The base class for all controls.
19
  *
20
  * @since 1.0.0
21
  */
22
+ abstract class Wbcr_FactoryForms427_ComplexControl extends Wbcr_FactoryForms427_Control {
23
 
24
  /**
25
  * Is this element a complex control?
33
  * Contains a set of internal controls.
34
  *
35
  * @since 1.0.0
36
+ * @var Wbcr_FactoryForms427_Control[]
37
  */
38
  public $inner_controls = array();
39
 
41
  * Sets a provider for the control.
42
  *
43
  * @since 1.0.0
44
+ * @param Wbcr_IFactoryForms427_ValueProvider $provider
45
  * @return void
46
  */
47
  public function setProvider($provider)
libs/factory/forms/includes/control-holder.class.php CHANGED
@@ -14,19 +14,19 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_ControlHolder') ) {
18
  /**
19
  * The base class for control holders.
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_FactoryForms418_ControlHolder extends Wbcr_FactoryForms418_Control {
24
 
25
  /**
26
  * Holder Elements.
27
  *
28
  * @since 1.0.0
29
- * @var Wbcr_FactoryForms418_Control[]
30
  */
31
  protected $elements = array();
32
 
@@ -43,7 +43,7 @@
43
  *
44
  * @since 1.0.0
45
  * @param mixed[] $options A holder options.
46
- * @param Wbcr_FactoryForms418_Form $form A parent form.
47
  */
48
  public function __construct($options, $form)
49
  {
@@ -60,7 +60,7 @@
60
  * Returns holder elements.
61
  *
62
  * @since 1.0.0
63
- * @return Wbcr_FactoryForms418_FormElement[].
64
  */
65
  public function getElements()
66
  {
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_ControlHolder') ) {
18
  /**
19
  * The base class for control holders.
20
  *
21
  * @since 1.0.0
22
  */
23
+ abstract class Wbcr_FactoryForms427_ControlHolder extends Wbcr_FactoryForms427_Control {
24
 
25
  /**
26
  * Holder Elements.
27
  *
28
  * @since 1.0.0
29
+ * @var Wbcr_FactoryForms427_Control[]
30
  */
31
  protected $elements = array();
32
 
43
  *
44
  * @since 1.0.0
45
  * @param mixed[] $options A holder options.
46
+ * @param Wbcr_FactoryForms427_Form $form A parent form.
47
  */
48
  public function __construct($options, $form)
49
  {
60
  * Returns holder elements.
61
  *
62
  * @since 1.0.0
63
+ * @return Wbcr_FactoryForms427_FormElement[].
64
  */
65
  public function getElements()
66
  {
libs/factory/forms/includes/control.class.php CHANGED
@@ -14,14 +14,14 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_Control') ) {
18
 
19
  /**
20
  * The base class for all controls.
21
  *
22
  * @since 1.0.0
23
  */
24
- abstract class Wbcr_FactoryForms418_Control extends Wbcr_FactoryForms418_FormElement {
25
 
26
  /**
27
  * Is this element a control?
@@ -43,7 +43,7 @@
43
  * A provider that is used to get values.
44
  *
45
  * @since 1.0.0
46
- * @var Wbcr_IFactoryForms418_ValueProvider
47
  */
48
  protected $provider = null;
49
 
@@ -51,7 +51,7 @@
51
  * Create a new instance of the control.
52
  *
53
  * @param mixed[] $options
54
- * @param FactoryForms418_Form $form
55
  * @param null $provider
56
  * @since 1.0.0
57
  * @return void
@@ -66,7 +66,7 @@
66
  * Sets a provider for the control.
67
  *
68
  * @since 1.0.0
69
- * @param IFactoryForms418_ValueProvider $provider
70
  * @return void
71
  */
72
  public function setProvider($provider)
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_Control') ) {
18
 
19
  /**
20
  * The base class for all controls.
21
  *
22
  * @since 1.0.0
23
  */
24
+ abstract class Wbcr_FactoryForms427_Control extends Wbcr_FactoryForms427_FormElement {
25
 
26
  /**
27
  * Is this element a control?
43
  * A provider that is used to get values.
44
  *
45
  * @since 1.0.0
46
+ * @var Wbcr_IFactoryForms427_ValueProvider
47
  */
48
  protected $provider = null;
49
 
51
  * Create a new instance of the control.
52
  *
53
  * @param mixed[] $options
54
+ * @param FactoryForms427_Form $form
55
  * @param null $provider
56
  * @since 1.0.0
57
  * @return void
66
  * Sets a provider for the control.
67
  *
68
  * @since 1.0.0
69
+ * @param IFactoryForms427_ValueProvider $provider
70
  * @return void
71
  */
72
  public function setProvider($provider)
libs/factory/forms/includes/custom-element.class.php CHANGED
@@ -14,13 +14,13 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_CustomElement') ) {
18
  /**
19
  * The base class for all controls.
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_FactoryForms418_CustomElement extends Wbcr_FactoryForms418_FormElement {
24
 
25
  /**
26
  * Is this element a custom form element?
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_CustomElement') ) {
18
  /**
19
  * The base class for all controls.
20
  *
21
  * @since 1.0.0
22
  */
23
+ abstract class Wbcr_FactoryForms427_CustomElement extends Wbcr_FactoryForms427_FormElement {
24
 
25
  /**
26
  * Is this element a custom form element?
libs/factory/forms/includes/form-element.class.php CHANGED
@@ -14,7 +14,7 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_FormElement') ) {
18
 
19
  /**
20
  * The base class for all form element (controls, holders).
@@ -23,7 +23,7 @@
23
  *
24
  * @since 1.0.0
25
  */
26
- abstract class Wbcr_FactoryForms418_FormElement {
27
 
28
  /**
29
  * A type of an elemnt.
@@ -37,7 +37,7 @@
37
  * An html attribute builder.
38
  *
39
  * @since 1.0.0
40
- * @var Wbcr_FactoryForms418_HtmlAttributeBuilder
41
  */
42
  private $html_builder;
43
 
@@ -53,7 +53,7 @@
53
  * A parent form.
54
  *
55
  * @since 1.0.0
56
- * @var Wbcr_FactoryForms418_Form
57
  */
58
  protected $form;
59
 
@@ -61,7 +61,7 @@
61
  * A form layout.
62
  *
63
  * @since 1.0.0
64
- * @var Wbcr_FactoryForms418_FormLayout
65
  */
66
  protected $layout;
67
 
@@ -94,7 +94,7 @@
94
  *
95
  * @since 1.0.0
96
  * @param mixed[] $options A holder options.
97
- * @param Wbcr_FactoryForms418_Form $form A parent form.
98
  */
99
  public function __construct($options, $form)
100
  {
@@ -102,7 +102,7 @@
102
  $this->form = $form;
103
  $this->layout = $form->layout;
104
 
105
- $this->html_builder = new Wbcr_FactoryForms418_HtmlAttributeBuilder();
106
 
107
  if( isset($this->options['cssClass']) ) {
108
  $this->html_builder->addCssClass($this->options['cssClass']);
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_FormElement') ) {
18
 
19
  /**
20
  * The base class for all form element (controls, holders).
23
  *
24
  * @since 1.0.0
25
  */
26
+ abstract class Wbcr_FactoryForms427_FormElement {
27
 
28
  /**
29
  * A type of an elemnt.
37
  * An html attribute builder.
38
  *
39
  * @since 1.0.0
40
+ * @var Wbcr_FactoryForms427_HtmlAttributeBuilder
41
  */
42
  private $html_builder;
43
 
53
  * A parent form.
54
  *
55
  * @since 1.0.0
56
+ * @var Wbcr_FactoryForms427_Form
57
  */
58
  protected $form;
59
 
61
  * A form layout.
62
  *
63
  * @since 1.0.0
64
+ * @var Wbcr_FactoryForms427_FormLayout
65
  */
66
  protected $layout;
67
 
94
  *
95
  * @since 1.0.0
96
  * @param mixed[] $options A holder options.
97
+ * @param Wbcr_FactoryForms427_Form $form A parent form.
98
  */
99
  public function __construct($options, $form)
100
  {
102
  $this->form = $form;
103
  $this->layout = $form->layout;
104
 
105
+ $this->html_builder = new Wbcr_FactoryForms427_HtmlAttributeBuilder();
106
 
107
  if( isset($this->options['cssClass']) ) {
108
  $this->html_builder->addCssClass($this->options['cssClass']);
libs/factory/forms/includes/form-layout.class.php CHANGED
@@ -14,12 +14,12 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_FormLayout') ) {
18
 
19
  /**
20
  * The base class for all form layouts.
21
  */
22
- abstract class Wbcr_FactoryForms418_FormLayout extends Wbcr_FactoryForms418_Holder {
23
 
24
  /**
25
  * A form layout name.
@@ -42,7 +42,7 @@
42
  *
43
  * @since 1.0.0
44
  * @param mixed[] $options A holder options.
45
- * @param Wbcr_FactoryForms418_Form $form A parent form.
46
  */
47
  public function __construct($options, $form)
48
  {
@@ -52,8 +52,8 @@
52
 
53
  parent::__construct($options, $form);
54
 
55
- $this->addCssClass('factory-forms-418-' . $this->type);
56
- $this->addCssClass('factory-forms-418-' . $this->name);
57
  }
58
 
59
  /**
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_FormLayout') ) {
18
 
19
  /**
20
  * The base class for all form layouts.
21
  */
22
+ abstract class Wbcr_FactoryForms427_FormLayout extends Wbcr_FactoryForms427_Holder {
23
 
24
  /**
25
  * A form layout name.
42
  *
43
  * @since 1.0.0
44
  * @param mixed[] $options A holder options.
45
+ * @param Wbcr_FactoryForms427_Form $form A parent form.
46
  */
47
  public function __construct($options, $form)
48
  {
52
 
53
  parent::__construct($options, $form);
54
 
55
+ $this->addCssClass('factory-forms-427-' . $this->type);
56
+ $this->addCssClass('factory-forms-427-' . $this->name);
57
  }
58
 
59
  /**
libs/factory/forms/includes/form.class.php CHANGED
@@ -15,16 +15,16 @@
15
  }
16
 
17
  // creating a license manager for each plugin created via the factory
18
- add_action('wbcr_factory_forms_418_plugin_created', 'wbcr_factory_forms_418_plugin_created');
19
 
20
- function wbcr_factory_forms_418_plugin_created($plugin)
21
  {
22
- $plugin->forms = new Wbcr_FactoryForms418_Manager($plugin);
23
  }
24
 
25
- if( !class_exists('Wbcr_FactoryForms418_Manager') ) {
26
 
27
- class Wbcr_FactoryForms418_Manager {
28
 
29
  // ----------------------------------------------------
30
  // Static fields and methods
@@ -57,7 +57,7 @@
57
  /**
58
  * Registers a set of new controls.
59
  *
60
- * @see FactoryForms418_Form::registerControl()
61
  *
62
  * @since 1.0.0
63
  * @return void
@@ -95,7 +95,7 @@
95
  /**
96
  * Registers a set of new holder controls.
97
  *
98
- * @see FactoryForms418_Form::registerHolder()
99
  *
100
  * @since 1.0.0
101
  * @return void
@@ -129,7 +129,7 @@
129
  /**
130
  * Registers a set of new custom form elements.
131
  *
132
- * @see FactoryForms418_Form::registerCustomElement()
133
  *
134
  * @since 1.0.0
135
  * @return void
@@ -180,11 +180,11 @@
180
  public static $controls_registered = false;
181
  }
182
  }
183
- if( !class_exists('Wbcr_FactoryForms418_Form') ) {
184
  /**
185
  * An abstraction for forms.
186
  */
187
- class Wbcr_FactoryForms418_Form {
188
 
189
  // ----------------------------------------------------
190
  // Object fields and methods
@@ -194,7 +194,7 @@
194
  * A value provider of the form that is used to save and load values.
195
  *
196
  * @since 1.0.0
197
- * @var Wbcr_IFactoryForms418_ValueProvider
198
  */
199
  private $provider;
200
 
@@ -245,7 +245,7 @@
245
  * A current form layout used to render a form.
246
  *
247
  * @since 1.0.0
248
- * @var Wbcr_FactoryForms418_FormLayout
249
  */
250
  public $layout;
251
 
@@ -261,20 +261,20 @@
261
  *
262
  * @since 1.0.0
263
  * @param array $options
264
- * @param Wbcr_Factory420_Plugin $plugin
265
  */
266
- public function __construct(array $options = array(), Wbcr_Factory420_Plugin $plugin)
267
  {
268
  // register controls once, when the first form is created
269
- if( !Wbcr_FactoryForms418_Manager::$controls_registered ) {
270
 
271
- do_action('wbcr_factory_forms_418_register_controls', $plugin);
272
 
273
  //if( !empty($plugin) ) {
274
- do_action('wbcr_factory_forms_418_register_controls_' . $plugin->getPluginName(), $plugin);
275
  //}
276
 
277
- Wbcr_FactoryForms418_Manager::$controls_registered = true;
278
  }
279
 
280
  $this->scope = isset($options['scope']) ? $options['scope'] : null;
@@ -289,14 +289,14 @@
289
  $this->form_layout = 'bootstrap-3';
290
  }
291
 
292
- Wbcr_FactoryForms418_Manager::$temper = 'flat';
293
  }
294
 
295
  /**
296
  * Sets a provider for the control.
297
  *
298
  * @since 1.0.0
299
- * @param Wbcr_IFactoryForms418_ValueProvider $provider
300
  * @return void
301
  */
302
  public function setProvider($provider)
@@ -332,14 +332,14 @@
332
  */
333
  public function getItems()
334
  {
335
- return apply_filters('wbcr_factory_420_form_items', $this->items, $this->name);
336
  }
337
 
338
  /**
339
  * Returns form controls (control objects).
340
  *
341
  * @since 1.0.0
342
- * @return Wbcr_FactoryForms418_Control[]
343
  */
344
  public function getControls()
345
  {
@@ -355,7 +355,7 @@
355
  * Builds a form items to the control objects ready to use.
356
  *
357
  * @param null $holder
358
- * @return Wbcr_FactoryForms418_Control[]
359
  */
360
 
361
  public function createControls($holder = null)
@@ -395,7 +395,7 @@
395
  *
396
  * @since 1.0.0
397
  * @param array $item Item data.
398
- * @return Wbcr_FactoryForms418_FormElement|null A form element.
399
  */
400
  public function createElement($item)
401
  {
@@ -417,7 +417,7 @@
417
  *
418
  * @since 1.0.0
419
  * @param mixed[] $item Data of items.
420
- * @return Wbcr_FactoryForms418_FormElement[] Created elements.
421
  */
422
  public function createElements($items = array())
423
  {
@@ -433,7 +433,7 @@
433
  *
434
  * @since 1.0.0
435
  * @param array $item Item data.
436
- * @return Wbcr_FactoryForms418_Control A control object.
437
  */
438
  public function createControl($item)
439
  {
@@ -441,7 +441,7 @@
441
 
442
  if( is_array($item) ) {
443
 
444
- $control_data = Wbcr_FactoryForms418_Manager::$registered_controls[$item['type']];
445
 
446
  require_once($control_data['include']);
447
 
@@ -465,7 +465,7 @@
465
  *
466
  * @since 1.0.0
467
  * @param array $item Item data.
468
- * @return Wbcr_FactoryForms418_Holder A control holder object.
469
  */
470
  public function createHolder($item)
471
  {
@@ -473,7 +473,7 @@
473
 
474
  if( is_array($item) ) {
475
 
476
- $holderData = Wbcr_FactoryForms418_Manager::$registered_holders[$item['type']];
477
  require_once($holderData['include']);
478
 
479
  $object = new $holderData['class']($item, $this);
@@ -491,7 +491,7 @@
491
  *
492
  * @since 1.0.0
493
  * @param mixed $item Item data.
494
- * @return Wbcr_FactoryForms418_FormElement A custom form element object.
495
  */
496
  public function createCustomElement($item)
497
  {
@@ -499,7 +499,7 @@
499
 
500
  if( is_array($item) ) {
501
 
502
- $data = Wbcr_FactoryForms418_Manager::$registered_custom_elements[$item['type']];
503
  require_once($data['include']);
504
 
505
  $options = $item;
@@ -523,12 +523,12 @@
523
  public function html($options = array())
524
  {
525
 
526
- if( !isset(Wbcr_FactoryForms418_Manager::$form_layouts[$this->form_layout]) ) {
527
  die(sprintf('[ERROR] The form layout %s was not found.', $this->form_layout));
528
  }
529
 
530
  // include a render code
531
- $layout_data = Wbcr_FactoryForms418_Manager::$form_layouts[$this->form_layout];
532
  require_once($layout_data['include']);
533
 
534
  $this->connectAssets();
@@ -552,7 +552,7 @@
552
  {
553
 
554
  $this->connectAssetsForItems();
555
- $layout_data = Wbcr_FactoryForms418_Manager::$form_layouts[$this->form_layout];
556
 
557
  if( $layout_data['name'] == 'default' ) {
558
  if( isset($layout_data['style']) ) {
@@ -602,9 +602,9 @@
602
 
603
  $haystack = array();
604
  if( self::isControl($type) ) {
605
- $haystack = Wbcr_FactoryForms418_Manager::$registered_controls;
606
  } elseif( self::isControlHolder($type) ) {
607
- $haystack = Wbcr_FactoryForms418_Manager::$registered_holders;
608
  }
609
 
610
  if( isset($haystack[$type]) ) {
@@ -660,7 +660,7 @@
660
  */
661
  public static function isControl($item)
662
  {
663
- return isset(Wbcr_FactoryForms418_Manager::$registered_controls[$item['type']]);
664
  }
665
 
666
  /**
@@ -672,7 +672,7 @@
672
  */
673
  public static function isControlHolder($item)
674
  {
675
- return isset(Wbcr_FactoryForms418_Manager::$registered_holders[$item['type']]);
676
  }
677
 
678
  /**
@@ -684,7 +684,7 @@
684
  */
685
  public static function isCustomElement($item)
686
  {
687
- return isset(Wbcr_FactoryForms418_Manager::$registered_custom_elements[$item['type']]);
688
  }
689
  }
690
  }
15
  }
16
 
17
  // creating a license manager for each plugin created via the factory
18
+ add_action('wbcr_factory_forms_427_plugin_created', 'wbcr_factory_forms_427_plugin_created');
19
 
20
+ function wbcr_factory_forms_427_plugin_created($plugin)
21
  {
22
+ $plugin->forms = new Wbcr_FactoryForms427_Manager($plugin);
23
  }
24
 
25
+ if( !class_exists('Wbcr_FactoryForms427_Manager') ) {
26
 
27
+ class Wbcr_FactoryForms427_Manager {
28
 
29
  // ----------------------------------------------------
30
  // Static fields and methods
57
  /**
58
  * Registers a set of new controls.
59
  *
60
+ * @see FactoryForms427_Form::registerControl()
61
  *
62
  * @since 1.0.0
63
  * @return void
95
  /**
96
  * Registers a set of new holder controls.
97
  *
98
+ * @see FactoryForms427_Form::registerHolder()
99
  *
100
  * @since 1.0.0
101
  * @return void
129
  /**
130
  * Registers a set of new custom form elements.
131
  *
132
+ * @see FactoryForms427_Form::registerCustomElement()
133
  *
134
  * @since 1.0.0
135
  * @return void
180
  public static $controls_registered = false;
181
  }
182
  }
183
+ if( !class_exists('Wbcr_FactoryForms427_Form') ) {
184
  /**
185
  * An abstraction for forms.
186
  */
187
+ class Wbcr_FactoryForms427_Form {
188
 
189
  // ----------------------------------------------------
190
  // Object fields and methods
194
  * A value provider of the form that is used to save and load values.
195
  *
196
  * @since 1.0.0
197
+ * @var Wbcr_IFactoryForms427_ValueProvider
198
  */
199
  private $provider;
200
 
245
  * A current form layout used to render a form.
246
  *
247
  * @since 1.0.0
248
+ * @var Wbcr_FactoryForms427_FormLayout
249
  */
250
  public $layout;
251
 
261
  *
262
  * @since 1.0.0
263
  * @param array $options
264
+ * @param Wbcr_Factory429_Plugin $plugin
265
  */
266
+ public function __construct(array $options = array(), Wbcr_Factory429_Plugin $plugin)
267
  {
268
  // register controls once, when the first form is created
269
+ if( !Wbcr_FactoryForms427_Manager::$controls_registered ) {
270
 
271
+ do_action('wbcr_factory_forms_427_register_controls', $plugin);
272
 
273
  //if( !empty($plugin) ) {
274
+ do_action('wbcr_factory_forms_427_register_controls_' . $plugin->getPluginName(), $plugin);
275
  //}
276
 
277
+ Wbcr_FactoryForms427_Manager::$controls_registered = true;
278
  }
279
 
280
  $this->scope = isset($options['scope']) ? $options['scope'] : null;
289
  $this->form_layout = 'bootstrap-3';
290
  }
291
 
292
+ Wbcr_FactoryForms427_Manager::$temper = 'flat';
293
  }
294
 
295
  /**
296
  * Sets a provider for the control.
297
  *
298
  * @since 1.0.0
299
+ * @param Wbcr_IFactoryForms427_ValueProvider $provider
300
  * @return void
301
  */
302
  public function setProvider($provider)
332
  */
333
  public function getItems()
334
  {
335
+ return apply_filters('wbcr_factory_429_form_items', $this->items, $this->name);
336
  }
337
 
338
  /**
339
  * Returns form controls (control objects).
340
  *
341
  * @since 1.0.0
342
+ * @return Wbcr_FactoryForms427_Control[]
343
  */
344
  public function getControls()
345
  {
355
  * Builds a form items to the control objects ready to use.
356
  *
357
  * @param null $holder
358
+ * @return Wbcr_FactoryForms427_Control[]
359
  */
360
 
361
  public function createControls($holder = null)
395
  *
396
  * @since 1.0.0
397
  * @param array $item Item data.
398
+ * @return Wbcr_FactoryForms427_FormElement|null A form element.
399
  */
400
  public function createElement($item)
401
  {
417
  *
418
  * @since 1.0.0
419
  * @param mixed[] $item Data of items.
420
+ * @return Wbcr_FactoryForms427_FormElement[] Created elements.
421
  */
422
  public function createElements($items = array())
423
  {
433
  *
434
  * @since 1.0.0
435
  * @param array $item Item data.
436
+ * @return Wbcr_FactoryForms427_Control A control object.
437
  */
438
  public function createControl($item)
439
  {
441
 
442
  if( is_array($item) ) {
443
 
444
+ $control_data = Wbcr_FactoryForms427_Manager::$registered_controls[$item['type']];
445
 
446
  require_once($control_data['include']);
447
 
465
  *
466
  * @since 1.0.0
467
  * @param array $item Item data.
468
+ * @return Wbcr_FactoryForms427_Holder A control holder object.
469
  */
470
  public function createHolder($item)
471
  {
473
 
474
  if( is_array($item) ) {
475
 
476
+ $holderData = Wbcr_FactoryForms427_Manager::$registered_holders[$item['type']];
477
  require_once($holderData['include']);
478
 
479
  $object = new $holderData['class']($item, $this);
491
  *
492
  * @since 1.0.0
493
  * @param mixed $item Item data.
494
+ * @return Wbcr_FactoryForms427_FormElement A custom form element object.
495
  */
496
  public function createCustomElement($item)
497
  {
499
 
500
  if( is_array($item) ) {
501
 
502
+ $data = Wbcr_FactoryForms427_Manager::$registered_custom_elements[$item['type']];
503
  require_once($data['include']);
504
 
505
  $options = $item;
523
  public function html($options = array())
524
  {
525
 
526
+ if( !isset(Wbcr_FactoryForms427_Manager::$form_layouts[$this->form_layout]) ) {
527
  die(sprintf('[ERROR] The form layout %s was not found.', $this->form_layout));
528
  }
529
 
530
  // include a render code
531
+ $layout_data = Wbcr_FactoryForms427_Manager::$form_layouts[$this->form_layout];
532
  require_once($layout_data['include']);
533
 
534
  $this->connectAssets();
552
  {
553
 
554
  $this->connectAssetsForItems();
555
+ $layout_data = Wbcr_FactoryForms427_Manager::$form_layouts[$this->form_layout];
556
 
557
  if( $layout_data['name'] == 'default' ) {
558
  if( isset($layout_data['style']) ) {
602
 
603
  $haystack = array();
604
  if( self::isControl($type) ) {
605
+ $haystack = Wbcr_FactoryForms427_Manager::$registered_controls;
606
  } elseif( self::isControlHolder($type) ) {
607
+ $haystack = Wbcr_FactoryForms427_Manager::$registered_holders;
608
  }
609
 
610
  if( isset($haystack[$type]) ) {
660
  */
661
  public static function isControl($item)
662
  {
663
+ return isset(Wbcr_FactoryForms427_Manager::$registered_controls[$item['type']]);
664
  }
665
 
666
  /**
672
  */
673
  public static function isControlHolder($item)
674
  {
675
+ return isset(Wbcr_FactoryForms427_Manager::$registered_holders[$item['type']]);
676
  }
677
 
678
  /**
684
  */
685
  public static function isCustomElement($item)
686
  {
687
+ return isset(Wbcr_FactoryForms427_Manager::$registered_custom_elements[$item['type']]);
688
  }
689
  }
690
  }
libs/factory/forms/includes/holder.class.php CHANGED
@@ -14,20 +14,20 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_Holder') ) {
18
 
19
  /**
20
  * The base class for control holders.
21
  *
22
  * @since 1.0.0
23
  */
24
- abstract class Wbcr_FactoryForms418_Holder extends Wbcr_FactoryForms418_FormElement {
25
 
26
  /**
27
  * Holder Elements.
28
  *
29
  * @since 1.0.0
30
- * @var Wbcr_FactoryForms418_Control[]
31
  */
32
  protected $elements = array();
33
 
@@ -44,7 +44,7 @@
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
- * @param Wbcr_FactoryForms418_Form $form A parent form.
48
  */
49
  public function __construct($options, $form)
50
  {
@@ -56,7 +56,7 @@
56
  * Returns holder elements.
57
  *
58
  * @since 1.0.0
59
- * @return Wbcr_FactoryForms418_Control[].
60
  */
61
  public function getElements()
62
  {
@@ -84,7 +84,7 @@
84
  $is_first_item = false;
85
  }
86
 
87
- do_action('wbcr_factory_420_form_before_element_' . $element->getOption('name'));
88
 
89
  // if a current item is a control holder
90
  if( $element->is_holder ) {
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_Holder') ) {
18
 
19
  /**
20
  * The base class for control holders.
21
  *
22
  * @since 1.0.0
23
  */
24
+ abstract class Wbcr_FactoryForms427_Holder extends Wbcr_FactoryForms427_FormElement {
25
 
26
  /**
27
  * Holder Elements.
28
  *
29
  * @since 1.0.0
30
+ * @var Wbcr_FactoryForms427_Control[]
31
  */
32
  protected $elements = array();
33
 
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
+ * @param Wbcr_FactoryForms427_Form $form A parent form.
48
  */
49
  public function __construct($options, $form)
50
  {
56
  * Returns holder elements.
57
  *
58
  * @since 1.0.0
59
+ * @return Wbcr_FactoryForms427_Control[].
60
  */
61
  public function getElements()
62
  {
84
  $is_first_item = false;
85
  }
86
 
87
+ do_action('wbcr_factory_429_form_before_element_' . $element->getOption('name'));
88
 
89
  // if a current item is a control holder
90
  if( $element->is_holder ) {
libs/factory/forms/includes/html-builder.class.php CHANGED
@@ -14,13 +14,13 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_HtmlAttributeBuilder') ) {
18
  /**
19
  * Html Attribute Builder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms418_HtmlAttributeBuilder {
24
 
25
  /**
26
  * An array to store css classes.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_HtmlAttributeBuilder') ) {
18
  /**
19
  * Html Attribute Builder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms427_HtmlAttributeBuilder {
24
 
25
  /**
26
  * An array to store css classes.
libs/factory/forms/includes/providers/meta-value-provider.class.php CHANGED
@@ -14,7 +14,7 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_OptionsValueProvider') ) {
18
 
19
  /**
20
  * Factory Meta Value Provider
@@ -24,7 +24,7 @@
24
  *
25
  * @since 1.0.0
26
  */
27
- class Wbcr_FactoryForms418_MetaValueProvider implements Wbcr_IFactoryForms418_ValueProvider {
28
 
29
 
30
  public $scope;
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_OptionsValueProvider') ) {
18
 
19
  /**
20
  * Factory Meta Value Provider
24
  *
25
  * @since 1.0.0
26
  */
27
+ class Wbcr_FactoryForms427_MetaValueProvider implements Wbcr_IFactoryForms427_ValueProvider {
28
 
29
 
30
  public $scope;
libs/factory/forms/includes/providers/options-value-provider.class.php CHANGED
@@ -13,7 +13,7 @@
13
  exit;
14
  }
15
 
16
- if( !class_exists('Wbcr_FactoryForms418_OptionsValueProvider') ) {
17
 
18
  /**
19
  * Factory Options Value Provider
@@ -22,7 +22,7 @@
22
  *
23
  * @since 1.0.0
24
  */
25
- class Wbcr_FactoryForms418_OptionsValueProvider implements Wbcr_IFactoryForms418_ValueProvider {
26
 
27
  /**
28
  * A prefix that will be added to all option names.
@@ -43,7 +43,7 @@
43
  /**
44
  * Creates a new instance of an options value provider.
45
  */
46
- public function __construct(Wbcr_Factory420_Plugin $plugin)
47
  {
48
  $this->plugin = $plugin;
49
  }
13
  exit;
14
  }
15
 
16
+ if( !class_exists('Wbcr_FactoryForms427_OptionsValueProvider') ) {
17
 
18
  /**
19
  * Factory Options Value Provider
22
  *
23
  * @since 1.0.0
24
  */
25
+ class Wbcr_FactoryForms427_OptionsValueProvider implements Wbcr_IFactoryForms427_ValueProvider {
26
 
27
  /**
28
  * A prefix that will be added to all option names.
43
  /**
44
  * Creates a new instance of an options value provider.
45
  */
46
+ public function __construct(Wbcr_Factory429_Plugin $plugin)
47
  {
48
  $this->plugin = $plugin;
49
  }
libs/factory/forms/includes/providers/value-provider.interface.php CHANGED
@@ -14,13 +14,13 @@
14
  if( !defined('ABSPATH') ) {
15
  exit;
16
  }
17
- if( !class_exists('Wbcr_IFactoryForms418_ValueProvider') ) {
18
  /**
19
  * The interface for all value provides.
20
  *
21
  * @since 1.0.0
22
  */
23
- interface Wbcr_IFactoryForms418_ValueProvider {
24
 
25
  /**
26
  * Inits a form a provider to get data from a storage.
14
  if( !defined('ABSPATH') ) {
15
  exit;
16
  }
17
+ if( !class_exists('Wbcr_IFactoryForms427_ValueProvider') ) {
18
  /**
19
  * The interface for all value provides.
20
  *
21
  * @since 1.0.0
22
  */
23
+ interface Wbcr_IFactoryForms427_ValueProvider {
24
 
25
  /**
26
  * Inits a form a provider to get data from a storage.
libs/factory/forms/langs/{wbcr_factory_forms_418-ru_RU.mo → wbcr_factory_forms_427-ru_RU.mo} RENAMED
File without changes
libs/factory/forms/langs/{wbcr_factory_forms_418-ru_RU.po → wbcr_factory_forms_427-ru_RU.po} RENAMED
File without changes
libs/factory/forms/layouts/bootstrap-3/bootstrap-3.php CHANGED
@@ -14,11 +14,11 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryForms418_Bootstrap3FormLayout') ) {
18
  /**
19
  * A form layout based on Twitter Bootstrap 3
20
  */
21
- class Wbcr_FactoryForms418_Bootstrap3FormLayout extends Wbcr_FactoryForms418_FormLayout {
22
 
23
  public $name = 'default';
24
 
@@ -27,7 +27,7 @@
27
  *
28
  * @since 1.0.0
29
  * @param array $options A holder options.
30
- * @param Wbcr_FactoryForms418_Form $form A parent form.
31
  */
32
  public function __construct($options, $form)
33
  {
@@ -68,7 +68,7 @@
68
  }
69
 
70
  /**
71
- * @param Wbcr_FactoryForms418_Control $control
72
  */
73
  public function beforeControl($control)
74
  {
@@ -116,7 +116,7 @@
116
  }
117
 
118
  /**
119
- * @param Wbcr_FactoryForms418_Control $control
120
  */
121
  public function afterControl($control)
122
  {
@@ -168,7 +168,7 @@
168
  }
169
 
170
  /**
171
- * @param Wbcr_FactoryForms418_Control $control
172
  * @param int $index
173
  * @param int $total
174
  */
@@ -193,7 +193,7 @@
193
  }
194
 
195
  /**
196
- * @param Wbcr_FactoryForms418_Control $control
197
  * @param int $index
198
  * @param int $total
199
  */
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms427_Bootstrap3FormLayout') ) {
18
  /**
19
  * A form layout based on Twitter Bootstrap 3
20
  */
21
+ class Wbcr_FactoryForms427_Bootstrap3FormLayout extends Wbcr_FactoryForms427_FormLayout {
22
 
23
  public $name = 'default';
24
 
27
  *
28
  * @since 1.0.0
29
  * @param array $options A holder options.
30
+ * @param Wbcr_FactoryForms427_Form $form A parent form.
31
  */
32
  public function __construct($options, $form)
33
  {
68
  }
69
 
70
  /**
71
+ * @param Wbcr_FactoryForms427_Control $control
72
  */
73
  public function beforeControl($control)
74
  {
116
  }
117
 
118
  /**
119
+ * @param Wbcr_FactoryForms427_Control $control
120
  */
121
  public function afterControl($control)
122
  {
168
  }
169
 
170
  /**
171
+ * @param Wbcr_FactoryForms427_Control $control
172
  * @param int $index
173
  * @param int $total
174
  */
193
  }
194
 
195
  /**
196
+ * @param Wbcr_FactoryForms427_Control $control
197
  * @param int $index
198
  * @param int $total
199
  */
libs/factory/pages/boot.php CHANGED
@@ -10,34 +10,34 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
  // module provides function only for the admin area
18
- if ( ! is_admin() ) {
19
  return;
20
  }
21
 
22
- if ( defined( 'FACTORY_PAGES_420_LOADED' ) ) {
23
  return;
24
  }
25
 
26
- define( 'FACTORY_PAGES_420_LOADED', true );
27
 
28
- define( 'FACTORY_PAGES_420_VERSION', '4.2.0' );
29
 
30
- define( 'FACTORY_PAGES_420_DIR', dirname( __FILE__ ) );
31
- define( 'FACTORY_PAGES_420_URL', plugins_url( null, __FILE__ ) );
32
 
33
- if ( ! defined( 'FACTORY_FLAT_ADMIN' ) ) {
34
- define( 'FACTORY_FLAT_ADMIN', true );
35
  }
36
 
37
- load_plugin_textdomain( 'wbcr_factory_pages_420', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
38
 
39
- require( FACTORY_PAGES_420_DIR . '/pages.php' );
40
- require( FACTORY_PAGES_420_DIR . '/includes/page.class.php' );
41
- require( FACTORY_PAGES_420_DIR . '/includes/admin-page.class.php' );
42
- require( FACTORY_PAGES_420_DIR . '/templates/impressive-page.class.php' );
43
 
10
  */
11
 
12
  // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
 
17
  // module provides function only for the admin area
18
+ if( !is_admin() ) {
19
  return;
20
  }
21
 
22
+ if( defined('FACTORY_PAGES_429_LOADED') ) {
23
  return;
24
  }
25
 
26
+ define('FACTORY_PAGES_429_LOADED', true);
27
 
28
+ define('FACTORY_PAGES_429_VERSION', '4.2.9');
29
 
30
+ define('FACTORY_PAGES_429_DIR', dirname(__FILE__));
31
+ define('FACTORY_PAGES_429_URL', plugins_url(null, __FILE__));
32
 
33
+ if( !defined('FACTORY_FLAT_ADMIN') ) {
34
+ define('FACTORY_FLAT_ADMIN', true);
35
  }
36
 
37
+ load_plugin_textdomain('wbcr_factory_pages_429', false, dirname(plugin_basename(__FILE__)) . '/langs');
38
 
39
+ require(FACTORY_PAGES_429_DIR . '/pages.php');
40
+ require(FACTORY_PAGES_429_DIR . '/includes/page.class.php');
41
+ require(FACTORY_PAGES_429_DIR . '/includes/admin-page.class.php');
42
+ require(FACTORY_PAGES_429_DIR . '/templates/impressive-page.class.php');
43
 
libs/factory/pages/includes/admin-page.class.php CHANGED
@@ -10,13 +10,13 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
18
 
19
- class Wbcr_FactoryPages420_AdminPage extends Wbcr_FactoryPages420_Page {
20
 
21
  /**
22
  * Visible page title.
@@ -209,25 +209,26 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
209
  */
210
  public $add_link_to_plugin_actions = false;
211
 
212
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
213
- parent::__construct( $plugin );
 
214
  $this->configure();
215
 
216
- $this->id = empty( $this->id ) ? str_replace( 'adminpage', '', strtolower( get_class( $this ) ) ) : $this->id;
217
 
218
- if ( $this->add_link_to_plugin_actions ) {
219
- if ( $plugin->isNetworkActive() ) {
220
  // plugin settings link
221
- add_filter( "network_admin_plugin_action_links_" . $this->plugin->get_paths()->basename, [
222
  $this,
223
  'addLinkToPluginActions'
224
- ] );
225
  } else {
226
  // plugin settings link
227
- add_filter( "plugin_action_links_" . $this->plugin->get_paths()->basename, [
228
  $this,
229
  'addLinkToPluginActions'
230
- ] );
231
  }
232
  }
233
  }
@@ -235,7 +236,8 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
235
  /**
236
  * May be used to configure the page before uts usage.
237
  */
238
- public function configure() {
 
239
  }
240
 
241
  /**
@@ -245,9 +247,10 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
245
  *
246
  * @return void
247
  */
248
- public function actionAdminBootstrapScripts( $hook ) {
249
- $this->scripts->connect( 'bootstrap' );
250
- $this->styles->connect( 'bootstrap' );
 
251
  }
252
 
253
  /**
@@ -257,7 +260,8 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
257
  *
258
  * @return void
259
  */
260
- public function actionAdminScripts( $hook ) {
 
261
  $this->scripts->connect();
262
  $this->styles->connect();
263
  }
@@ -265,7 +269,8 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
265
  /**
266
  * @return string
267
  */
268
- public function getMenuScope() {
 
269
  return $this->plugin->getPluginName();
270
  }
271
 
@@ -273,26 +278,28 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
273
  /**
274
  * @return string
275
  */
276
- public function getMenuTitle() {
277
- $menu_title = ! $this->menu_title ? $this->page_title : $this->menu_title;
 
278
 
279
  /**
280
  * @since 4.0.9 - добавлен
281
  */
282
- return apply_filters( 'wbcr/factory/pages/impressive/menu_title', $menu_title, $this->plugin->getPluginName(), $this->id );
283
  }
284
 
285
  /**
286
  * @return string
287
  */
288
- public function getPageTitle() {
 
289
 
290
- $page_title = ! $this->page_title ? $this->getMenuTitle() : $this->page_title;
291
 
292
  /**
293
  * @since 4.0.9 - добавлен
294
  */
295
- return apply_filters( 'wbcr/factory/pages/impressive/page_title', $page_title, $this->plugin->getPluginName(), $this->id );
296
  }
297
 
298
  /**
@@ -300,10 +307,11 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
300
  *
301
  * @return mixed|string
302
  */
303
- public function getResultId( $id = null ) {
304
- $id = ! empty( $id ) ? $id : $this->id;
 
305
 
306
- if ( $this->plugin ) {
307
  return $id . '-' . $this->getMenuScope();
308
  }
309
 
@@ -313,118 +321,120 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
313
  /**
314
  * Registers admin page for the admin menu.
315
  */
316
- public function connect() {
 
317
  $result_id = $this->getResultId();
318
 
319
- $this->hidden = apply_filters( 'wbcr_factory_420_page_is_hidden_' . $result_id, $this->hidden );
320
 
321
- if ( $this->hidden ) {
322
  return;
323
  }
324
 
325
- $this->internal = apply_filters( 'wbcr_factory_420_page_is_internal_' . $result_id, $this->internal );
326
 
327
- if ( $this->internal ) {
328
- $this->menu_target = null;
329
  $this->menu_post_type = null;
330
  }
331
 
332
  // makes redirect to the page
333
- $controller = $this->request->get( 'fy_page', null, true );
334
 
335
- if ( $controller && $controller == $this->id ) {
336
- $plugin = $this->request->get( 'fy_plugin', null, true );
337
 
338
- if ( $this->plugin->getPluginName() == $plugin ) {
339
 
340
- $action = $this->request->get( 'fy_action', 'index', true );
341
- $is_ajax = $this->request->get( 'fy_ajax', false );
342
 
343
- if ( $is_ajax ) {
344
- $this->executeByName( $action );
345
  exit;
346
  } else {
347
 
348
- $params = (array) $this->request->getAll( true );
349
 
350
- unset( $params['fy_page'] );
351
- unset( $params['fy_plugin'] );
352
- unset( $params['fy_action'] );
353
 
354
- $this->redirectToAction( $action, $params );
355
  }
356
  }
357
  }
358
 
359
  // calls scripts and styles, adds pages to menu
360
- if ( $this->request->get( 'page', 'none' ) == $result_id ) {
361
- $this->assets( $this->scripts, $this->styles );
362
 
363
- if ( ! $this->scripts->isEmpty( 'bootstrap' ) || ! $this->styles->isEmpty( 'bootstrap' ) ) {
364
- add_action( 'wbcr_factory_420_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), [
365
  $this,
366
  'actionAdminBootstrapScripts'
367
- ] );
368
  }
369
 
370
  // includes styles and scripts
371
- if ( ! $this->scripts->isEmpty() || ! $this->styles->isEmpty() ) {
372
- add_action( 'admin_enqueue_scripts', [ $this, 'actionAdminScripts' ] );
373
  }
374
  }
375
 
376
  // if this page for a custom menu page
377
- if ( $this->menu_post_type ) {
378
  $this->menu_target = 'edit.php?post_type=' . $this->menu_post_type;
379
 
380
- if ( empty( $this->capabilitiy ) ) {
381
  $this->capabilitiy = 'edit_' . $this->menu_post_type;
382
  }
383
  }
384
 
385
  // sets default capabilities
386
- if ( empty( $this->capabilitiy ) ) {
387
  $this->capabilitiy = 'manage_options';
388
  }
389
 
390
  // submenu
391
- if ( $this->menu_target ) {
392
- add_submenu_page( $this->menu_target, $this->getPageTitle(), $this->getMenuTitle(), $this->capabilitiy, $result_id, [
393
  $this,
394
  'show'
395
- ] );
396
  // global menu
397
  } else {
398
- add_menu_page( $this->getPageTitle(), $this->getMenuTitle(), $this->capabilitiy, $result_id, [
399
  $this,
400
  'show'
401
- ], null, $this->menu_position );
402
 
403
- if ( ! empty( $this->menu_sub_title ) ) {
404
 
405
- add_submenu_page( $result_id, $this->menu_sub_title, $this->menu_sub_title, $this->capabilitiy, $result_id, [
406
  $this,
407
  'show'
408
- ] );
409
  }
410
 
411
- add_action( 'admin_head', [ $this, 'actionAdminHead' ] );
412
  }
413
 
414
  // executes an action
415
- if ( $this->current() ) {
416
  ob_start();
417
- $action = $this->request->get( 'action', 'index', true );
418
- $this->executeByName( $action );
419
  $this->result = ob_get_contents();
420
  ob_end_clean();
421
  }
422
  }
423
 
424
- protected function current() {
 
425
  $result_id = $this->getResultId();
426
 
427
- if ( $result_id == $this->request->get( 'page', 'none' ) ) {
428
  return true;
429
  }
430
 
@@ -433,33 +443,36 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
433
 
434
  /**
435
  * @param string $action
436
- * @param array $query_args
437
  */
438
- public function redirectToAction( $action, $query_args = [] ) {
 
439
 
440
- wp_safe_redirect( $this->getActionUrl( $action, $query_args ) );
441
  exit;
442
  }
443
 
444
  /**
445
  * @param string $action
446
- * @param array $query_args
447
  */
448
- public function actionUrl( $action = null, $query_args = [] ) {
449
- echo $this->getActionUrl( $action, $query_args );
 
450
  }
451
 
452
  /**
453
- * @param null $action
454
  * @param array $query_args
455
  *
456
  * @return string
457
  */
458
- public function getActionUrl( $action = null, $query_args = [] ) {
459
- $url = $this->getBaseUrl( null, $query_args );
 
460
 
461
- if ( ! empty( $action ) ) {
462
- $url = add_query_arg( 'action', $action, $url );
463
  }
464
 
465
  return $url;
@@ -468,77 +481,78 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
468
  /**
469
  * @return string
470
  */
471
- public function getBaseUrl( $id = null, $query_args = [] ) {
472
- $result_id = $this->getResultId( $id );
 
473
 
474
- if ( $this->menu_target ) {
475
- $url = $this->network ? network_admin_url( $this->menu_target ) : admin_url( $this->menu_target );
476
-
477
- return add_query_arg( array_merge( [ 'page' => $result_id ], $query_args ), $url );
478
- } else {
479
- $url = $this->network ? network_admin_url( 'admin.php' ) : admin_url( 'admin.php' );
480
 
481
- return add_query_arg( array_merge( [ 'page' => $result_id, $query_args ] ), $url );
482
  }
 
 
 
 
483
  }
484
 
485
- public function actionAdminHead() {
 
486
  $result_id = $this->getResultId();
487
 
488
- if ( ! empty( $this->menu_icon ) ) {
489
 
490
- if ( preg_match( '/\\\f\d{3}/', $this->menu_icon ) ) {
491
  $icon_code = $this->menu_icon;
492
  } else {
493
- $plugin_path_info = $this->plugin->getPluginPathInfo();
494
- $icon_url = str_replace( '~/', $plugin_path_info->plugin_url . '/', $this->menu_icon );
495
  }
496
  }
497
 
498
  global $wp_version;
499
 
500
- if ( version_compare( $wp_version, '3.7.3', '>' ) ) {
501
  ?>
502
- <style type="text/css" media="screen">
503
- <?php if ( !empty($icon_url) ) { ?>
504
 
505
- a.toplevel_page_<?php echo $result_id ?> .wp-menu-image {
506
- background: url('<?php echo $icon_url ?>') no-repeat 10px -30px !important;
507
- }
508
 
509
- <?php } ?>
510
 
511
- a.toplevel_page_<?php echo $result_id ?> .wp-menu-image:before {
512
- content: "<?php echo !empty($icon_code) ? $icon_code : ''; ?>" !important;
513
- }
514
 
515
- a.toplevel_page_<?php echo $result_id ?>:hover .wp-menu-image,
516
- a.toplevel_page_<?php echo $result_id ?>.wp-has-current-submenu .wp-menu-image,
517
- a.toplevel_page_<?php echo $result_id ?>.current .wp-menu-image {
518
- background-position: 10px 2px !important;
519
- }
520
- </style>
521
  <?php } else { ?>
522
- <style type="text/css" media="screen">
523
- a.toplevel_page_<?php echo $result_id ?> .wp-menu-image {
524
- background: url('<?php echo $icon_url ?>') no-repeat 6px -33px !important;
525
- }
526
-
527
- a.toplevel_page_<?php echo $result_id ?>:hover .wp-menu-image,
528
- a.toplevel_page_<?php echo $result_id ?>.current .wp-menu-image {
529
- background-position: 6px -1px !important;
530
- }
531
- </style>
532
  <?php
533
  }
534
 
535
- if ( $this->internal ) {
536
  ?>
537
- <style type="text/css" media="screen">
538
- li.toplevel_page_<?php echo $result_id ?> {
539
- display: none;
540
- }
541
- </style>
542
  <?php
543
  }
544
  }
@@ -551,11 +565,12 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_AdminPage' ) ) {
551
  *
552
  * @return mixed
553
  */
554
- function addLinkToPluginActions( $links ) {
555
- $link_title = ! empty( $this->title_plugin_action_link ) ? $this->title_plugin_action_link : $this->getMenuTitle();
 
556
 
557
  $settings_link = '<a href="' . $this->getBaseUrl() . '">' . $link_title . '</a>';
558
- array_unshift( $links, $settings_link );
559
 
560
  return $links;
561
  }
10
  */
11
 
12
  // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryPages429_AdminPage') ) {
18
 
19
+ class Wbcr_FactoryPages429_AdminPage extends Wbcr_FactoryPages429_Page {
20
 
21
  /**
22
  * Visible page title.
209
  */
210
  public $add_link_to_plugin_actions = false;
211
 
212
+ public function __construct(Wbcr_Factory429_Plugin $plugin)
213
+ {
214
+ parent::__construct($plugin);
215
  $this->configure();
216
 
217
+ $this->id = empty($this->id) ? str_replace('adminpage', '', strtolower(get_class($this))) : $this->id;
218
 
219
+ if( $this->add_link_to_plugin_actions ) {
220
+ if( $plugin->isNetworkActive() ) {
221
  // plugin settings link
222
+ add_filter("network_admin_plugin_action_links_" . $this->plugin->get_paths()->basename, [
223
  $this,
224
  'addLinkToPluginActions'
225
+ ]);
226
  } else {
227
  // plugin settings link
228
+ add_filter("plugin_action_links_" . $this->plugin->get_paths()->basename, [
229
  $this,
230
  'addLinkToPluginActions'
231
+ ]);
232
  }
233
  }
234
  }
236
  /**
237
  * May be used to configure the page before uts usage.
238
  */
239
+ public function configure()
240
+ {
241
  }
242
 
243
  /**
247
  *
248
  * @return void
249
  */
250
+ public function actionAdminBootstrapScripts($hook)
251
+ {
252
+ $this->scripts->connect('bootstrap');
253
+ $this->styles->connect('bootstrap');
254
  }
255
 
256
  /**
260
  *
261
  * @return void
262
  */
263
+ public function actionAdminScripts($hook)
264
+ {
265
  $this->scripts->connect();
266
  $this->styles->connect();
267
  }
269
  /**
270
  * @return string
271
  */
272
+ public function getMenuScope()
273
+ {
274
  return $this->plugin->getPluginName();
275
  }
276
 
278
  /**
279
  * @return string
280
  */
281
+ public function getMenuTitle()
282
+ {
283
+ $menu_title = !$this->menu_title ? $this->page_title : $this->menu_title;
284
 
285
  /**
286
  * @since 4.0.9 - добавлен
287
  */
288
+ return apply_filters('wbcr/factory/pages/impressive/menu_title', $menu_title, $this->plugin->getPluginName(), $this->id);
289
  }
290
 
291
  /**
292
  * @return string
293
  */
294
+ public function getPageTitle()
295
+ {
296
 
297
+ $page_title = !$this->page_title ? $this->getMenuTitle() : $this->page_title;
298
 
299
  /**
300
  * @since 4.0.9 - добавлен
301
  */
302
+ return apply_filters('wbcr/factory/pages/impressive/page_title', $page_title, $this->plugin->getPluginName(), $this->id);
303
  }
304
 
305
  /**
307
  *
308
  * @return mixed|string
309
  */
310
+ public function getResultId($id = null)
311
+ {
312
+ $id = !empty($id) ? $id : $this->id;
313
 
314
+ if( $this->plugin ) {
315
  return $id . '-' . $this->getMenuScope();
316
  }
317
 
321
  /**
322
  * Registers admin page for the admin menu.
323
  */
324
+ public function connect()
325
+ {
326
  $result_id = $this->getResultId();
327
 
328
+ $this->hidden = apply_filters('wbcr_factory_429_page_is_hidden_' . $result_id, $this->hidden);
329
 
330
+ if( $this->hidden ) {
331
  return;
332
  }
333
 
334
+ $this->internal = apply_filters('wbcr_factory_429_page_is_internal_' . $result_id, $this->internal);
335
 
336
+ if( $this->internal ) {
337
+ $this->menu_target = null;
338
  $this->menu_post_type = null;
339
  }
340
 
341
  // makes redirect to the page
342
+ $controller = $this->request->get('fy_page', null, true);
343
 
344
+ if( $controller && $controller == $this->id ) {
345
+ $plugin = $this->request->get('fy_plugin', null, true);
346
 
347
+ if( $this->plugin->getPluginName() == $plugin ) {
348
 
349
+ $action = $this->request->get('fy_action', 'index', true);
350
+ $is_ajax = $this->request->get('fy_ajax', false);
351
 
352
+ if( $is_ajax ) {
353
+ $this->executeByName($action);
354
  exit;
355
  } else {
356
 
357
+ $params = (array)$this->request->getAll(true);
358
 
359
+ unset($params['fy_page']);
360
+ unset($params['fy_plugin']);
361
+ unset($params['fy_action']);
362
 
363
+ $this->redirectToAction($action, $params);
364
  }
365
  }
366
  }
367
 
368
  // calls scripts and styles, adds pages to menu
369
+ if( $this->request->get('page', 'none') == $result_id ) {
370
+ $this->assets($this->scripts, $this->styles);
371
 
372
+ if( !$this->scripts->isEmpty('bootstrap') || !$this->styles->isEmpty('bootstrap') ) {
373
+ add_action('wbcr_factory_429_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), [
374
  $this,
375
  'actionAdminBootstrapScripts'
376
+ ]);
377
  }
378
 
379
  // includes styles and scripts
380
+ if( !$this->scripts->isEmpty() || !$this->styles->isEmpty() ) {
381
+ add_action('admin_enqueue_scripts', [$this, 'actionAdminScripts']);
382
  }
383
  }
384
 
385
  // if this page for a custom menu page
386
+ if( $this->menu_post_type ) {
387
  $this->menu_target = 'edit.php?post_type=' . $this->menu_post_type;
388
 
389
+ if( empty($this->capabilitiy) ) {
390
  $this->capabilitiy = 'edit_' . $this->menu_post_type;
391
  }
392
  }
393
 
394
  // sets default capabilities
395
+ if( empty($this->capabilitiy) ) {
396
  $this->capabilitiy = 'manage_options';
397
  }
398
 
399
  // submenu
400
+ if( $this->menu_target ) {
401
+ add_submenu_page($this->menu_target, $this->getPageTitle(), $this->getMenuTitle(), $this->capabilitiy, $result_id, [
402
  $this,
403
  'show'
404
+ ]);
405
  // global menu
406
  } else {
407
+ add_menu_page($this->getPageTitle(), $this->getMenuTitle(), $this->capabilitiy, $result_id, [
408
  $this,
409
  'show'
410
+ ], null, $this->menu_position);
411
 
412
+ if( !empty($this->menu_sub_title) ) {
413
 
414
+ add_submenu_page($result_id, $this->menu_sub_title, $this->menu_sub_title, $this->capabilitiy, $result_id, [
415
  $this,
416
  'show'
417
+ ]);
418
  }
419
 
420
+ add_action('admin_head', [$this, 'actionAdminHead']);
421
  }
422
 
423
  // executes an action
424
+ if( $this->current() ) {
425
  ob_start();
426
+ $action = $this->request->get('action', 'index', true);
427
+ $this->executeByName($action);
428
  $this->result = ob_get_contents();
429
  ob_end_clean();
430
  }
431
  }
432
 
433
+ protected function current()
434
+ {
435
  $result_id = $this->getResultId();
436
 
437
+ if( $result_id == $this->request->get('page', 'none') ) {
438
  return true;
439
  }
440
 
443
 
444
  /**
445
  * @param string $action
446
+ * @param array $query_args
447
  */
448
+ public function redirectToAction($action, $query_args = [])
449
+ {
450
 
451
+ wp_safe_redirect($this->getActionUrl($action, $query_args));
452
  exit;
453
  }
454
 
455
  /**
456
  * @param string $action
457
+ * @param array $query_args
458
  */
459
+ public function actionUrl($action = null, $query_args = [])
460
+ {
461
+ echo $this->getActionUrl($action, $query_args);
462
  }
463
 
464
  /**
465
+ * @param null $action
466
  * @param array $query_args
467
  *
468
  * @return string
469
  */
470
+ public function getActionUrl($action = null, $query_args = [])
471
+ {
472
+ $url = $this->getBaseUrl(null, $query_args);
473
 
474
+ if( !empty($action) ) {
475
+ $url = add_query_arg('action', $action, $url);
476
  }
477
 
478
  return $url;
481
  /**
482
  * @return string
483
  */
484
+ public function getBaseUrl($id = null, $query_args = [])
485
+ {
486
+ $result_id = $this->getResultId($id);
487
 
488
+ if( $this->menu_target && !$this->custom_target ) {
489
+ $url = $this->network ? network_admin_url($this->menu_target) : admin_url($this->menu_target);
 
 
 
 
490
 
491
+ return add_query_arg(array_merge(['page' => $result_id], $query_args), $url);
492
  }
493
+
494
+ $url = $this->network ? network_admin_url('admin.php') : admin_url('admin.php');
495
+
496
+ return add_query_arg(array_merge(['page' => $result_id, $query_args]), $url);
497
  }
498
 
499
+ public function actionAdminHead()
500
+ {
501
  $result_id = $this->getResultId();
502
 
503
+ if( !empty($this->menu_icon) ) {
504
 
505
+ if( preg_match('/\\\f\d{3}/', $this->menu_icon) ) {
506
  $icon_code = $this->menu_icon;
507
  } else {
508
+ $icon_url = str_replace('~/', $this->plugin->get_paths()->url . '/', $this->menu_icon);
 
509
  }
510
  }
511
 
512
  global $wp_version;
513
 
514
+ if( version_compare($wp_version, '3.7.3', '>') ) {
515
  ?>
516
+ <style type="text/css" media="screen">
517
+ <?php if ( !empty($icon_url) ) { ?>
518
 
519
+ a.toplevel_page_<?php echo $result_id ?> .wp-menu-image {
520
+ background: url('<?php echo $icon_url ?>') no-repeat 10px -30px !important;
521
+ }
522
 
523
+ <?php } ?>
524
 
525
+ a.toplevel_page_<?php echo $result_id ?> .wp-menu-image:before {
526
+ content: "<?php echo !empty($icon_code) ? $icon_code : ''; ?>" !important;
527
+ }
528
 
529
+ a.toplevel_page_<?php echo $result_id ?>:hover .wp-menu-image,
530
+ a.toplevel_page_<?php echo $result_id ?>.wp-has-current-submenu .wp-menu-image,
531
+ a.toplevel_page_<?php echo $result_id ?>.current .wp-menu-image {
532
+ background-position: 10px 2px !important;
533
+ }
534
+ </style>
535
  <?php } else { ?>
536
+ <style type="text/css" media="screen">
537
+ a.toplevel_page_<?php echo $result_id ?> .wp-menu-image {
538
+ background: url('<?php echo $icon_url ?>') no-repeat 6px -33px !important;
539
+ }
540
+
541
+ a.toplevel_page_<?php echo $result_id ?>:hover .wp-menu-image,
542
+ a.toplevel_page_<?php echo $result_id ?>.current .wp-menu-image {
543
+ background-position: 6px -1px !important;
544
+ }
545
+ </style>
546
  <?php
547
  }
548
 
549
+ if( $this->internal ) {
550
  ?>
551
+ <style type="text/css" media="screen">
552
+ li.toplevel_page_<?php echo $result_id ?> {
553
+ display: none;
554
+ }
555
+ </style>
556
  <?php
557
  }
558
  }
565
  *
566
  * @return mixed
567
  */
568
+ function addLinkToPluginActions($links)
569
+ {
570
+ $link_title = !empty($this->title_plugin_action_link) ? $this->title_plugin_action_link : $this->getMenuTitle();
571
 
572
  $settings_link = '<a href="' . $this->getBaseUrl() . '">' . $link_title . '</a>';
573
+ array_unshift($links, $settings_link);
574
 
575
  return $links;
576
  }
libs/factory/pages/includes/page.class.php CHANGED
@@ -14,9 +14,9 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( ! class_exists( 'Wbcr_FactoryPages420_Page' ) ) {
18
 
19
- class Wbcr_FactoryPages420_Page {
20
 
21
 
22
  /**
@@ -30,7 +30,7 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_Page' ) ) {
30
  * Чтобы не было конфликтов с другими плагинами, используйте префиксы.
31
  *
32
  * @since 1.0.0
33
- * @see FactoryPages420_AdminPage
34
  *
35
  * @var string
36
  */
@@ -39,7 +39,7 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_Page' ) ) {
39
  /**
40
  * Current Factory Plugin.
41
  *
42
- * @var Wbcr_Factory420_Plugin
43
  */
44
  public $plugin;
45
 
@@ -51,11 +51,11 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_Page' ) ) {
51
  //private $default_actions = array();
52
 
53
  /**
54
- * @param Wbcr_Factory420_Plugin $plugin
55
  *
56
  * @throws Exception
57
  */
58
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
59
  $this->plugin = $plugin;
60
 
61
  if ( $plugin ) {
@@ -111,7 +111,7 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_Page' ) ) {
111
 
112
  if ( ! method_exists( $this, $actionFunction ) ) {
113
  // todo: продумать и доработать выполнение произвольных и глобальных дейтсвия для всех страниц
114
- /*$custom_actions = apply_filters('wbcr/factory_pages_420/custom_actions', array(), $raw_action_name);
115
 
116
  if(isset($custom_actions[$raw_action_name])) {
117
  $custom_actions[$raw_action_name]();
14
  exit;
15
  }
16
 
17
+ if ( ! class_exists( 'Wbcr_FactoryPages429_Page' ) ) {
18
 
19
+ class Wbcr_FactoryPages429_Page {
20
 
21
 
22
  /**
30
  * Чтобы не было конфликтов с другими плагинами, используйте префиксы.
31
  *
32
  * @since 1.0.0
33
+ * @see FactoryPages429_AdminPage
34
  *
35
  * @var string
36
  */
39
  /**
40
  * Current Factory Plugin.
41
  *
42
+ * @var Wbcr_Factory429_Plugin
43
  */
44
  public $plugin;
45
 
51
  //private $default_actions = array();
52
 
53
  /**
54
+ * @param Wbcr_Factory429_Plugin $plugin
55
  *
56
  * @throws Exception
57
  */
58
+ public function __construct( Wbcr_Factory429_Plugin $plugin ) {
59
  $this->plugin = $plugin;
60
 
61
  if ( $plugin ) {
111
 
112
  if ( ! method_exists( $this, $actionFunction ) ) {
113
  // todo: продумать и доработать выполнение произвольных и глобальных дейтсвия для всех страниц
114
+ /*$custom_actions = apply_filters('wbcr/factory_pages_429/custom_actions', array(), $raw_action_name);
115
 
116
  if(isset($custom_actions[$raw_action_name])) {
117
  $custom_actions[$raw_action_name]();
libs/factory/pages/langs/{wbcr_factory_pages_420-fr_FR.mo → wbcr_factory_pages_429-fr_FR.mo} RENAMED
File without changes
libs/factory/pages/langs/{wbcr_factory_pages_420-fr_FR.po → wbcr_factory_pages_429-fr_FR.po} RENAMED
File without changes
libs/factory/pages/langs/{wbcr_factory_pages_420-ru_RU.mo → wbcr_factory_pages_429-ru_RU.mo} RENAMED
File without changes
libs/factory/pages/langs/{wbcr_factory_pages_420-ru_RU.po → wbcr_factory_pages_429-ru_RU.po} RENAMED
File without changes
libs/factory/pages/pages.php CHANGED
@@ -14,24 +14,24 @@
14
  exit;
15
  }
16
 
17
- add_action('admin_menu', 'Wbcr_FactoryPages420::actionAdminMenu');
18
- add_action('network_admin_menu', 'Wbcr_FactoryPages420::actionAdminMenu');
19
 
20
- if( !class_exists('Wbcr_FactoryPages420') ) {
21
  /**
22
  * A base class to manage pages.
23
  *
24
  * @since 1.0.0
25
  */
26
- class Wbcr_FactoryPages420 {
27
 
28
  /**
29
- * @var Wbcr_FactoryPages420_Page[]
30
  */
31
  private static $pages = array();
32
 
33
  /**
34
- * @param Wbcr_Factory420_Plugin $plugin
35
  * @param $class_name
36
  */
37
  public static function register($plugin, $class_name)
@@ -59,7 +59,7 @@
59
  }
60
  }
61
 
62
- public static function getPageUrl(Wbcr_Factory420_Plugin $plugin, $page_id, $args = array())
63
  {
64
  if( isset(self::$pages[$plugin->getPluginName()]) ) {
65
  $pages = self::$pages[$plugin->getPluginName()];
@@ -75,7 +75,7 @@
75
  }
76
 
77
  /**
78
- * @param Wbcr_Factory420_Plugin $plugin
79
  * @return array
80
  */
81
  public static function getIds($plugin)
@@ -93,14 +93,14 @@
93
  }
94
  }
95
 
96
- if( !function_exists('wbcr_factory_pages_420_get_page_id') ) {
97
  /**
98
  *
99
- * @param Wbcr_Factory420_Plugin $plugin
100
  * @param string $page_id
101
  * @return string
102
  */
103
- function wbcr_factory_pages_420_get_page_id($plugin, $page_id)
104
  {
105
  return $page_id . '-' . $plugin->getPluginName();
106
  }
14
  exit;
15
  }
16
 
17
+ add_action('admin_menu', 'Wbcr_FactoryPages429::actionAdminMenu');
18
+ add_action('network_admin_menu', 'Wbcr_FactoryPages429::actionAdminMenu');
19
 
20
+ if( !class_exists('Wbcr_FactoryPages429') ) {
21
  /**
22
  * A base class to manage pages.
23
  *
24
  * @since 1.0.0
25
  */
26
+ class Wbcr_FactoryPages429 {
27
 
28
  /**
29
+ * @var Wbcr_FactoryPages429_Page[]
30
  */
31
  private static $pages = array();
32
 
33
  /**
34
+ * @param Wbcr_Factory429_Plugin $plugin
35
  * @param $class_name
36
  */
37
  public static function register($plugin, $class_name)
59
  }
60
  }
61
 
62
+ public static function getPageUrl(Wbcr_Factory429_Plugin $plugin, $page_id, $args = array())
63
  {
64
  if( isset(self::$pages[$plugin->getPluginName()]) ) {
65
  $pages = self::$pages[$plugin->getPluginName()];
75
  }
76
 
77
  /**
78
+ * @param Wbcr_Factory429_Plugin $plugin
79
  * @return array
80
  */
81
  public static function getIds($plugin)
93
  }
94
  }
95
 
96
+ if( !function_exists('wbcr_factory_pages_429_get_page_id') ) {
97
  /**
98
  *
99
+ * @param Wbcr_Factory429_Plugin $plugin
100
  * @param string $page_id
101
  * @return string
102
  */
103
+ function wbcr_factory_pages_429_get_page_id($plugin, $page_id)
104
  {
105
  return $page_id . '-' . $plugin->getPluginName();
106
  }
libs/factory/pages/templates/assets/css/impressive.page.template.css CHANGED
@@ -8,7 +8,7 @@
8
  #WBCR .error {
9
  display: none !important;
10
  }
11
- #WBCR .wbcr-factory-pages-420-impressive-page-template {
12
  position: relative;
13
  /**
14
  Content sections
@@ -17,134 +17,134 @@
17
  Widget in the sidebar of the plugin
18
  */
19
  }
20
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-color-grey {
21
  color: #9a9a9a;
22
  }
23
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-orange-color {
24
  color: #ffc107;
25
  }
26
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-light-orange-color {
27
  color: #ffeb3b;
28
  }
29
- #WBCR .wbcr-factory-pages-420-impressive-page-template .form-group {
30
  padding: 0 20px;
31
  }
32
- #WBCR .wbcr-factory-pages-420-impressive-page-template .form-group label {
33
  font-weight: normal;
34
  }
35
- #WBCR .wbcr-factory-pages-420-impressive-page-template .form-horizontal .control-label {
36
  max-width: 300px;
37
  }
38
- #WBCR .wbcr-factory-pages-420-impressive-page-template .factory-control-buttons {
39
  text-align: right;
40
  padding-right: 20px;
41
  }
42
- #WBCR .wbcr-factory-pages-420-impressive-page-template .factory-from-control-list label span {
43
  display: inline-block;
44
  vertical-align: bottom;
45
  }
46
- #WBCR .wbcr-factory-pages-420-impressive-page-template .factory-from-control-list label span input[type="checkbox"],
47
- #WBCR .wbcr-factory-pages-420-impressive-page-template .factory-from-control-list label span input[type="checkbox"]:focus {
48
  outline: none;
49
  }
50
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert {
51
  font-weight: bold;
52
  margin: 0 !important;
53
  border: 0;
54
  border-radius: 0;
55
  padding: 15px;
56
  }
57
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert + .wbcr-factory-page-group-header {
58
  margin-top: 0 !important;
59
  }
60
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert.alert-warning {
61
  background: #fff3d0;
62
  }
63
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert.alert-warning:nth-child(2n+1) {
64
  background: #fffde9;
65
  }
66
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert.alert-danger {
67
  background: #de716d;
68
  }
69
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert.alert-danger:nth-child(2n+1) {
70
  background: #ec8c89;
71
  }
72
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert.alert-success {
73
  background: #d0ecc4;
74
  }
75
- #WBCR .wbcr-factory-pages-420-impressive-page-template .alert.alert-success:nth-child(2n+1) {
76
  background: #e0eadb;
77
  }
78
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-header {
79
  padding: 20px 20px 40px;
80
  }
81
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-recomended-text {
82
  display: block;
83
  font-size: 11px;
84
  font-weight: lighter;
85
  color: #179347;
86
  }
87
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-options,
88
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page {
89
  position: relative;
90
  background: #e6e6e6;
91
  overflow: hidden;
92
  }
93
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-options:after,
94
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page:after {
95
  display: block;
96
  content: '';
97
  clear: both;
98
  }
99
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-group-header {
100
  background: #efefef;
101
  padding: 20px 0 10px 20px;
102
  margin: 30px 0;
103
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
104
  }
105
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-group-header:first-child {
106
  margin-top: 0;
107
  }
108
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-group-header strong {
109
  font-size: 15px;
110
  }
111
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-group-header p {
112
  color: #8c8888;
113
  font-size: 12px;
114
  }
115
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap {
116
  margin-left: 230px;
117
  padding: 80px 0 0 0;
118
  vertical-align: top;
119
  background: #fff;
120
  }
121
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-wrapper,
122
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap h2.nav-tab-wrapper,
123
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap h1.nav-tab-wrapper {
124
  border: 0;
125
  }
126
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-active {
127
  background: #efefef !important;
128
  margin-bottom: -2px !important;
129
  border-bottom: 1px solid #efefef !important;
130
  }
131
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:first-child {
132
  margin: 0;
133
  }
134
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:hover {
135
  background: #f7f7f7;
136
  }
137
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab {
138
  border: 2px solid #dedede;
139
  border-bottom: 0;
140
  box-shadow: -1px 0 0 rgba(0, 0, 0, 0.1);
141
  }
142
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:active,
143
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:focus {
144
  box-shadow: none;
145
  outline: none;
146
  }
147
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header {
148
  position: absolute;
149
  z-index: 13;
150
  top: 0;
@@ -155,7 +155,7 @@
155
  color: #fff;
156
  border-radius: 5px 5px 0 0;
157
  }
158
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-logo {
159
  float: left;
160
  padding: 25px 0;
161
  font-size: 20px;
@@ -168,11 +168,11 @@
168
  margin-right: 10px;
169
  background: none;
170
  }
171
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-title {
172
  display: inline-block;
173
  vertical-align: middle;
174
  }
175
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-title h2 {
176
  font-size: 18px;
177
  line-height: 30px;
178
  font-weight: 300;
@@ -183,12 +183,12 @@
183
  text-overflow: ellipsis;
184
  color: #fff;
185
  }
186
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-control {
187
  position: relative;
188
  float: right;
189
  margin: 12px;
190
  }
191
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button {
192
  display: inline-block;
193
  vertical-align: top;
194
  font-size: 13px;
@@ -211,49 +211,49 @@
211
  text-decoration: none;
212
  z-index: 3;
213
  }
214
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-save {
215
  box-shadow: none;
216
  min-width: 100px;
217
  background-color: #8bc34a;
218
  color: #fff;
219
  }
220
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-save:hover {
221
  background: #9dbb7b;
222
  color: #fff;
223
  }
224
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-save:active {
225
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
226
  }
227
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-settings {
228
  box-shadow: none;
229
  min-width: 200px;
230
  background-color: #9e9e9e;
231
  color: #fff;
232
  }
233
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-settings:hover {
234
  background: #797979;
235
  color: #fff;
236
  }
237
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-settings:active {
238
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
239
  }
240
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar {
241
  float: left;
242
  vertical-align: top;
243
  width: 230px;
244
  background: #e6e6e6;
245
  }
246
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul {
247
  padding: 0;
248
  margin-bottom: 0;
249
  margin-top: 80px;
250
  }
251
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab {
252
  display: block;
253
  background: #efefef;
254
  margin: 1px 0;
255
  }
256
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link {
257
  display: block;
258
  width: 100%;
259
  padding: 20px 20px;
@@ -264,83 +264,126 @@
264
  text-align: left;
265
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
266
  }
267
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link .wbcr-factory-tab__title {
268
  display: block;
269
  font-weight: bold;
270
  }
271
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link .wbcr-factory-tab__short-description {
272
  display: block;
273
  font-size: 13px;
274
  font-weight: normal;
275
  text-transform: none;
276
  color: #9a9a9a;
277
  }
278
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link .dashicons {
279
  float: right;
280
  color: #ccc;
281
  }
282
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link::after {
283
  clear: both;
284
  }
285
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover {
286
  background: #f7f6f6;
287
  }
288
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover .dashicons {
289
  color: #9a9a9a;
290
  }
291
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link,
292
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
293
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover,
294
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
295
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:focus {
296
  outline: 0 !important;
297
  box-shadow: none !important;
298
  }
299
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab {
300
  background: #fff;
 
301
  }
302
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab a {
303
  color: #ff5722;
304
  font-weight: bold;
305
- border-left: 5px solid #ff5722;
306
  }
307
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab a .dashicons {
308
  color: #9a9a9a;
309
  }
310
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section,
311
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  display: inline-block;
313
  vertical-align: top;
314
  }
315
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section {
316
  width: 74.6%;
317
  }
318
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section.wbcr-fullwidth {
319
  width: 100%;
320
  }
321
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section .nav-tab-wrapper {
322
  margin-top: 15px;
323
  }
324
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content {
325
  background: #f7f7f7;
326
  padding: 0 0 20px 0;
327
  border: 1px solid #dad8d8;
328
  box-shadow: -1px 0px 1px rgba(0, 0, 0, 0.1);
329
  }
330
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content > form {
331
  padding-top: 0 !important;
332
  }
333
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section {
334
  width: 25%;
335
  padding: 10px;
336
  margin: 0 0 -20px;
337
  background-color: #f9f9f9;
338
  box-shadow: -1px 1px 5px rgba(0, 0, 0, 0.1);
339
  }
340
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-sidebar-widget {
341
  margin: 0 0 20px;
342
  }
343
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget {
344
  display: inline-block;
345
  min-height: 230px;
346
  width: 100%;
@@ -349,19 +392,19 @@
349
  padding: 20px 15px;
350
  vertical-align: top;
351
  }
352
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-hide {
353
  display: none;
354
  }
355
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-warning {
356
  background: #fff4d0;
357
  }
358
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-danger {
359
  background: #e2ffc0;
360
  }
361
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-success {
362
  background: #ffebe9;
363
  }
364
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-hint-icon-simple {
365
  display: inline-block;
366
  width: 16px;
367
  height: 16px;
@@ -373,16 +416,16 @@
373
  background: #E91E63;
374
  border-radius: 3px;
375
  }
376
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-grey {
377
  background: #E91E63;
378
  }
379
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-red {
380
  background: #9e9e9e;
381
  }
382
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-green {
383
  background: #8bc34a;
384
  }
385
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-icon-5stars {
386
  display: block;
387
  width: 80px;
388
  height: 17px;
@@ -390,23 +433,23 @@
390
  vertical-align: middle;
391
  margin-bottom: 5px;
392
  }
393
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] {
394
  display: block;
395
  margin: 30px auto 0;
396
  outline: none;
397
  }
398
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :focus,
399
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :active {
400
  box-shadow: none;
401
  }
402
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form .wbcr-factory-donation-price {
403
  font-size: 50px;
404
  margin-top: 30px;
405
  text-align: center;
406
  font-weight: 600;
407
  color: #8BC34A;
408
  }
409
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box {
410
  min-height: 240px;
411
  margin-bottom: 20px;
412
  text-align: center;
@@ -414,24 +457,24 @@
414
  padding: 30px;
415
  border: 1px solid #f3f1e7;
416
  }
417
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box .dashicons {
418
  width: 50px;
419
  height: 50px;
420
  font-size: 50px;
421
  color: #FFC107;
422
  line-height: normal;
423
  }
424
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box h3 {
425
  color: #7b6111;
426
  }
427
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box p {
428
  color: #9e9e9e;
429
  }
430
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-buttons-wrap {
431
  margin-top: 20px;
432
  text-align: center;
433
  }
434
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button {
435
  display: inline-block;
436
  padding: 20px 60px;
437
  background-color: #FFC107;
@@ -441,67 +484,67 @@
441
  font-weight: bold;
442
  transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
443
  }
444
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button:hover {
445
  background-color: #ffce3a;
446
  }
447
- #WBCR .wbcr-factory-pages-420-impressive-page-template #wbcr-factory-confirm-dialog {
448
  padding: 20px;
449
  background: #ffffff;
450
  }
451
- #WBCR .wbcr-factory-pages-420-impressive-page-template #wbcr-factory-confirm-dialog .updated,
452
- #WBCR .wbcr-factory-pages-420-impressive-page-template #wbcr-factory-confirm-dialog .alert {
453
  display: none;
454
  }
455
- #WBCR .wbcr-factory-pages-420-impressive-page-template #wbcr-factory-confirm-dialog h2 {
456
  font-size: 18px;
457
  margin-top: 10px;
458
  }
459
- #WBCR .wbcr-factory-pages-420-impressive-page-template #wbcr-factory-confirm-dialog .wbcr-factory-confirm-description {
460
  padding: 10px;
461
  background: #ffedeb;
462
  border: 1px solid #ffdfdc;
463
  margin: 15px 0;
464
  }
465
- #WBCR .wbcr-factory-pages-420-impressive-page-template #wbcr-factory-confirm-dialog .wbcr-factory-confirm-hint {
466
  margin-bottom: 15px;
467
  color: #7b7b7b;
468
  }
469
  @media screen and (max-width: 1367px) {
470
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section {
471
  width: 69.6%;
472
  }
473
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section {
474
  width: 30%;
475
  }
476
  }
477
  @media screen and (max-width: 1320px) {
478
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-content-section {
479
  width: 100%;
480
  }
481
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section {
482
  display: none !important;
483
  }
484
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-header-logo .dash {
485
  display: none !important;
486
  }
487
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-header-title {
488
  display: none !important;
489
  }
490
  }
491
  @media screen and (max-width: 950px) {
492
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar {
493
  width: 70px;
494
  }
495
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a {
496
  font-size: 0;
497
  }
498
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__title {
499
  font-size: 0;
500
  }
501
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__short-description {
502
  display: none !important;
503
  }
504
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-page-inner-wrap {
505
  margin-left: 70px;
506
  }
507
  }
8
  #WBCR .error {
9
  display: none !important;
10
  }
11
+ #WBCR .wbcr-factory-pages-429-impressive-page-template {
12
  position: relative;
13
  /**
14
  Content sections
17
  Widget in the sidebar of the plugin
18
  */
19
  }
20
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-color-grey {
21
  color: #9a9a9a;
22
  }
23
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-orange-color {
24
  color: #ffc107;
25
  }
26
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-light-orange-color {
27
  color: #ffeb3b;
28
  }
29
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .form-group {
30
  padding: 0 20px;
31
  }
32
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .form-group label {
33
  font-weight: normal;
34
  }
35
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .form-horizontal .control-label {
36
  max-width: 300px;
37
  }
38
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .factory-control-buttons {
39
  text-align: right;
40
  padding-right: 20px;
41
  }
42
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .factory-from-control-list label span {
43
  display: inline-block;
44
  vertical-align: bottom;
45
  }
46
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .factory-from-control-list label span input[type="checkbox"],
47
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .factory-from-control-list label span input[type="checkbox"]:focus {
48
  outline: none;
49
  }
50
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert {
51
  font-weight: bold;
52
  margin: 0 !important;
53
  border: 0;
54
  border-radius: 0;
55
  padding: 15px;
56
  }
57
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert + .wbcr-factory-page-group-header {
58
  margin-top: 0 !important;
59
  }
60
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert.alert-warning {
61
  background: #fff3d0;
62
  }
63
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert.alert-warning:nth-child(2n+1) {
64
  background: #fffde9;
65
  }
66
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert.alert-danger {
67
  background: #de716d;
68
  }
69
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert.alert-danger:nth-child(2n+1) {
70
  background: #ec8c89;
71
  }
72
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert.alert-success {
73
  background: #d0ecc4;
74
  }
75
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .alert.alert-success:nth-child(2n+1) {
76
  background: #e0eadb;
77
  }
78
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-header {
79
  padding: 20px 20px 40px;
80
  }
81
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-recomended-text {
82
  display: block;
83
  font-size: 11px;
84
  font-weight: lighter;
85
  color: #179347;
86
  }
87
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-options,
88
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page {
89
  position: relative;
90
  background: #e6e6e6;
91
  overflow: hidden;
92
  }
93
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-options:after,
94
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page:after {
95
  display: block;
96
  content: '';
97
  clear: both;
98
  }
99
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-group-header {
100
  background: #efefef;
101
  padding: 20px 0 10px 20px;
102
  margin: 30px 0;
103
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
104
  }
105
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-group-header:first-child {
106
  margin-top: 0;
107
  }
108
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-group-header strong {
109
  font-size: 15px;
110
  }
111
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-group-header p {
112
  color: #8c8888;
113
  font-size: 12px;
114
  }
115
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap {
116
  margin-left: 230px;
117
  padding: 80px 0 0 0;
118
  vertical-align: top;
119
  background: #fff;
120
  }
121
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-wrapper,
122
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap h2.nav-tab-wrapper,
123
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap h1.nav-tab-wrapper {
124
  border: 0;
125
  }
126
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-active {
127
  background: #efefef !important;
128
  margin-bottom: -2px !important;
129
  border-bottom: 1px solid #efefef !important;
130
  }
131
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:first-child {
132
  margin: 0;
133
  }
134
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:hover {
135
  background: #f7f7f7;
136
  }
137
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab {
138
  border: 2px solid #dedede;
139
  border-bottom: 0;
140
  box-shadow: -1px 0 0 rgba(0, 0, 0, 0.1);
141
  }
142
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:active,
143
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:focus {
144
  box-shadow: none;
145
  outline: none;
146
  }
147
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header {
148
  position: absolute;
149
  z-index: 13;
150
  top: 0;
155
  color: #fff;
156
  border-radius: 5px 5px 0 0;
157
  }
158
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-logo {
159
  float: left;
160
  padding: 25px 0;
161
  font-size: 20px;
168
  margin-right: 10px;
169
  background: none;
170
  }
171
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-title {
172
  display: inline-block;
173
  vertical-align: middle;
174
  }
175
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-title h2 {
176
  font-size: 18px;
177
  line-height: 30px;
178
  font-weight: 300;
183
  text-overflow: ellipsis;
184
  color: #fff;
185
  }
186
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-control {
187
  position: relative;
188
  float: right;
189
  margin: 12px;
190
  }
191
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button {
192
  display: inline-block;
193
  vertical-align: top;
194
  font-size: 13px;
211
  text-decoration: none;
212
  z-index: 3;
213
  }
214
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-save {
215
  box-shadow: none;
216
  min-width: 100px;
217
  background-color: #8bc34a;
218
  color: #fff;
219
  }
220
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-save:hover {
221
  background: #9dbb7b;
222
  color: #fff;
223
  }
224
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-save:active {
225
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
226
  }
227
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-settings {
228
  box-shadow: none;
229
  min-width: 200px;
230
  background-color: #9e9e9e;
231
  color: #fff;
232
  }
233
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-settings:hover {
234
  background: #797979;
235
  color: #fff;
236
  }
237
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button.wbcr-factory-type-settings:active {
238
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
239
  }
240
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar {
241
  float: left;
242
  vertical-align: top;
243
  width: 230px;
244
  background: #e6e6e6;
245
  }
246
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul {
247
  padding: 0;
248
  margin-bottom: 0;
249
  margin-top: 80px;
250
  }
251
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab {
252
  display: block;
253
  background: #efefef;
254
  margin: 1px 0;
255
  }
256
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link {
257
  display: block;
258
  width: 100%;
259
  padding: 20px 20px;
264
  text-align: left;
265
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
266
  }
267
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link .wbcr-factory-tab__title {
268
  display: block;
269
  font-weight: bold;
270
  }
271
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link .wbcr-factory-tab__short-description {
272
  display: block;
273
  font-size: 13px;
274
  font-weight: normal;
275
  text-transform: none;
276
  color: #9a9a9a;
277
  }
278
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link .dashicons {
279
  float: right;
280
  color: #ccc;
281
  }
282
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link::after {
283
  clear: both;
284
  }
285
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover {
286
  background: #f7f6f6;
287
  }
288
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover .dashicons {
289
  color: #9a9a9a;
290
  }
291
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link,
292
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
293
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover,
294
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
295
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:focus {
296
  outline: 0 !important;
297
  box-shadow: none !important;
298
  }
299
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab {
300
  background: #fff;
301
+ border-left: 5px solid #ff5722;
302
  }
303
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab a {
304
  color: #ff5722;
305
  font-weight: bold;
 
306
  }
307
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab a .dashicons {
308
  color: #9a9a9a;
309
  }
310
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu {
311
+ padding: 0;
312
+ margin: 0;
313
+ }
314
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu li {
315
+ margin: 1px 0 0;
316
+ padding: 0;
317
+ }
318
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu li a {
319
+ display: block;
320
+ font-weight: normal;
321
+ color: #222;
322
+ border: 0;
323
+ margin: 0;
324
+ padding: 5px 5px 5px 30px;
325
+ background: #f5f5f5;
326
+ text-decoration: none;
327
+ outline: none;
328
+ }
329
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu li a:focus,
330
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu li a:link {
331
+ outline: 0 !important;
332
+ text-shadow: none !important;
333
+ }
334
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu li a .dashicons {
335
+ color: #9a9a9a;
336
+ font-size: 13px;
337
+ border: 0;
338
+ -moz-transform: scaleX(-1);
339
+ -webkit-transform: scaleX(-1);
340
+ -o-transform: scaleX(-1);
341
+ transform: scaleX(-1);
342
+ -ms-filter: fliph;
343
+ filter: fliph;
344
+ }
345
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu li a.wbcr-factory-tab-active {
346
+ background: #fff;
347
+ color: #ff5722;
348
+ font-weight: 600;
349
+ }
350
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-submenu li a.wbcr-factory-tab-active .dashicons {
351
+ color: #ff5722;
352
+ }
353
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section,
354
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section {
355
  display: inline-block;
356
  vertical-align: top;
357
  }
358
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section {
359
  width: 74.6%;
360
  }
361
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section.wbcr-fullwidth {
362
  width: 100%;
363
  }
364
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section .nav-tab-wrapper {
365
  margin-top: 15px;
366
  }
367
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content {
368
  background: #f7f7f7;
369
  padding: 0 0 20px 0;
370
  border: 1px solid #dad8d8;
371
  box-shadow: -1px 0px 1px rgba(0, 0, 0, 0.1);
372
  }
373
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content > form {
374
  padding-top: 0 !important;
375
  }
376
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section {
377
  width: 25%;
378
  padding: 10px;
379
  margin: 0 0 -20px;
380
  background-color: #f9f9f9;
381
  box-shadow: -1px 1px 5px rgba(0, 0, 0, 0.1);
382
  }
383
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-sidebar-widget {
384
  margin: 0 0 20px;
385
  }
386
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget {
387
  display: inline-block;
388
  min-height: 230px;
389
  width: 100%;
392
  padding: 20px 15px;
393
  vertical-align: top;
394
  }
395
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-hide {
396
  display: none;
397
  }
398
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-warning {
399
  background: #fff4d0;
400
  }
401
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-danger {
402
  background: #e2ffc0;
403
  }
404
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-success {
405
  background: #ffebe9;
406
  }
407
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-hint-icon-simple {
408
  display: inline-block;
409
  width: 16px;
410
  height: 16px;
416
  background: #E91E63;
417
  border-radius: 3px;
418
  }
419
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-grey {
420
  background: #E91E63;
421
  }
422
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-red {
423
  background: #9e9e9e;
424
  }
425
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-green {
426
  background: #8bc34a;
427
  }
428
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-icon-5stars {
429
  display: block;
430
  width: 80px;
431
  height: 17px;
433
  vertical-align: middle;
434
  margin-bottom: 5px;
435
  }
436
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] {
437
  display: block;
438
  margin: 30px auto 0;
439
  outline: none;
440
  }
441
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :focus,
442
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :active {
443
  box-shadow: none;
444
  }
445
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form .wbcr-factory-donation-price {
446
  font-size: 50px;
447
  margin-top: 30px;
448
  text-align: center;
449
  font-weight: 600;
450
  color: #8BC34A;
451
  }
452
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box {
453
  min-height: 240px;
454
  margin-bottom: 20px;
455
  text-align: center;
457
  padding: 30px;
458
  border: 1px solid #f3f1e7;
459
  }
460
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box .dashicons {
461
  width: 50px;
462
  height: 50px;
463
  font-size: 50px;
464
  color: #FFC107;
465
  line-height: normal;
466
  }
467
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box h3 {
468
  color: #7b6111;
469
  }
470
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box p {
471
  color: #9e9e9e;
472
  }
473
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-buttons-wrap {
474
  margin-top: 20px;
475
  text-align: center;
476
  }
477
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button {
478
  display: inline-block;
479
  padding: 20px 60px;
480
  background-color: #FFC107;
484
  font-weight: bold;
485
  transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
486
  }
487
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button:hover {
488
  background-color: #ffce3a;
489
  }
490
+ #WBCR .wbcr-factory-pages-429-impressive-page-template #wbcr-factory-confirm-dialog {
491
  padding: 20px;
492
  background: #ffffff;
493
  }
494
+ #WBCR .wbcr-factory-pages-429-impressive-page-template #wbcr-factory-confirm-dialog .updated,
495
+ #WBCR .wbcr-factory-pages-429-impressive-page-template #wbcr-factory-confirm-dialog .alert {
496
  display: none;
497
  }
498
+ #WBCR .wbcr-factory-pages-429-impressive-page-template #wbcr-factory-confirm-dialog h2 {
499
  font-size: 18px;
500
  margin-top: 10px;
501
  }
502
+ #WBCR .wbcr-factory-pages-429-impressive-page-template #wbcr-factory-confirm-dialog .wbcr-factory-confirm-description {
503
  padding: 10px;
504
  background: #ffedeb;
505
  border: 1px solid #ffdfdc;
506
  margin: 15px 0;
507
  }
508
+ #WBCR .wbcr-factory-pages-429-impressive-page-template #wbcr-factory-confirm-dialog .wbcr-factory-confirm-hint {
509
  margin-bottom: 15px;
510
  color: #7b7b7b;
511
  }
512
  @media screen and (max-width: 1367px) {
513
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section {
514
  width: 69.6%;
515
  }
516
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section {
517
  width: 30%;
518
  }
519
  }
520
  @media screen and (max-width: 1320px) {
521
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-content-section {
522
  width: 100%;
523
  }
524
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-right-sidebar-section {
525
  display: none !important;
526
  }
527
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-header-logo .dash {
528
  display: none !important;
529
  }
530
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-header-title {
531
  display: none !important;
532
  }
533
  }
534
  @media screen and (max-width: 950px) {
535
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar {
536
  width: 70px;
537
  }
538
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a {
539
  font-size: 0;
540
  }
541
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__title {
542
  font-size: 0;
543
  }
544
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__short-description {
545
  display: none !important;
546
  }
547
+ #WBCR .wbcr-factory-pages-429-impressive-page-template .wbcr-factory-page-inner-wrap {
548
  margin-left: 70px;
549
  }
550
  }
libs/factory/pages/templates/assets/css/impressive.page.template.less CHANGED
@@ -26,6 +26,7 @@
26
 
27
  .form-group {
28
  padding: 0 20px;
 
29
  label {
30
  font-weight: normal;
31
  }
@@ -45,6 +46,7 @@
45
  span {
46
  display: inline-block;
47
  vertical-align: bottom;
 
48
  input[type="checkbox"], input[type="checkbox"]:focus {
49
  outline: none;
50
  }
@@ -123,12 +125,15 @@
123
  padding: 20px 0 10px 20px;
124
  margin: 30px 0;
125
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
 
126
  &:first-child {
127
  margin-top: 0;
128
  }
 
129
  strong {
130
  font-size: 15px;
131
  }
 
132
  p {
133
  color: #8c8888;
134
  font-size: 12px;
@@ -153,21 +158,26 @@
153
  .nav-tab-wrapper, h2.nav-tab-wrapper, h1.nav-tab-wrapper {
154
  border: 0;
155
  }
 
156
  .nav-tab-active {
157
  background: #efefef !important;
158
  margin-bottom: -2px !important;
159
  border-bottom: 1px solid #efefef !important;
160
  }
 
161
  .nav-tab:first-child {
162
  margin: 0;
163
  }
 
164
  .nav-tab:hover {
165
  background: #f7f7f7;
166
  }
 
167
  .nav-tab {
168
  border: 2px solid #dedede;
169
  border-bottom: 0;
170
  box-shadow: -1px 0 0 rgba(0, 0, 0, 0.1);
 
171
  &:active, &:focus {
172
  box-shadow: none;
173
  outline: none;
@@ -204,6 +214,7 @@
204
  .wbcr-factory-header-title {
205
  display: inline-block;
206
  vertical-align: middle;
 
207
  h2 {
208
  font-size: 18px;
209
  line-height: 30px;
@@ -252,10 +263,12 @@
252
  min-width: 100px;
253
  background-color: #8bc34a;
254
  color: #fff;
 
255
  &:hover {
256
  background: #9dbb7b;
257
  color: #fff;
258
  }
 
259
  &:active {
260
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
261
  }
@@ -266,10 +279,12 @@
266
  min-width: 200px;
267
  background-color: #9e9e9e;
268
  color: #fff;
 
269
  &:hover {
270
  background: #797979;
271
  color: #fff;
272
  }
 
273
  &:active {
274
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
275
  }
@@ -288,11 +303,13 @@
288
  padding: 0;
289
  margin-bottom: 0;
290
  margin-top: 80px;
 
291
  .wbcr-factory-nav-tab {
292
  display: block;
293
  background: #efefef;
294
  //padding: 15px 20px;
295
  margin: 1px 0;
 
296
  .wbcr-factory-tab__link {
297
  display: block;
298
  width: 100%;
@@ -329,27 +346,83 @@
329
 
330
  &:hover {
331
  background: #f7f6f6;
 
332
  .dashicons {
333
  color: #9a9a9a;
334
  }
335
  }
 
336
  &, &:active, &:hover, &:active, &:focus {
337
  outline: 0 !important;
338
  box-shadow: none !important;
339
  }
340
 
341
  }
 
342
  &.wbcr-factory-active-tab {
343
  background: #fff;
 
 
344
  a {
345
  color: #ff5722;
346
  font-weight: bold;
347
- border-left: 5px solid #ff5722;
 
348
  .dashicons {
349
  color: #9a9a9a;
350
  }
351
  }
352
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
  }
354
  }
355
  }
@@ -357,6 +430,7 @@
357
  /**
358
  Content sections
359
  */
 
360
  .wbcr-factory-content-section, .wbcr-factory-right-sidebar-section {
361
  display: inline-block;
362
  vertical-align: top;
@@ -364,17 +438,21 @@
364
 
365
  .wbcr-factory-content-section {
366
  width: 74.6%;
 
367
  &.wbcr-fullwidth {
368
  width: 100%;
369
  }
 
370
  .nav-tab-wrapper {
371
  margin-top: 15px;
372
  }
 
373
  .wbcr-factory-content {
374
  background: #f7f7f7;
375
  padding: 0 0 20px 0;
376
  border: 1px solid #dad8d8;
377
  box-shadow: -1px 0px 1px rgba(0, 0, 0, 0.1);
 
378
  & > form {
379
  padding-top: 0 !important;
380
  }
@@ -396,6 +474,7 @@
396
  /**
397
  Widget in the sidebar of the plugin
398
  */
 
399
  .wbcr-factory-sidebar-widget {
400
  display: inline-block;
401
  min-height: 230px;
@@ -433,12 +512,15 @@
433
  background: #E91E63;
434
  border-radius: 3px;
435
  }
 
436
  .wbcr-factory-simple-grey {
437
  background: #E91E63;
438
  }
 
439
  .wbcr-factory-simple-red {
440
  background: #9e9e9e;
441
  }
 
442
  .wbcr-factory-simple-green {
443
  background: #8bc34a;
444
  }
@@ -457,10 +539,12 @@
457
  display: block;
458
  margin: 30px auto 0;
459
  outline: none;
 
460
  :focus, :active {
461
  box-shadow: none;
462
  }
463
  }
 
464
  .wbcr-factory-donation-price {
465
  font-size: 50px;
466
  margin-top: 30px;
@@ -480,6 +564,7 @@
480
  background: #fdfcf7;
481
  padding: 30px;
482
  border: 1px solid #f3f1e7;
 
483
  .dashicons {
484
  width: 50px;
485
  height: 50px;
@@ -487,9 +572,11 @@
487
  color: #FFC107;
488
  line-height: normal;
489
  }
 
490
  h3 {
491
  color: #7b6111;
492
  }
 
493
  p {
494
  color: #9e9e9e;
495
  }
@@ -509,6 +596,7 @@
509
  text-transform: uppercase;
510
  font-weight: bold;
511
  transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
 
512
  &:hover {
513
  background-color: #ffce3a
514
  }
@@ -522,16 +610,19 @@
522
  .updated, .alert {
523
  display: none;
524
  }
 
525
  h2 {
526
  font-size: 18px;
527
  margin-top: 10px;
528
  }
 
529
  .wbcr-factory-confirm-description {
530
  padding: 10px;
531
  background: #ffedeb;
532
  border: 1px solid #ffdfdc;
533
  margin: 15px 0;
534
  }
 
535
  .wbcr-factory-confirm-hint {
536
  margin-bottom: 15px;
537
  color: #7b7b7b;
@@ -560,14 +651,17 @@
560
  .wbcr-factory-content-section {
561
  width: 100%;
562
  }
 
563
  .wbcr-factory-right-sidebar-section {
564
  display: none !important;
565
  }
 
566
  .wbcr-factory-header-logo {
567
  .dash {
568
  display: none !important;
569
  }
570
  }
 
571
  .wbcr-factory-header-title {
572
  display: none !important;
573
  }
@@ -586,15 +680,18 @@
586
  a {
587
  font-size: 0;
588
  }
 
589
  .wbcr-factory-tab__title {
590
  font-size: 0;
591
  }
 
592
  .wbcr-factory-tab__short-description {
593
  display: none !important;
594
  }
595
  }
596
  }
597
  }
 
598
  .wbcr-factory-page-inner-wrap {
599
  margin-left: 70px;
600
  }
26
 
27
  .form-group {
28
  padding: 0 20px;
29
+
30
  label {
31
  font-weight: normal;
32
  }
46
  span {
47
  display: inline-block;
48
  vertical-align: bottom;
49
+
50
  input[type="checkbox"], input[type="checkbox"]:focus {
51
  outline: none;
52
  }
125
  padding: 20px 0 10px 20px;
126
  margin: 30px 0;
127
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
128
+
129
  &:first-child {
130
  margin-top: 0;
131
  }
132
+
133
  strong {
134
  font-size: 15px;
135
  }
136
+
137
  p {
138
  color: #8c8888;
139
  font-size: 12px;
158
  .nav-tab-wrapper, h2.nav-tab-wrapper, h1.nav-tab-wrapper {
159
  border: 0;
160
  }
161
+
162
  .nav-tab-active {
163
  background: #efefef !important;
164
  margin-bottom: -2px !important;
165
  border-bottom: 1px solid #efefef !important;
166
  }
167
+
168
  .nav-tab:first-child {
169
  margin: 0;
170
  }
171
+
172
  .nav-tab:hover {
173
  background: #f7f7f7;
174
  }
175
+
176
  .nav-tab {
177
  border: 2px solid #dedede;
178
  border-bottom: 0;
179
  box-shadow: -1px 0 0 rgba(0, 0, 0, 0.1);
180
+
181
  &:active, &:focus {
182
  box-shadow: none;
183
  outline: none;
214
  .wbcr-factory-header-title {
215
  display: inline-block;
216
  vertical-align: middle;
217
+
218
  h2 {
219
  font-size: 18px;
220
  line-height: 30px;
263
  min-width: 100px;
264
  background-color: #8bc34a;
265
  color: #fff;
266
+
267
  &:hover {
268
  background: #9dbb7b;
269
  color: #fff;
270
  }
271
+
272
  &:active {
273
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
274
  }
279
  min-width: 200px;
280
  background-color: #9e9e9e;
281
  color: #fff;
282
+
283
  &:hover {
284
  background: #797979;
285
  color: #fff;
286
  }
287
+
288
  &:active {
289
  box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
290
  }
303
  padding: 0;
304
  margin-bottom: 0;
305
  margin-top: 80px;
306
+
307
  .wbcr-factory-nav-tab {
308
  display: block;
309
  background: #efefef;
310
  //padding: 15px 20px;
311
  margin: 1px 0;
312
+
313
  .wbcr-factory-tab__link {
314
  display: block;
315
  width: 100%;
346
 
347
  &:hover {
348
  background: #f7f6f6;
349
+
350
  .dashicons {
351
  color: #9a9a9a;
352
  }
353
  }
354
+
355
  &, &:active, &:hover, &:active, &:focus {
356
  outline: 0 !important;
357
  box-shadow: none !important;
358
  }
359
 
360
  }
361
+
362
  &.wbcr-factory-active-tab {
363
  background: #fff;
364
+ border-left: 5px solid #ff5722;
365
+
366
  a {
367
  color: #ff5722;
368
  font-weight: bold;
369
+
370
+
371
  .dashicons {
372
  color: #9a9a9a;
373
  }
374
  }
375
  }
376
+
377
+ .wbcr-factory-submenu {
378
+ padding: 0;
379
+ margin: 0;
380
+
381
+ li {
382
+ margin: 1px 0 0;
383
+ padding: 0;
384
+
385
+ a {
386
+ display: block;
387
+ font-weight: normal;
388
+ color: #222;
389
+ border: 0;
390
+ margin: 0;
391
+ padding: 5px 5px 5px 30px;
392
+ background: #f5f5f5;
393
+ text-decoration: none;
394
+ outline: none;
395
+
396
+ &:focus, &:link {
397
+ outline: 0 !important;
398
+ text-shadow: none !important;
399
+ }
400
+
401
+ .dashicons {
402
+ color: #9a9a9a;
403
+ font-size: 13px;
404
+ border: 0;
405
+ -moz-transform: scaleX(-1);
406
+ -webkit-transform: scaleX(-1);
407
+ -o-transform: scaleX(-1);
408
+ transform: scaleX(-1);
409
+ -ms-filter: fliph;
410
+ filter: fliph;
411
+ }
412
+
413
+ &.wbcr-factory-tab-active {
414
+ background: #fff;
415
+ color: #ff5722;
416
+ font-weight: 600;
417
+
418
+
419
+ .dashicons {
420
+ color: #ff5722;
421
+ }
422
+ }
423
+ }
424
+ }
425
+ }
426
  }
427
  }
428
  }
430
  /**
431
  Content sections
432
  */
433
+
434
  .wbcr-factory-content-section, .wbcr-factory-right-sidebar-section {
435
  display: inline-block;
436
  vertical-align: top;
438
 
439
  .wbcr-factory-content-section {
440
  width: 74.6%;
441
+
442
  &.wbcr-fullwidth {
443
  width: 100%;
444
  }
445
+
446
  .nav-tab-wrapper {
447
  margin-top: 15px;
448
  }
449
+
450
  .wbcr-factory-content {
451
  background: #f7f7f7;
452
  padding: 0 0 20px 0;
453
  border: 1px solid #dad8d8;
454
  box-shadow: -1px 0px 1px rgba(0, 0, 0, 0.1);
455
+
456
  & > form {
457
  padding-top: 0 !important;
458
  }
474
  /**
475
  Widget in the sidebar of the plugin
476
  */
477
+
478
  .wbcr-factory-sidebar-widget {
479
  display: inline-block;
480
  min-height: 230px;
512
  background: #E91E63;
513
  border-radius: 3px;
514
  }
515
+
516
  .wbcr-factory-simple-grey {
517
  background: #E91E63;
518
  }
519
+
520
  .wbcr-factory-simple-red {
521
  background: #9e9e9e;
522
  }
523
+
524
  .wbcr-factory-simple-green {
525
  background: #8bc34a;
526
  }
539
  display: block;
540
  margin: 30px auto 0;
541
  outline: none;
542
+
543
  :focus, :active {
544
  box-shadow: none;
545
  }
546
  }
547
+
548
  .wbcr-factory-donation-price {
549
  font-size: 50px;
550
  margin-top: 30px;
564
  background: #fdfcf7;
565
  padding: 30px;
566
  border: 1px solid #f3f1e7;
567
+
568
  .dashicons {
569
  width: 50px;
570
  height: 50px;
572
  color: #FFC107;
573
  line-height: normal;
574
  }
575
+
576
  h3 {
577
  color: #7b6111;
578
  }
579
+
580
  p {
581
  color: #9e9e9e;
582
  }
596
  text-transform: uppercase;
597
  font-weight: bold;
598
  transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
599
+
600
  &:hover {
601
  background-color: #ffce3a
602
  }
610
  .updated, .alert {
611
  display: none;
612
  }
613
+
614
  h2 {
615
  font-size: 18px;
616
  margin-top: 10px;
617
  }
618
+
619
  .wbcr-factory-confirm-description {
620
  padding: 10px;
621
  background: #ffedeb;
622
  border: 1px solid #ffdfdc;
623
  margin: 15px 0;
624
  }
625
+
626
  .wbcr-factory-confirm-hint {
627
  margin-bottom: 15px;
628
  color: #7b7b7b;
651
  .wbcr-factory-content-section {
652
  width: 100%;
653
  }
654
+
655
  .wbcr-factory-right-sidebar-section {
656
  display: none !important;
657
  }
658
+
659
  .wbcr-factory-header-logo {
660
  .dash {
661
  display: none !important;
662
  }
663
  }
664
+
665
  .wbcr-factory-header-title {
666
  display: none !important;
667
  }
680
  a {
681
  font-size: 0;
682
  }
683
+
684
  .wbcr-factory-tab__title {
685
  font-size: 0;
686
  }
687
+
688
  .wbcr-factory-tab__short-description {
689
  display: none !important;
690
  }
691
  }
692
  }
693
  }
694
+
695
  .wbcr-factory-page-inner-wrap {
696
  margin-left: 70px;
697
  }
libs/factory/pages/templates/impressive-page.class.php CHANGED
@@ -10,15 +10,15 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
18
  /**
19
- * Class Wbcr_FactoryPages420_ImpressiveThemplate
20
  */
21
- abstract class Wbcr_FactoryPages420_ImpressiveThemplate extends Wbcr_FactoryPages420_AdminPage {
22
 
23
  /**
24
  * Тип страницы:
@@ -112,86 +112,54 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
112
  public $page_menu = [];
113
 
114
  /**
115
- * @param Wbcr_Factory420_Plugin $plugin
116
  */
117
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
118
- $this->menuIcon = FACTORY_PAGES_420_URL . '/templates/assets/img/webcraftic-plugin-icon.png';
119
- //$allow_multisite = apply_filters('wbcr_factory_420_core_admin_allow_multisite', false);
 
120
 
121
- if ( is_multisite() && $this->available_for_multisite && $plugin->isNetworkActive() ) {
122
- $this->network = true;
123
  $this->menu_target = 'settings.php';
124
  $this->capabilitiy = 'manage_network';
125
  }
126
 
127
- parent::__construct( $plugin );
128
 
129
- $this->title_plugin_action_link = __( 'Settings', 'wbcr_factory_pages_420' );
130
 
131
  $this->setPageMenu();
132
  }
133
 
134
- /**
135
- * Set page menu item
136
- */
137
- public function setPageMenu() {
138
- global $factory_impressive_page_menu;
139
-
140
- $dashicon = ( ! empty( $this->page_menu_dashicon ) ) ? ' ' . $this->page_menu_dashicon : '';
141
- $short_description = ( ! empty( $this->page_menu_short_description ) ) ? ' ' . $this->page_menu_short_description : '';
142
-
143
- if ( is_multisite() && is_network_admin() && ! $this->network ) {
144
- return;
145
- }
146
-
147
- $factory_impressive_page_menu[ $this->getMenuScope() ][ $this->getResultId() ] = [
148
- 'type' => $this->type, // page, options
149
- 'url' => $this->getBaseUrl(),
150
- 'title' => $this->getPageTitle() . ' <span class="dashicons' . $dashicon . '"></span>',
151
- 'short_description' => $short_description,
152
- 'position' => $this->page_menu_position,
153
- 'parent' => $this->page_parent_page
154
- ];
155
- }
156
-
157
- /**
158
- * Get page menu items
159
- *
160
- * @return mixed
161
- */
162
- public function getPageMenu() {
163
- global $factory_impressive_page_menu;
164
-
165
- return $factory_impressive_page_menu[ $this->getMenuScope() ];
166
- }
167
-
168
  /**
169
  * Requests assets (js and css) for the page.
170
  *
171
- * @since 1.0.0
172
  * @return void
173
- * @see FactoryPages420_AdminPage
 
174
  *
175
  */
176
- public function assets( $scripts, $styles ) {
 
177
 
178
- $this->scripts->request( 'jquery' );
179
 
180
- $this->scripts->request( [
181
  'control.checkbox',
182
  'control.dropdown',
183
  'bootstrap.tooltip'
184
- ], 'bootstrap' );
185
 
186
- $this->styles->request( [
187
  'bootstrap.core',
188
  'bootstrap.form-group',
189
  'bootstrap.separator',
190
  'control.dropdown',
191
  'control.checkbox'
192
- ], 'bootstrap' );
193
 
194
- $this->styles->add( FACTORY_PAGES_420_URL . '/templates/assets/css/impressive.page.template.css' );
195
  }
196
 
197
  /**
@@ -199,20 +167,21 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
199
  *
200
  * @return string
201
  */
202
- public function getPluginTitle() {
 
203
  /**
204
  * @since 4.0.8 - добавлен
205
  * @since 4.0.9 - является устаревшим
206
  */
207
- $plugin_title = wbcr_factory_420_apply_filters_deprecated( 'wbcr/factory/imppage/plugin_title', [
208
  $this->plugin->getPluginTitle(),
209
  $this->plugin->getPluginName()
210
- ], '4.0.9', 'wbcr/factory/pages/impressive/plugin_title' );
211
 
212
  /**
213
  * @since 4.0.9 - является устаревшим
214
  */
215
- $plugin_title = apply_filters( 'wbcr/factory/pages/impressive/plugin_title', $plugin_title, $this->plugin->getPluginName() );
216
 
217
  return $plugin_title;
218
  }
@@ -222,24 +191,12 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
222
  *
223
  * @return string
224
  */
225
- public function getPageUrl() {
226
- /**
227
- * @since 4.0.9 - добавлен
228
- */
229
- return apply_filters( 'wbcr/factory/pages/impressive/base_url', $this->getBaseUrl(), $this->plugin->getPluginName(), $this->id );
230
- }
231
-
232
- /**
233
- * Пространство имен для меню плагина
234
- * Можно приклеить меню к другому плагину, просто перезаписав этот метод в дочернем классе
235
- *
236
- * @return string
237
- */
238
- public function getMenuScope() {
239
  /**
240
  * @since 4.0.9 - добавлен
241
  */
242
- return apply_filters( 'wbcr/factory/pages/impressive/menu_scope', $this->plugin->getPluginName(), $this->plugin->getPluginName(), $this->id );
243
  }
244
 
245
  /**
@@ -250,10 +207,11 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
250
  *
251
  * @return mixed|void
252
  */
253
- public function getOption( $option_name, $default = false ) {
254
- _deprecated_function( __METHOD__, '4.0.9', '$this->plugin->getOption()' );
 
255
 
256
- return $this->plugin->getOption( $option_name, $default );
257
  }
258
 
259
  /**
@@ -262,9 +220,10 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
262
  * @sinve 1.0.0
263
  * @return void
264
  */
265
- public function indexAction() {
 
266
  $page_menu = $this->getPageMenu();
267
- if ( 'options' === $page_menu[ $this->getResultId() ]['type'] ) {
268
  $this->showOptions();
269
  } else {
270
  $this->showPage();
@@ -277,34 +236,35 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
277
  * @sinve 4.0.0
278
  * @return void
279
  */
280
- public function flushCacheAndRulesAction() {
281
- check_admin_referer( 'wbcr_factory_' . $this->getResultId() . '_flush_action' );
 
282
 
283
- if ( class_exists( 'WbcrFactoryClearfy212_Helpers' ) ) {
284
- WbcrFactoryClearfy212_Helpers::flushPageCache();
285
  }
286
 
287
  /**
288
  * @since 4.0.1 - является устаревшим
289
  */
290
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_imppage_flush_cache', [
291
  $this->plugin->getPluginName(),
292
  $this->getResultId()
293
- ], '4.0.1', 'wbcr_factory_420_imppage_after_form_save' );
294
 
295
  /**
296
  * @since 4.0.9 - является устаревшим
297
  */
298
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_imppage_after_form_save', [
299
  $this->plugin,
300
  $this
301
- ], '4.0.9', 'wbcr/factory/pages/impressive/after_form_save' );
302
 
303
  /**
304
  * @since 4.0.1 - добавлен
305
  * @since 4.0.9 - изменено название экшена, без привязки к версии фреймворка
306
  */
307
- do_action( 'wbcr/factory/pages/impressive/after_form_save', $this->plugin, $this );
308
 
309
  $this->afterFormSave();
310
 
@@ -314,24 +274,25 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
314
  /**
315
  * @since 4.0.9 - является устаревшим
316
  */
317
- $redirect_args = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_420_imppage_after_form_save_redirect_args', [ $redirect_args ], '4.0.9', 'wbcr/factory/pages/impressive/save_redirect_args' );
318
 
319
  /**
320
  * @since 4.0.1 - добавлен
321
  * @since 4.0.9 - изменено название экшена, без привязки к версии фреймворка
322
  */
323
- $redirect_args = apply_filters( 'wbcr/factory/pages/impressive/save_redirect_args', $redirect_args );
324
 
325
- $this->redirectToAction( 'index', $redirect_args );
326
  }
327
 
328
 
329
  /**
330
  * Вызывается всегда при загрузке страницы, перед опциями формы с типом страницы options
331
  */
332
- protected function warningNotice() {
 
333
  /*if( WP_CACHE ) {
334
- $this->printWarningNotice(__("It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below.", 'wbcr_factory_pages_420'));
335
  }*/
336
  // Метод предназначен для вызова в дочернем классе
337
  }
@@ -339,13 +300,14 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
339
  /**
340
  * Вызывается всегда при загрузке страницы, перед опциями формы с типом страницы options
341
  *
342
- * @since 4.0.0
343
- *
344
  * @param array $notices
345
  *
346
  * @return array
 
 
347
  */
348
- protected function getActionNotices( $notices ) {
 
349
  // Метод предназначен для вызова в дочернем классе
350
  return $notices;
351
  }
@@ -353,42 +315,48 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
353
  /**
354
  * Вызывается перед сохранением опций формы
355
  *
356
- * @since 4.0.0
357
  * @return void
 
358
  */
359
- protected function beforeFormSave() {
 
360
  // Метод предназначен для вызова в дочернем классе
361
  }
362
 
363
  /**
364
  * Вызывается после сохранением опций формы, когда выполнен сброс кеша и совершен редирект
365
  *
366
- * @since 4.0.0
367
  * @return void
 
368
  */
369
- protected function afterFormSave() {
 
370
  // Метод предназначен для вызова в дочернем классе
371
  }
372
 
373
  /**
374
  * Вызывается в процессе выполнения сохранения, но после сохранения всех опций
375
  *
376
- * @since 4.0.0
377
  * @return void
 
378
  */
379
- protected function formSaved() {
 
380
  // Метод предназначен для вызова в дочернем классе
381
  }
382
 
383
- public function printWarningNotice( $message ) {
 
384
  echo '<div class="alert alert-warning wbcr-factory-warning-notice"><p><span class="dashicons dashicons-warning"></span> ' . $message . '</p></div>';
385
  }
386
 
387
- public function printErrorNotice( $message ) {
 
388
  echo '<div class="alert alert-danger wbcr-factory-warning-notice"><p><span class="dashicons dashicons-dismiss"></span> ' . $message . '</p></div>';
389
  }
390
 
391
- public function printSuccessNotice( $message ) {
 
392
  echo '<div class="alert alert-success wbcr-factory-warning-notice"><p><span class="dashicons dashicons-plus"></span> ' . $message . '</p></div>';
393
  }
394
 
@@ -396,252 +364,360 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
396
  * Печатает все зарегистрированные системные уведомления внутри интерфейса плагина
397
  * Типы уведомлений: предупреждения, ошибки, успешные выполнения задач
398
  */
399
- protected function printAllNotices() {
 
400
  $this->warningNotice();
401
  $this->showActionsNotice();
402
 
403
  /**
404
  * @since 4.0.9 - является устаревшим
405
  */
406
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_pages_420_imppage_print_all_notices', [
407
  $this->plugin,
408
  $this
409
- ], '4.0.9', 'wbcr/factory/pages/impressive/print_all_notices' );
410
 
411
  /**
412
  * @since 4.0.1 - добавлен
413
  * @since 4.0.9 - изменено имя
414
  */
415
- do_action( 'wbcr/factory/pages/impressive/print_all_notices', $this->plugin, $this );
416
  }
417
 
418
- private function showActionsNotice() {
 
419
  $notices = [
420
  [
421
  'conditions' => [
422
  $this->plugin->getPluginName() . '_saved' => '1'
423
  ],
424
- 'type' => 'success',
425
- 'message' => __( 'The settings have been updated successfully!', 'wbcr_factory_pages_420' ) . ( WP_CACHE ? '<br>' . __( "It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below.", 'wbcr_factory_pages_420' ) : '' )
426
  ]
427
  ];
428
 
429
  /**
430
  * @since 4.0.9 - является устаревшим
431
  */
432
- $notices = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_pages_420_imppage_actions_notice', [
433
  $notices,
434
  $this->plugin,
435
  $this->id
436
- ], '4.0.9', 'wbcr/factory/pages/impressive/actions_notice' );
437
 
438
  /**
439
  * @since 4.0.1 - добавлен
440
  * @since 4.0.9 - изменено имя
441
  */
442
- $notices = apply_filters( 'wbcr/factory/pages/impressive/actions_notice', $notices, $this->plugin, $this->id );
443
 
444
- $notices = $this->getActionNotices( $notices );
445
 
446
- foreach ( $notices as $key => $notice ) {
447
  $show_message = true;
448
 
449
- if ( isset( $notice['conditions'] ) && ! empty( $notice['conditions'] ) ) {
450
- foreach ( $notice['conditions'] as $condition_name => $value ) {
451
- if ( ! isset( $_REQUEST[ $condition_name ] ) || $_REQUEST[ $condition_name ] != $value ) {
452
  $show_message = false;
453
  }
454
  }
455
  }
456
- if ( ! $show_message ) {
457
  continue;
458
  }
459
 
460
- $notice_type = isset( $notice['type'] ) ? $notice['type'] : 'success';
461
 
462
- switch ( $notice_type ) {
463
  case 'success':
464
- $this->printSuccessNotice( $notice['message'] );
465
  break;
466
  case 'danger':
467
- $this->printErrorNotice( $notice['message'] );
468
  break;
469
  default:
470
- $this->printWarningNotice( $notice['message'] );
471
  break;
472
  }
473
  }
474
  }
475
 
476
- protected function showPageMenu() {
477
- $page_menu = $this->getPageMenu();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
  $self_page_id = $this->getResultId();
479
- $current_page = isset( $page_menu[ $self_page_id ] ) ? $page_menu[ $self_page_id ] : null;
480
 
481
- $parent_page_id = ! empty( $current_page['parent'] ) ? $this->getResultId( $current_page['parent'] ) : null;
 
 
482
 
483
- uasort( $page_menu, [ $this, 'pageMenuSort' ] );
484
  ?>
485
- <ul>
486
- <?php foreach ( $page_menu as $page_screen => $page ): ?>
487
  <?php
488
- if ( ! empty( $page['parent'] ) ) {
489
  continue;
490
  }
491
  $active_tab = '';
492
- if ( $page_screen == $self_page_id || $page_screen == $parent_page_id ) {
493
  $active_tab = ' wbcr-factory-active-tab';
494
  }
495
  ?>
496
- <li class="wbcr-factory-nav-tab<?= $active_tab ?>">
497
- <a href="<?php echo $page['url'] ?>" id="<?= $page_screen ?>-tab" class="wbcr-factory-tab__link">
498
- <div class="wbcr-factory-tab__title">
 
499
  <?php echo $page['title'] ?>
500
- </div>
501
- <?php if ( ! empty( $page['short_description'] ) ): ?>
502
- <div class="wbcr-factory-tab__short-description">
503
  <?php echo $page['short_description'] ?>
504
- </div>
505
  <?php endif; ?>
506
- </a>
507
- </li>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
508
  <?php endforeach; ?>
509
- </ul>
510
  <?php
511
  }
512
 
513
- /**
514
- * @param int $a
515
- * @param int $b
516
- *
517
- * @return bool
518
- */
519
- protected function pageMenuSort( $a, $b ) {
520
- return $a['position'] < $b['position'];
521
- }
522
 
523
- protected function showPageSubMenu() {
 
524
  $self_page_id = $this->getResultId();
525
- $page_menu = $this->getPageMenu();
526
- $current_page = isset( $page_menu[ $self_page_id ] ) ? $page_menu[ $self_page_id ] : null;
527
 
528
  $page_submenu = [];
529
- foreach ( $page_menu as $page_screen => $page ) {
530
- if ( ! empty( $page['parent'] ) ) {
531
- $page_parent_id = $this->getResultId( $page['parent'] );
532
 
533
- if ( isset( $page_menu[ $page_parent_id ] ) ) {
534
- $page['title'] = strip_tags( $page['title'] );
535
- $page_submenu[ $page_parent_id ][ $page_screen ] = $page;
536
  }
537
  }
538
  }
539
 
540
- if ( empty( $page_submenu ) ) {
541
  return;
542
  }
543
 
544
- $get_menu_id = null;
545
- $has_parent = ! empty( $current_page ) && ! empty( $current_page['parent'] );
546
- $parent_page_id = $has_parent ? $this->getResultId( $current_page['parent'] ) : null;
547
 
548
- if ( ( $has_parent && isset( $page_submenu[ $parent_page_id ] ) ) ) {
549
  $get_menu_id = $parent_page_id;
550
- } else if ( ! $has_parent && isset( $page_submenu[ $self_page_id ] ) ) {
551
  $get_menu_id = $self_page_id;
552
  }
553
 
554
- if ( ! isset( $page_submenu[ $get_menu_id ] ) ) {
555
  return;
556
  }
557
 
558
  $unshift = [];
559
- if ( isset( $page_menu[ $get_menu_id ] ) ) {
560
- $page_menu[ $get_menu_id ]['title'] = strip_tags( $page_menu[ $get_menu_id ]['title'] );
561
 
562
- $unshift[ $get_menu_id ][ $get_menu_id ] = $page_menu[ $get_menu_id ];
563
- $page_submenu[ $get_menu_id ] = $unshift[ $get_menu_id ] + $page_submenu[ $get_menu_id ];
564
  }
565
 
566
  ?>
567
- <h2 class="nav-tab-wrapper wp-clearfix">
568
- <?php foreach ( (array) $page_submenu[ $get_menu_id ] as $page_screen => $page ): ?>
569
  <?php
570
  $active_tab = '';
571
- if ( $page_screen == $this->getResultId() ) {
572
  $active_tab = ' nav-tab-active';
573
  }
574
  ?>
575
- <a href="<?php echo $page['url'] ?>" id="<?= esc_attr( $page_screen ) ?>-tab" class="nav-tab<?= esc_attr( $active_tab ) ?>">
 
576
  <?php echo $page['title'] ?>
577
- </a>
578
  <?php endforeach; ?>
579
- </h2>
580
  <?php
581
  }
582
 
583
- protected function showHeader() {
 
584
  ?>
585
- <style>
586
- .updated, .notice, .error {
587
- display: none !important;
588
- }
589
- </style>
590
- <div class="wbcr-factory-page-header">
591
- <div class="wbcr-factory-header-logo"><?= $this->getPluginTitle(); ?>
592
- <span class="version"><?= $this->plugin->getPluginVersion() ?> </span>
593
- <?php if ( $this->show_page_title ): ?><span class="dash">—</span><?php endif; ?>
594
- </div>
595
- <?php if ( $this->show_page_title ): ?>
596
- <div class="wbcr-factory-header-title">
597
- <h2><?php _e( 'Page' ) ?>: <?= $this->getPageTitle() ?></h2>
598
- </div>
599
  <?php endif; ?>
600
- <div class="wbcr-factory-control">
601
- <?php do_action( 'wbcr/factory/pages/impressive/header', $this->plugin->getPluginName() ) ?>
602
-
603
- <?php if ( $this->type == 'options' ): ?>
604
- <input name="<?= $this->plugin->getPluginName() ?>_save_action" class="wbcr-factory-button wbcr-factory-type-save" type="submit" value="<?php _e( 'Save', 'wbcr_factory_pages_420' ); ?>">
605
- <?php wp_nonce_field( 'wbcr_factory_' . $this->getResultId() . '_save_action' ); ?>
 
 
606
  <?php endif; ?>
607
- </div>
608
- </div>
609
  <?php
610
  }
611
 
612
- protected function isShowRightSidebar() {
613
- $widgets = $this->getPageWidgets( 'right' );
 
614
 
615
- return ! empty( $widgets ) && $this->show_right_sidebar_in_options;
616
  }
617
 
618
- protected function showRightSidebar() {
619
- $widgets = $this->getPageWidgets( 'right' );
 
620
 
621
- if ( empty( $widgets ) ) {
622
  return;
623
  }
624
 
625
- foreach ( $widgets as $widget_content ):
626
  echo $widget_content;
627
  endforeach;
628
  }
629
 
630
- protected function showBottomSidebar() {
631
- $widgets = $this->getPageWidgets( 'bottom' );
 
632
 
633
- if ( empty( $widgets ) ) {
634
  return;
635
  }
636
  ?>
637
- <div class="row">
638
- <div class="wbcr-factory-top-sidebar">
639
- <?php foreach ( $widgets as $widget_content ): ?>
640
- <div class="col-sm-4">
641
  <?= $widget_content ?>
642
- </div>
643
  <?php endforeach; ?>
644
- </div>
645
  <?php
646
  }
647
 
@@ -650,53 +726,55 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
650
  *
651
  * @return mixed|void
652
  */
653
- protected function getPageWidgets( $position = 'bottom' ) {
 
654
  $widgets = [];
655
 
656
  /**
657
  * @since 4.0.9 - является устаревшим
658
  */
659
- $widgets = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_pages_420_imppage_get_widgets', [
660
  $widgets,
661
  $position,
662
  $this->plugin,
663
  $this
664
- ], '4.0.9', 'wbcr/factory/pages/impressive/widgets' );
665
 
666
  /**
667
  * @since 4.0.1 - добавлен
668
  * @since 4.0.9 - изменено имя
669
  */
670
- $widgets = apply_filters( 'wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this );
671
 
672
  return $widgets;
673
  }
674
 
675
- protected function showOptions() {
676
- $form = new Wbcr_FactoryForms418_Form( [
677
- 'scope' => rtrim( $this->plugin->getPrefix(), '_' ),
678
- 'name' => $this->getResultId() . "-options"
679
- ], $this->plugin );
 
680
 
681
- $form->setProvider( new Wbcr_FactoryForms418_OptionsValueProvider( $this->plugin ) );
682
 
683
  $options = $this->getPageOptions();
684
 
685
- if ( isset( $options[0] ) && isset( $options[0]['items'] ) && is_array( $options[0]['items'] ) ) {
686
- foreach ( $options[0]['items'] as $key => $value ) {
687
 
688
- if ( $value['type'] == 'div' ) {
689
- if ( isset( $options[0]['items'][ $key ]['items'] ) && ! empty( $options[0]['items'][ $key ]['items'] ) ) {
690
- foreach ( $options[0]['items'][ $key ]['items'] as $group_key => $group_value ) {
691
- $options[0]['items'][ $key ]['items'][ $group_key ]['layout']['column-left'] = '4';
692
- $options[0]['items'][ $key ]['items'][ $group_key ]['layout']['column-right'] = '8';
693
  }
694
 
695
  continue;
696
  }
697
  }
698
 
699
- if ( in_array( $value['type'], [
700
  'checkbox',
701
  'textarea',
702
  'integer',
@@ -704,38 +782,38 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
704
  'dropdown',
705
  'list',
706
  'wp-editor'
707
- ] ) ) {
708
- $options[0]['items'][ $key ]['layout']['column-left'] = '4';
709
- $options[0]['items'][ $key ]['layout']['column-right'] = '8';
710
  }
711
  }
712
  }
713
 
714
- $form->add( $options );
715
 
716
- if ( isset( $_POST[ $this->plugin->getPluginName() . '_save_action' ] ) ) {
717
 
718
- check_admin_referer( 'wbcr_factory_' . $this->getResultId() . '_save_action' );
719
 
720
- if ( ! current_user_can( 'administrator' ) && ! current_user_can( $this->capabilitiy ) ) {
721
- wp_die( __( 'You do not have permission to edit page.', 'wbcr_factory_pages_420' ) );
722
  exit;
723
  }
724
 
725
  /**
726
  * @since 4.0.9 - является устаревшим
727
  */
728
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_imppage_before_form_save', [
729
  $form,
730
  $this->plugin,
731
  $this
732
- ], '4.0.9', 'wbcr/factory/pages/impressive/before_form_save' );
733
 
734
  /**
735
  * @since 4.0.1 - добавлен
736
  * @since 4.0.9 - изменено имя
737
  */
738
- do_action( 'wbcr/factory/pages/impressive/before_form_save', $form, $this->plugin, $this );
739
 
740
  $this->beforeFormSave();
741
 
@@ -744,123 +822,128 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
744
  /**
745
  * @since 4.0.9 - является устаревшим
746
  */
747
- wbcr_factory_420_do_action_deprecated( 'wbcr_factory_420_imppage_form_saved', [
748
  $form,
749
  $this->plugin,
750
  $this
751
- ], '4.0.9', 'wbcr/factory/pages/impressive/form_saved' );
752
 
753
  /**
754
  * @since 4.0.1 - добавлен
755
  * @since 4.0.9 - изменено имя
756
  */
757
- do_action( 'wbcr/factory/pages/impressive/form_saved', $form, $this->plugin, $this );
758
 
759
  $this->formSaved();
760
 
761
- $this->redirectToAction( 'flush-cache-and-rules', [
762
- '_wpnonce' => wp_create_nonce( 'wbcr_factory_' . $this->getResultId() . '_flush_action' )
763
- ] );
764
  }
765
 
766
  ?>
767
- <div id="WBCR" class="wrap">
768
- <div class="wbcr-factory-pages-420-impressive-page-template factory-bootstrap-421 factory-fontawesome-000">
769
- <div class="wbcr-factory-options wbcr-factory-options-<?= esc_attr( $this->id ) ?>">
770
- <div class="wbcr-factory-left-navigation-bar">
771
  <?php $this->showPageMenu() ?>
772
- </div>
773
  <?php
774
  $min_height = 0;
775
- foreach ( $this->getPageMenu() as $page ) {
776
- if ( ! isset( $page['parent'] ) || empty( $page['parent'] ) ) {
777
  $min_height += 77;
778
  }
779
  }
780
  ?>
781
- <div class="wbcr-factory-page-inner-wrap">
782
- <div class="wbcr-factory-content-section<?php if ( ! $this->isShowRightSidebar() ): echo ' wbcr-fullwidth'; endif ?>">
783
- <?php $this->showPageSubMenu() ?>
784
- <div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
785
- <form method="post" class="form-horizontal">
 
786
  <?php $this->showHeader(); ?>
787
  <?php $this->printAllNotices(); ?>
788
  <?php $form->html(); ?>
789
- </form>
790
- </div>
791
- </div>
792
- <?php if ( $this->isShowRightSidebar() ): ?>
793
- <div class="wbcr-factory-right-sidebar-section">
794
  <?php $this->showRightSidebar(); ?>
795
- </div>
796
  <?php endif; ?>
797
- </div>
798
- </div>
799
  <?php
800
- if ( $this->show_bottom_sidebar ) {
801
  $this->showBottomSidebar();
802
  }
803
  ?>
804
- <div class="clearfix"></div>
805
- </div>
806
- </div>
807
- </div>
808
  <?php
809
  }
810
 
811
- protected function showPage( $content = null ) { ?>
812
- <div id="WBCR" class="wrap">
813
- <div class="wbcr-factory-pages-420-impressive-page-template factory-bootstrap-421 factory-fontawesome-000">
814
- <div class="wbcr-factory-page wbcr-factory-page-<?= $this->id ?>">
 
815
  <?php $this->showHeader(); ?>
816
- <div class="wbcr-factory-left-navigation-bar">
817
  <?php $this->showPageMenu() ?>
818
- </div>
819
  <?php
820
  $min_height = 0;
821
- foreach ( $this->getPageMenu() as $page ) {
822
- if ( ! isset( $page['parent'] ) || empty( $page['parent'] ) ) {
823
  $min_height += 77;
824
  }
825
  }
826
  ?>
827
- <div class="wbcr-factory-page-inner-wrap">
828
- <div class="wbcr-factory-content-section<?php if ( ! $this->isShowRightSidebar() ): echo ' wbcr-fullwidth'; endif ?>">
829
- <?php $this->showPageSubMenu() ?>
830
- <div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
 
831
  <?php $this->printAllNotices(); ?>
832
- <?php if ( empty( $content ) ): ?>
833
  <?php $this->showPageContent() ?>
834
  <?php else: ?>
835
  <?php echo $content; ?>
836
  <?php endif; ?>
837
- </div>
838
- </div>
839
- <?php if ( $this->isShowRightSidebar() ): ?>
840
- <div class="wbcr-factory-right-sidebar-section" style="min-height:<?= $min_height ?>px">
841
  <?php $this->showRightSidebar(); ?>
842
- </div>
843
  <?php endif; ?>
844
- </div>
845
- </div>
846
- <div class="clearfix"></div>
847
  <?php $this->showBottomSidebar(); ?>
848
- </div>
849
- </div>
850
  <?php
851
  }
852
 
853
  /**
854
  * @return array
855
  */
856
- public function getPageOptions() {
 
857
  // используется в классе потомке
858
  }
859
 
860
  /**
861
  * @return void
862
  */
863
- public function showPageContent() {
 
864
  // используется в классе потомке
865
  }
866
 
@@ -870,26 +953,27 @@ if ( ! class_exists( 'Wbcr_FactoryPages420_ImpressiveThemplate' ) ) {
870
  * @sinve 1.0.0
871
  * @return void
872
  */
873
- public function confirmPageTemplate( $data ) {
 
874
  ?>
875
- <div id="WBCR" class="wrap">
876
- <div class="wbcr-factory-pages-420-impressive-page-template factory-bootstrap-421 factory-fontawesome-000">
877
- <div id="wbcr-factory-confirm-dialog">
878
- <h2><?php echo $data['title'] ?></h2>
879
- <p class="wbcr-factory-confirm-description"><?php echo $data['description'] ?></p>
880
- <?php if ( isset( $data['hint'] ) ): ?>
881
- <p class="wbcr-factory-confirm-hint"><?php echo $data['hint'] ?></p>
882
  <?php endif; ?>
883
- <div class='wbcr-factory-confirm-actions'>
884
- <?php foreach ( $data['actions'] as $action ) { ?>
885
- <a href='<?php echo $action['url'] ?>' class='<?php echo $action['class'] ?>'>
886
  <?php echo $action['title'] ?>
887
- </a>
888
  <?php } ?>
889
- </div>
890
- </div>
891
- </div>
892
- </div>
893
  <?php
894
  }
895
  }
10
  */
11
 
12
  // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryPages429_ImpressiveThemplate') ) {
18
  /**
19
+ * Class Wbcr_FactoryPages429_ImpressiveThemplate
20
  */
21
+ abstract class Wbcr_FactoryPages429_ImpressiveThemplate extends Wbcr_FactoryPages429_AdminPage {
22
 
23
  /**
24
  * Тип страницы:
112
  public $page_menu = [];
113
 
114
  /**
115
+ * @param Wbcr_Factory429_Plugin $plugin
116
  */
117
+ public function __construct(Wbcr_Factory429_Plugin $plugin)
118
+ {
119
+ $this->menuIcon = FACTORY_PAGES_429_URL . '/templates/assets/img/webcraftic-plugin-icon.png';
120
+ //$allow_multisite = apply_filters('wbcr_factory_429_core_admin_allow_multisite', false);
121
 
122
+ if( is_multisite() && $this->available_for_multisite && $plugin->isNetworkActive() ) {
123
+ $this->network = true;
124
  $this->menu_target = 'settings.php';
125
  $this->capabilitiy = 'manage_network';
126
  }
127
 
128
+ parent::__construct($plugin);
129
 
130
+ $this->title_plugin_action_link = __('Settings', 'wbcr_factory_pages_429');
131
 
132
  $this->setPageMenu();
133
  }
134
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  /**
136
  * Requests assets (js and css) for the page.
137
  *
 
138
  * @return void
139
+ * @since 1.0.0
140
+ * @see FactoryPages429_AdminPage
141
  *
142
  */
143
+ public function assets($scripts, $styles)
144
+ {
145
 
146
+ $this->scripts->request('jquery');
147
 
148
+ $this->scripts->request([
149
  'control.checkbox',
150
  'control.dropdown',
151
  'bootstrap.tooltip'
152
+ ], 'bootstrap');
153
 
154
+ $this->styles->request([
155
  'bootstrap.core',
156
  'bootstrap.form-group',
157
  'bootstrap.separator',
158
  'control.dropdown',
159
  'control.checkbox'
160
+ ], 'bootstrap');
161
 
162
+ $this->styles->add(FACTORY_PAGES_429_URL . '/templates/assets/css/impressive.page.template.css');
163
  }
164
 
165
  /**
167
  *
168
  * @return string
169
  */
170
+ public function getPluginTitle()
171
+ {
172
  /**
173
  * @since 4.0.8 - добавлен
174
  * @since 4.0.9 - является устаревшим
175
  */
176
+ $plugin_title = wbcr_factory_429_apply_filters_deprecated('wbcr/factory/imppage/plugin_title', [
177
  $this->plugin->getPluginTitle(),
178
  $this->plugin->getPluginName()
179
+ ], '4.0.9', 'wbcr/factory/pages/impressive/plugin_title');
180
 
181
  /**
182
  * @since 4.0.9 - является устаревшим
183
  */
184
+ $plugin_title = apply_filters('wbcr/factory/pages/impressive/plugin_title', $plugin_title, $this->plugin->getPluginName());
185
 
186
  return $plugin_title;
187
  }
191
  *
192
  * @return string
193
  */
194
+ public function getPageUrl()
195
+ {
 
 
 
 
 
 
 
 
 
 
 
 
196
  /**
197
  * @since 4.0.9 - добавлен
198
  */
199
+ return apply_filters('wbcr/factory/pages/impressive/base_url', $this->getBaseUrl(), $this->plugin->getPluginName(), $this->id);
200
  }
201
 
202
  /**
207
  *
208
  * @return mixed|void
209
  */
210
+ public function getOption($option_name, $default = false)
211
+ {
212
+ _deprecated_function(__METHOD__, '4.0.9', '$this->plugin->getOption()');
213
 
214
+ return $this->plugin->getOption($option_name, $default);
215
  }
216
 
217
  /**
220
  * @sinve 1.0.0
221
  * @return void
222
  */
223
+ public function indexAction()
224
+ {
225
  $page_menu = $this->getPageMenu();
226
+ if( 'options' === $page_menu[$this->getResultId()]['type'] ) {
227
  $this->showOptions();
228
  } else {
229
  $this->showPage();
236
  * @sinve 4.0.0
237
  * @return void
238
  */
239
+ public function flushCacheAndRulesAction()
240
+ {
241
+ check_admin_referer('wbcr_factory_' . $this->getResultId() . '_flush_action');
242
 
243
+ if( class_exists('WbcrFactoryClearfy221_Helpers') ) {
244
+ WbcrFactoryClearfy221_Helpers::flushPageCache();
245
  }
246
 
247
  /**
248
  * @since 4.0.1 - является устаревшим
249
  */
250
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_imppage_flush_cache', [
251
  $this->plugin->getPluginName(),
252
  $this->getResultId()
253
+ ], '4.0.1', 'wbcr_factory_429_imppage_after_form_save');
254
 
255
  /**
256
  * @since 4.0.9 - является устаревшим
257
  */
258
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_imppage_after_form_save', [
259
  $this->plugin,
260
  $this
261
+ ], '4.0.9', 'wbcr/factory/pages/impressive/after_form_save');
262
 
263
  /**
264
  * @since 4.0.1 - добавлен
265
  * @since 4.0.9 - изменено название экшена, без привязки к версии фреймворка
266
  */
267
+ do_action('wbcr/factory/pages/impressive/after_form_save', $this->plugin, $this);
268
 
269
  $this->afterFormSave();
270
 
274
  /**
275
  * @since 4.0.9 - является устаревшим
276
  */
277
+ $redirect_args = wbcr_factory_429_apply_filters_deprecated('wbcr_factory_429_imppage_after_form_save_redirect_args', [$redirect_args], '4.0.9', 'wbcr/factory/pages/impressive/save_redirect_args');
278
 
279
  /**
280
  * @since 4.0.1 - добавлен
281
  * @since 4.0.9 - изменено название экшена, без привязки к версии фреймворка
282
  */
283
+ $redirect_args = apply_filters('wbcr/factory/pages/impressive/save_redirect_args', $redirect_args);
284
 
285
+ $this->redirectToAction('index', $redirect_args);
286
  }
287
 
288
 
289
  /**
290
  * Вызывается всегда при загрузке страницы, перед опциями формы с типом страницы options
291
  */
292
+ protected function warningNotice()
293
+ {
294
  /*if( WP_CACHE ) {
295
+ $this->printWarningNotice(__("It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below.", 'wbcr_factory_pages_429'));
296
  }*/
297
  // Метод предназначен для вызова в дочернем классе
298
  }
300
  /**
301
  * Вызывается всегда при загрузке страницы, перед опциями формы с типом страницы options
302
  *
 
 
303
  * @param array $notices
304
  *
305
  * @return array
306
+ * @since 4.0.0
307
+ *
308
  */
309
+ protected function getActionNotices($notices)
310
+ {
311
  // Метод предназначен для вызова в дочернем классе
312
  return $notices;
313
  }
315
  /**
316
  * Вызывается перед сохранением опций формы
317
  *
 
318
  * @return void
319
+ * @since 4.0.0
320
  */
321
+ protected function beforeFormSave()
322
+ {
323
  // Метод предназначен для вызова в дочернем классе
324
  }
325
 
326
  /**
327
  * Вызывается после сохранением опций формы, когда выполнен сброс кеша и совершен редирект
328
  *
 
329
  * @return void
330
+ * @since 4.0.0
331
  */
332
+ protected function afterFormSave()
333
+ {
334
  // Метод предназначен для вызова в дочернем классе
335
  }
336
 
337
  /**
338
  * Вызывается в процессе выполнения сохранения, но после сохранения всех опций
339
  *
 
340
  * @return void
341
+ * @since 4.0.0
342
  */
343
+ protected function formSaved()
344
+ {
345
  // Метод предназначен для вызова в дочернем классе
346
  }
347
 
348
+ public function printWarningNotice($message)
349
+ {
350
  echo '<div class="alert alert-warning wbcr-factory-warning-notice"><p><span class="dashicons dashicons-warning"></span> ' . $message . '</p></div>';
351
  }
352
 
353
+ public function printErrorNotice($message)
354
+ {
355
  echo '<div class="alert alert-danger wbcr-factory-warning-notice"><p><span class="dashicons dashicons-dismiss"></span> ' . $message . '</p></div>';
356
  }
357
 
358
+ public function printSuccessNotice($message)
359
+ {
360
  echo '<div class="alert alert-success wbcr-factory-warning-notice"><p><span class="dashicons dashicons-plus"></span> ' . $message . '</p></div>';
361
  }
362
 
364
  * Печатает все зарегистрированные системные уведомления внутри интерфейса плагина
365
  * Типы уведомлений: предупреждения, ошибки, успешные выполнения задач
366
  */
367
+ protected function printAllNotices()
368
+ {
369
  $this->warningNotice();
370
  $this->showActionsNotice();
371
 
372
  /**
373
  * @since 4.0.9 - является устаревшим
374
  */
375
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_pages_429_imppage_print_all_notices', [
376
  $this->plugin,
377
  $this
378
+ ], '4.0.9', 'wbcr/factory/pages/impressive/print_all_notices');
379
 
380
  /**
381
  * @since 4.0.1 - добавлен
382
  * @since 4.0.9 - изменено имя
383
  */
384
+ do_action('wbcr/factory/pages/impressive/print_all_notices', $this->plugin, $this);
385
  }
386
 
387
+ private function showActionsNotice()
388
+ {
389
  $notices = [
390
  [
391
  'conditions' => [
392
  $this->plugin->getPluginName() . '_saved' => '1'
393
  ],
394
+ 'type' => 'success',
395
+ 'message' => __('The settings have been updated successfully!', 'wbcr_factory_pages_429') . (WP_CACHE ? '<br>' . __("It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below.", 'wbcr_factory_pages_429') : '')
396
  ]
397
  ];
398
 
399
  /**
400
  * @since 4.0.9 - является устаревшим
401
  */
402
+ $notices = wbcr_factory_429_apply_filters_deprecated('wbcr_factory_pages_429_imppage_actions_notice', [
403
  $notices,
404
  $this->plugin,
405
  $this->id
406
+ ], '4.0.9', 'wbcr/factory/pages/impressive/actions_notice');
407
 
408
  /**
409
  * @since 4.0.1 - добавлен
410
  * @since 4.0.9 - изменено имя
411
  */
412
+ $notices = apply_filters('wbcr/factory/pages/impressive/actions_notice', $notices, $this->plugin, $this->id);
413
 
414
+ $notices = $this->getActionNotices($notices);
415
 
416
+ foreach($notices as $key => $notice) {
417
  $show_message = true;
418
 
419
+ if( isset($notice['conditions']) && !empty($notice['conditions']) ) {
420
+ foreach($notice['conditions'] as $condition_name => $value) {
421
+ if( !isset($_REQUEST[$condition_name]) || $_REQUEST[$condition_name] != $value ) {
422
  $show_message = false;
423
  }
424
  }
425
  }
426
+ if( !$show_message ) {
427
  continue;
428
  }
429
 
430
+ $notice_type = isset($notice['type']) ? $notice['type'] : 'success';
431
 
432
+ switch( $notice_type ) {
433
  case 'success':
434
+ $this->printSuccessNotice($notice['message']);
435
  break;
436
  case 'danger':
437
+ $this->printErrorNotice($notice['message']);
438
  break;
439
  default:
440
+ $this->printWarningNotice($notice['message']);
441
  break;
442
  }
443
  }
444
  }
445
 
446
+ /**
447
+ * Set page menu item
448
+ */
449
+ public function setPageMenu()
450
+ {
451
+ global $factory_impressive_page_menu;
452
+
453
+ $dashicon = (!empty($this->page_menu_dashicon)) ? ' ' . $this->page_menu_dashicon : '';
454
+ $short_description = (!empty($this->page_menu_short_description)) ? ' ' . $this->page_menu_short_description : '';
455
+
456
+ if( is_multisite() && is_network_admin() && !$this->network ) {
457
+ return;
458
+ }
459
+
460
+ $factory_impressive_page_menu[$this->getMenuScope()][$this->getResultId()] = [
461
+ 'type' => $this->type, // page, options
462
+ 'url' => $this->getBaseUrl(),
463
+ 'title' => $this->getPageTitle() . ' <span class="dashicons' . $dashicon . '"></span>',
464
+ 'short_description' => $short_description,
465
+ 'position' => $this->page_menu_position,
466
+ 'parent' => $this->page_parent_page
467
+ ];
468
+ }
469
+
470
+ /**
471
+ * Пространство имен для меню плагина
472
+ * Можно приклеить меню к другому плагину, просто перезаписав этот метод в дочернем классе
473
+ *
474
+ * @return string
475
+ */
476
+ public function getMenuScope()
477
+ {
478
+ /**
479
+ * @since 4.0.9 - добавлен
480
+ */
481
+ return apply_filters('wbcr/factory/pages/impressive/menu_scope', $this->plugin->getPluginName(), $this->plugin->getPluginName(), $this->id);
482
+ }
483
+
484
+ /**
485
+ * Get page menu items
486
+ *
487
+ * @return mixed
488
+ */
489
+ protected function getPageMenu()
490
+ {
491
+ global $factory_impressive_page_menu;
492
+
493
+ return $factory_impressive_page_menu[$this->getMenuScope()];
494
+ }
495
+
496
+ protected function getPageSubMenu($current_page = null)
497
+ {
498
+ $page_menu = $this->getPageMenu();
499
+
500
+ $page_submenu = [];
501
+ foreach($page_menu as $page_screen => $page) {
502
+ if( !empty($page['parent']) ) {
503
+ $page_parent_id = $this->getResultId($page['parent']);
504
+
505
+ if( isset($page_menu[$page_parent_id]) ) {
506
+ $page['title'] = strip_tags($page['title']);
507
+ $page_submenu[$page_parent_id][$page_screen] = $page;
508
+ }
509
+ }
510
+ }
511
+
512
+ return isset($page_submenu[$current_page]) ? $page_submenu[$current_page] : null;
513
+ }
514
+
515
+ /**
516
+ * @param int $a
517
+ * @param int $b
518
+ *
519
+ * @return bool
520
+ */
521
+ protected function pageMenuSort($a, $b)
522
+ {
523
+ return $a['position'] < $b['position'];
524
+ }
525
+
526
+ protected function showPageMenu()
527
+ {
528
+ $page_menu = $this->getPageMenu();
529
  $self_page_id = $this->getResultId();
530
+ $current_page = isset($page_menu[$self_page_id]) ? $page_menu[$self_page_id] : null;
531
 
532
+ $parent_page_id = !empty($current_page['parent']) ? $this->getResultId($current_page['parent']) : null;
533
+
534
+ uasort($page_menu, [$this, 'pageMenuSort']);
535
 
 
536
  ?>
537
+ <ul>
538
+ <?php foreach($page_menu as $page_screen => $page): ?>
539
  <?php
540
+ if( !empty($page['parent']) ) {
541
  continue;
542
  }
543
  $active_tab = '';
544
+ if( $page_screen == $self_page_id || $page_screen == $parent_page_id ) {
545
  $active_tab = ' wbcr-factory-active-tab';
546
  }
547
  ?>
548
+ <li class="wbcr-factory-nav-tab<?php echo esc_attr($active_tab) ?>">
549
+ <a href="<?php echo $page['url'] ?>" id="<?php echo esc_attr($page_screen) ?>-tab"
550
+ class="wbcr-factory-tab__link">
551
+ <div class="wbcr-factory-tab__title">
552
  <?php echo $page['title'] ?>
553
+ </div>
554
+ <?php if( !empty($page['short_description']) ): ?>
555
+ <div class="wbcr-factory-tab__short-description">
556
  <?php echo $page['short_description'] ?>
557
+ </div>
558
  <?php endif; ?>
559
+ </a>
560
+
561
+ <?php
562
+ $sub_menu = $this->getPageSubMenu($page_screen);
563
+ if( !empty($sub_menu) && $page_screen == $self_page_id || $page_screen == $parent_page_id ):
564
+ ?>
565
+ <ul class="wbcr-factory-submenu">
566
+ <?php foreach($sub_menu as $s_menu_page_screen => $s_menu_page): ?>
567
+ <?php
568
+ $active_tab = '';
569
+ if( $s_menu_page_screen == $this->getResultId() ) {
570
+ $active_tab = 'wbcr-factory-tab-active';
571
+ }
572
+ ?>
573
+ <li>
574
+ <a href="<?php echo $s_menu_page['url'] ?>" id="<?= esc_attr($s_menu_page_screen) ?>-tab"
575
+ class="<?= esc_attr($active_tab) ?>">
576
+ <span class="dashicons dashicons-editor-break"></span><?php echo $s_menu_page['title'] ?>
577
+ </a>
578
+ </li>
579
+ <?php endforeach; ?>
580
+ </ul>
581
+ <?php endif; ?>
582
+ </li>
583
+
584
+
585
  <?php endforeach; ?>
586
+ </ul>
587
  <?php
588
  }
589
 
 
 
 
 
 
 
 
 
 
590
 
591
+ protected function showPageSubMenu()
592
+ {
593
  $self_page_id = $this->getResultId();
594
+ $page_menu = $this->getPageMenu();
595
+ $current_page = isset($page_menu[$self_page_id]) ? $page_menu[$self_page_id] : null;
596
 
597
  $page_submenu = [];
598
+ foreach($page_menu as $page_screen => $page) {
599
+ if( !empty($page['parent']) ) {
600
+ $page_parent_id = $this->getResultId($page['parent']);
601
 
602
+ if( isset($page_menu[$page_parent_id]) ) {
603
+ $page['title'] = strip_tags($page['title']);
604
+ $page_submenu[$page_parent_id][$page_screen] = $page;
605
  }
606
  }
607
  }
608
 
609
+ if( empty($page_submenu) ) {
610
  return;
611
  }
612
 
613
+ $get_menu_id = null;
614
+ $has_parent = !empty($current_page) && !empty($current_page['parent']);
615
+ $parent_page_id = $has_parent ? $this->getResultId($current_page['parent']) : null;
616
 
617
+ if( ($has_parent && isset($page_submenu[$parent_page_id])) ) {
618
  $get_menu_id = $parent_page_id;
619
+ } else if( !$has_parent && isset($page_submenu[$self_page_id]) ) {
620
  $get_menu_id = $self_page_id;
621
  }
622
 
623
+ if( !isset($page_submenu[$get_menu_id]) ) {
624
  return;
625
  }
626
 
627
  $unshift = [];
628
+ if( isset($page_menu[$get_menu_id]) ) {
629
+ $page_menu[$get_menu_id]['title'] = strip_tags($page_menu[$get_menu_id]['title']);
630
 
631
+ $unshift[$get_menu_id][$get_menu_id] = $page_menu[$get_menu_id];
632
+ $page_submenu[$get_menu_id] = $unshift[$get_menu_id] + $page_submenu[$get_menu_id];
633
  }
634
 
635
  ?>
636
+ <h2 class="nav-tab-wrapper wp-clearfix">
637
+ <?php foreach((array)$page_submenu[$get_menu_id] as $page_screen => $page): ?>
638
  <?php
639
  $active_tab = '';
640
+ if( $page_screen == $this->getResultId() ) {
641
  $active_tab = ' nav-tab-active';
642
  }
643
  ?>
644
+ <a href="<?php echo $page['url'] ?>" id="<?= esc_attr($page_screen) ?>-tab"
645
+ class="nav-tab<?= esc_attr($active_tab) ?>">
646
  <?php echo $page['title'] ?>
647
+ </a>
648
  <?php endforeach; ?>
649
+ </h2>
650
  <?php
651
  }
652
 
653
+ protected function showHeader()
654
+ {
655
  ?>
656
+ <style>
657
+ .updated, .notice, .error {
658
+ display: none !important;
659
+ }
660
+ </style>
661
+ <div class="wbcr-factory-page-header">
662
+ <div class="wbcr-factory-header-logo"><?= $this->getPluginTitle(); ?>
663
+ <span class="version"><?= $this->plugin->getPluginVersion() ?> </span>
664
+ <?php if( $this->show_page_title ): ?><span class="dash">—</span><?php endif; ?>
665
+ </div>
666
+ <?php if( $this->show_page_title ): ?>
667
+ <div class="wbcr-factory-header-title">
668
+ <h2><?php _e('Page') ?>: <?= $this->getPageTitle() ?></h2>
669
+ </div>
670
  <?php endif; ?>
671
+ <div class="wbcr-factory-control">
672
+ <?php do_action('wbcr/factory/pages/impressive/header', $this->plugin->getPluginName()) ?>
673
+
674
+ <?php if( $this->type == 'options' ): ?>
675
+ <input name="<?= $this->plugin->getPluginName() ?>_save_action"
676
+ class="wbcr-factory-button wbcr-factory-type-save" type="submit"
677
+ value="<?php _e('Save', 'wbcr_factory_pages_429'); ?>">
678
+ <?php wp_nonce_field('wbcr_factory_' . $this->getResultId() . '_save_action'); ?>
679
  <?php endif; ?>
680
+ </div>
681
+ </div>
682
  <?php
683
  }
684
 
685
+ protected function isShowRightSidebar()
686
+ {
687
+ $widgets = $this->getPageWidgets('right');
688
 
689
+ return !empty($widgets) && $this->show_right_sidebar_in_options;
690
  }
691
 
692
+ protected function showRightSidebar()
693
+ {
694
+ $widgets = $this->getPageWidgets('right');
695
 
696
+ if( empty($widgets) ) {
697
  return;
698
  }
699
 
700
+ foreach($widgets as $widget_content):
701
  echo $widget_content;
702
  endforeach;
703
  }
704
 
705
+ protected function showBottomSidebar()
706
+ {
707
+ $widgets = $this->getPageWidgets('bottom');
708
 
709
+ if( empty($widgets) ) {
710
  return;
711
  }
712
  ?>
713
+ <div class="row">
714
+ <div class="wbcr-factory-top-sidebar">
715
+ <?php foreach($widgets as $widget_content): ?>
716
+ <div class="col-sm-4">
717
  <?= $widget_content ?>
718
+ </div>
719
  <?php endforeach; ?>
720
+ </div>
721
  <?php
722
  }
723
 
726
  *
727
  * @return mixed|void
728
  */
729
+ protected function getPageWidgets($position = 'bottom')
730
+ {
731
  $widgets = [];
732
 
733
  /**
734
  * @since 4.0.9 - является устаревшим
735
  */
736
+ $widgets = wbcr_factory_429_apply_filters_deprecated('wbcr_factory_pages_429_imppage_get_widgets', [
737
  $widgets,
738
  $position,
739
  $this->plugin,
740
  $this
741
+ ], '4.0.9', 'wbcr/factory/pages/impressive/widgets');
742
 
743
  /**
744
  * @since 4.0.1 - добавлен
745
  * @since 4.0.9 - изменено имя
746
  */
747
+ $widgets = apply_filters('wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this);
748
 
749
  return $widgets;
750
  }
751
 
752
+ protected function showOptions()
753
+ {
754
+ $form = new Wbcr_FactoryForms427_Form([
755
+ 'scope' => rtrim($this->plugin->getPrefix(), '_'),
756
+ 'name' => $this->getResultId() . "-options"
757
+ ], $this->plugin);
758
 
759
+ $form->setProvider(new Wbcr_FactoryForms427_OptionsValueProvider($this->plugin));
760
 
761
  $options = $this->getPageOptions();
762
 
763
+ if( isset($options[0]) && isset($options[0]['items']) && is_array($options[0]['items']) ) {
764
+ foreach($options[0]['items'] as $key => $value) {
765
 
766
+ if( $value['type'] == 'div' || $value['type'] == 'more-link' ) {
767
+ if( isset($options[0]['items'][$key]['items']) && !empty($options[0]['items'][$key]['items']) ) {
768
+ foreach($options[0]['items'][$key]['items'] as $group_key => $group_value) {
769
+ $options[0]['items'][$key]['items'][$group_key]['layout']['column-left'] = '4';
770
+ $options[0]['items'][$key]['items'][$group_key]['layout']['column-right'] = '8';
771
  }
772
 
773
  continue;
774
  }
775
  }
776
 
777
+ if( in_array($value['type'], [
778
  'checkbox',
779
  'textarea',
780
  'integer',
782
  'dropdown',
783
  'list',
784
  'wp-editor'
785
+ ]) ) {
786
+ $options[0]['items'][$key]['layout']['column-left'] = '4';
787
+ $options[0]['items'][$key]['layout']['column-right'] = '8';
788
  }
789
  }
790
  }
791
 
792
+ $form->add($options);
793
 
794
+ if( isset($_POST[$this->plugin->getPluginName() . '_save_action']) ) {
795
 
796
+ check_admin_referer('wbcr_factory_' . $this->getResultId() . '_save_action');
797
 
798
+ if( !current_user_can('administrator') && !current_user_can($this->capabilitiy) ) {
799
+ wp_die(__('You do not have permission to edit page.', 'wbcr_factory_pages_429'));
800
  exit;
801
  }
802
 
803
  /**
804
  * @since 4.0.9 - является устаревшим
805
  */
806
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_imppage_before_form_save', [
807
  $form,
808
  $this->plugin,
809
  $this
810
+ ], '4.0.9', 'wbcr/factory/pages/impressive/before_form_save');
811
 
812
  /**
813
  * @since 4.0.1 - добавлен
814
  * @since 4.0.9 - изменено имя
815
  */
816
+ do_action('wbcr/factory/pages/impressive/before_form_save', $form, $this->plugin, $this);
817
 
818
  $this->beforeFormSave();
819
 
822
  /**
823
  * @since 4.0.9 - является устаревшим
824
  */
825
+ wbcr_factory_429_do_action_deprecated('wbcr_factory_429_imppage_form_saved', [
826
  $form,
827
  $this->plugin,
828
  $this
829
+ ], '4.0.9', 'wbcr/factory/pages/impressive/form_saved');
830
 
831
  /**
832
  * @since 4.0.1 - добавлен
833
  * @since 4.0.9 - изменено имя
834
  */
835
+ do_action('wbcr/factory/pages/impressive/form_saved', $form, $this->plugin, $this);
836
 
837
  $this->formSaved();
838
 
839
+ $this->redirectToAction('flush-cache-and-rules', [
840
+ '_wpnonce' => wp_create_nonce('wbcr_factory_' . $this->getResultId() . '_flush_action')
841
+ ]);
842
  }
843
 
844
  ?>
845
+ <div id="WBCR" class="wrap">
846
+ <div class="wbcr-factory-pages-429-impressive-page-template factory-bootstrap-430 factory-fontawesome-000">
847
+ <div class="wbcr-factory-options wbcr-factory-options-<?= esc_attr($this->id) ?>">
848
+ <div class="wbcr-factory-left-navigation-bar">
849
  <?php $this->showPageMenu() ?>
850
+ </div>
851
  <?php
852
  $min_height = 0;
853
+ foreach($this->getPageMenu() as $page) {
854
+ if( !isset($page['parent']) || empty($page['parent']) ) {
855
  $min_height += 77;
856
  }
857
  }
858
  ?>
859
+ <div class="wbcr-factory-page-inner-wrap">
860
+ <div class="wbcr-factory-content-section<?php if( !$this->isShowRightSidebar() ): echo ' wbcr-fullwidth'; endif ?>">
861
+ <?php //$this->showPageSubMenu()
862
+ ?>
863
+ <div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
864
+ <form method="post" class="form-horizontal">
865
  <?php $this->showHeader(); ?>
866
  <?php $this->printAllNotices(); ?>
867
  <?php $form->html(); ?>
868
+ </form>
869
+ </div>
870
+ </div>
871
+ <?php if( $this->isShowRightSidebar() ): ?>
872
+ <div class="wbcr-factory-right-sidebar-section">
873
  <?php $this->showRightSidebar(); ?>
874
+ </div>
875
  <?php endif; ?>
876
+ </div>
877
+ </div>
878
  <?php
879
+ if( $this->show_bottom_sidebar ) {
880
  $this->showBottomSidebar();
881
  }
882
  ?>
883
+ <div class="clearfix"></div>
884
+ </div>
885
+ </div>
886
+ </div>
887
  <?php
888
  }
889
 
890
+ protected function showPage($content = null)
891
+ { ?>
892
+ <div id="WBCR" class="wrap">
893
+ <div class="wbcr-factory-pages-429-impressive-page-template factory-bootstrap-430 factory-fontawesome-000">
894
+ <div class="wbcr-factory-page wbcr-factory-page-<?= $this->id ?>">
895
  <?php $this->showHeader(); ?>
896
+ <div class="wbcr-factory-left-navigation-bar">
897
  <?php $this->showPageMenu() ?>
898
+ </div>
899
  <?php
900
  $min_height = 0;
901
+ foreach($this->getPageMenu() as $page) {
902
+ if( !isset($page['parent']) || empty($page['parent']) ) {
903
  $min_height += 77;
904
  }
905
  }
906
  ?>
907
+ <div class="wbcr-factory-page-inner-wrap">
908
+ <div class="wbcr-factory-content-section<?php if( !$this->isShowRightSidebar() ): echo ' wbcr-fullwidth'; endif ?>">
909
+ <?php //$this->showPageSubMenu()
910
+ ?>
911
+ <div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
912
  <?php $this->printAllNotices(); ?>
913
+ <?php if( empty($content) ): ?>
914
  <?php $this->showPageContent() ?>
915
  <?php else: ?>
916
  <?php echo $content; ?>
917
  <?php endif; ?>
918
+ </div>
919
+ </div>
920
+ <?php if( $this->isShowRightSidebar() ): ?>
921
+ <div class="wbcr-factory-right-sidebar-section" style="min-height:<?= $min_height ?>px">
922
  <?php $this->showRightSidebar(); ?>
923
+ </div>
924
  <?php endif; ?>
925
+ </div>
926
+ </div>
927
+ <div class="clearfix"></div>
928
  <?php $this->showBottomSidebar(); ?>
929
+ </div>
930
+ </div>
931
  <?php
932
  }
933
 
934
  /**
935
  * @return array
936
  */
937
+ public function getPageOptions()
938
+ {
939
  // используется в классе потомке
940
  }
941
 
942
  /**
943
  * @return void
944
  */
945
+ public function showPageContent()
946
+ {
947
  // используется в классе потомке
948
  }
949
 
953
  * @sinve 1.0.0
954
  * @return void
955
  */
956
+ public function confirmPageTemplate($data)
957
+ {
958
  ?>
959
+ <div id="WBCR" class="wrap">
960
+ <div class="wbcr-factory-pages-429-impressive-page-template factory-bootstrap-430 factory-fontawesome-000">
961
+ <div id="wbcr-factory-confirm-dialog">
962
+ <h2><?php echo $data['title'] ?></h2>
963
+ <p class="wbcr-factory-confirm-description"><?php echo $data['description'] ?></p>
964
+ <?php if( isset($data['hint']) ): ?>
965
+ <p class="wbcr-factory-confirm-hint"><?php echo $data['hint'] ?></p>
966
  <?php endif; ?>
967
+ <div class='wbcr-factory-confirm-actions'>
968
+ <?php foreach($data['actions'] as $action) { ?>
969
+ <a href='<?php echo $action['url'] ?>' class='<?php echo $action['class'] ?>'>
970
  <?php echo $action['title'] ?>
971
+ </a>
972
  <?php } ?>
973
+ </div>
974
+ </div>
975
+ </div>
976
+ </div>
977
  <?php
978
  }
979
  }
migrations/010007.php CHANGED
@@ -4,7 +4,7 @@
4
  * Updates for altering the table used to store statistics data.
5
  * Adds new columns and renames existing ones in order to add support for the new social buttons.
6
  */
7
- class WDNUpdate010007 extends Wbcr_Factory420_Update {
8
 
9
  public function install()
10
  {
4
  * Updates for altering the table used to store statistics data.
5
  * Adds new columns and renames existing ones in order to add support for the new social buttons.
6
  */
7
+ class WDNUpdate010007 extends Wbcr_Factory429_Update {
8
 
9
  public function install()
10
  {
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Tags: hide admin notices, hide updates nags, hide nags, disable notices, disable update nags, disable nags, disable admin notices
3
  Contributors: webcraftic, alexkovalevv, creativemotion
4
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VDX7JNTQPNPFW
5
- Requires at least: 4.2
6
- Tested up to: 5.2
7
- Requires PHP: 5.4
8
  Stable tag: trunk
9
  License: GPLv2
10
 
@@ -54,6 +54,14 @@ If you want to help with the translation, please contact me through this site or
54
  3. Notifications panel (optional)
55
 
56
  == Changelog ==
 
 
 
 
 
 
 
 
57
  = 1.1.1 =
58
  * Added: Compatibility with Learndash
59
  * Added: Compatibility with Wordpress 4.2 - 5.x
2
  Tags: hide admin notices, hide updates nags, hide nags, disable notices, disable update nags, disable nags, disable admin notices
3
  Contributors: webcraftic, alexkovalevv, creativemotion
4
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VDX7JNTQPNPFW
5
+ Requires at least: 4.8
6
+ Tested up to: 5.4
7
+ Requires PHP: 5.6
8
  Stable tag: trunk
9
  License: GPLv2
10
 
54
  3. Notifications panel (optional)
55
 
56
  == Changelog ==
57
+ = 1.1.3 (01.07.2020) =
58
+ * Removed: Ads notices and dashboard widget
59
+ * Fixed: Minor bugs
60
+
61
+ = 1.1.2 (23.06.2020) =
62
+ * Added: Compatibility with Wordpress 5.4
63
+ * Fixed: Minor bugs
64
+
65
  = 1.1.1 =
66
  * Added: Compatibility with Learndash
67
  * Added: Compatibility with Wordpress 4.2 - 5.x