Robin image optimizer — save money on image compression - Version 1.4.0

Version Description

  • Fixed: Php warning (Declaration of WRIO_Image_Statistic_Folders)
Download this release

Release Info

Developer alexkovalevv
Plugin Icon 128x128 Robin image optimizer — save money on image compression
Version 1.4.0
Comparing to
See all releases

Code changes from version 1.3.7 to 1.4.0

Files changed (168) hide show
  1. admin/activation.php +30 -2
  2. admin/ajax/meta-migrations.php +1 -1
  3. admin/assets/js/bulk-optimization.js +6 -5
  4. admin/boot.php +7 -7
  5. admin/includes/classes/class-rio-optimize-template.php +4 -4
  6. admin/pages/class-rio-license.php +3 -3
  7. admin/pages/class-rio-log.php +4 -2
  8. admin/pages/class-rio-page.php +1 -1
  9. admin/pages/class-rio-settings.php +1 -1
  10. includes/class-rio-plugin.php +3 -3
  11. includes/classes/class-rio-attachment.php +329 -232
  12. includes/classes/class-rio-image-statistic.php +129 -63
  13. includes/classes/class-rio-media-library.php +31 -53
  14. includes/classes/class-rio-views.php +4 -4
  15. includes/classes/logger/class-rio-logger.php +4 -0
  16. includes/classes/models/class-rio-process-queue-table.php +38 -5
  17. includes/functions.php +5 -4
  18. libs/addons/admin/ajax/folders.php +21 -5
  19. libs/addons/admin/assets/js/custom-folders.js +4 -4
  20. libs/addons/admin/boot.php +1 -1
  21. libs/addons/includes/classes/webp/class-webp-listener.php +9 -11
  22. libs/addons/includes/functions.php +110 -0
  23. libs/addons/views/modal-select-custom-folders.php +1 -1
  24. libs/addons/views/part-bulk-optimization-table-folders.php +1 -1
  25. libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css +1 -1
  26. libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css +1 -1
  27. libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css +1 -1
  28. libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css +2 -2
  29. libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css +1 -1
  30. libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css +1 -1
  31. libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css +1 -1
  32. libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css +1 -1
  33. libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css +1 -1
  34. libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css +1 -1
  35. libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css +1 -1
  36. libs/factory/bootstrap/assets/css-min/control.checkbox.min.css +1 -1
  37. libs/factory/bootstrap/assets/css-min/control.dropdown.min.css +1 -1
  38. libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css +1 -1
  39. libs/factory/bootstrap/assets/css-min/holder.more-link.min.css +1 -1
  40. libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js +1 -1
  41. libs/factory/bootstrap/assets/js-min/control.checkbox.min.js +1 -1
  42. libs/factory/bootstrap/assets/js-min/control.dropdown.min.js +1 -1
  43. libs/factory/bootstrap/assets/js-min/control.list.min.js +1 -1
  44. libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js +1 -1
  45. libs/factory/bootstrap/boot.php +6 -6
  46. libs/factory/bootstrap/includes/functions.php +250 -248
  47. libs/factory/clearfy/assets/css/clearfy-base.css +24 -24
  48. libs/factory/clearfy/assets/js/globals.js +15 -15
  49. libs/factory/clearfy/assets/js/license-manager.js +4 -4
  50. libs/factory/clearfy/boot.php +13 -13
  51. libs/factory/clearfy/includes/ajax-handlers.php +8 -8
  52. libs/factory/clearfy/includes/check-clearfy-compatibility.php +11 -11
  53. libs/factory/clearfy/includes/class-clearfy-configurate.php +4 -4
  54. libs/factory/clearfy/includes/class-clearfy-helpers.php +2 -2
  55. libs/factory/clearfy/langs/{wbcr_factory_clearfy_208-ru_RU.mo → wbcr_factory_clearfy_209-ru_RU.mo} +0 -0
  56. libs/factory/clearfy/langs/{wbcr_factory_clearfy_208-ru_RU.po → wbcr_factory_clearfy_209-ru_RU.po} +0 -0
  57. libs/factory/clearfy/pages/class-clearfy-license.php +32 -32
  58. libs/factory/clearfy/pages/class-clearfy-more-features.php +24 -24
  59. libs/factory/clearfy/pages/class-clearfy-pages.php +42 -42
  60. libs/factory/core/boot.php +27 -27
  61. libs/factory/core/includes/activation/class-factory-activator.php +3 -3
  62. libs/factory/core/includes/activation/class-factory-update.php +3 -3
  63. libs/factory/core/includes/assets-managment/class-factory-assets-list.php +4 -4
  64. libs/factory/core/includes/assets-managment/class-factory-script-list.php +2 -2
  65. libs/factory/core/includes/assets-managment/class-factory-style-list.php +1 -1
  66. libs/factory/core/includes/class-check-compatibility.php +3 -3
  67. libs/factory/core/includes/class-factory-migrations.php +187 -140
  68. libs/factory/core/includes/class-factory-notices.php +5 -5
  69. libs/factory/core/includes/class-factory-options.php +1 -1
  70. libs/factory/core/includes/class-factory-plugin-abstract.php +154 -93
  71. libs/factory/core/includes/class-factory-plugin-base.php +16 -19
  72. libs/factory/core/includes/class-factory-requests.php +1 -1
  73. libs/factory/core/includes/class-factory-requirements.php +7 -7
  74. libs/factory/core/includes/entities/class-factory-paths.php +1 -1
  75. libs/factory/core/includes/entities/class-factory-support.php +1 -1
  76. libs/factory/core/includes/functions.php +7 -7
  77. libs/factory/core/includes/premium/class-factory-license-interface.php +1 -1
  78. libs/factory/core/includes/premium/class-factory-manager.php +11 -11
  79. libs/factory/core/includes/premium/class-factory-provider-abstract.php +6 -6
  80. libs/factory/core/includes/updates/class-factory-premium-upgrader.php +15 -15
  81. libs/factory/core/includes/updates/class-factory-upgrader.php +7 -7
  82. libs/factory/core/includes/updates/repositories/class-factory-repository-abstract.php +5 -5
  83. libs/factory/core/includes/updates/repositories/class-factory-wordpress.php +4 -4
  84. libs/factory/core/langs/{wbcr_factory_412-ru_RU.mo → wbcr_factory_414-ru_RU.mo} +0 -0
  85. libs/factory/core/langs/{wbcr_factory_412-ru_RU.po → wbcr_factory_414-ru_RU.po} +0 -0
  86. libs/factory/forms/boot.php +95 -95
  87. libs/factory/forms/controls/checkbox.php +4 -4
  88. libs/factory/forms/controls/color-and-opacity.php +4 -4
  89. libs/factory/forms/controls/color.php +2 -2
  90. libs/factory/forms/controls/customs/html.php +2 -2
  91. libs/factory/forms/controls/customs/separator.php +2 -2
  92. libs/factory/forms/controls/datepicker-range.php +4 -4
  93. libs/factory/forms/controls/dropdown-and-colors.php +6 -6
  94. libs/factory/forms/controls/dropdown.php +5 -5
  95. libs/factory/forms/controls/font.php +11 -11
  96. libs/factory/forms/controls/google-font.php +8 -8
  97. libs/factory/forms/controls/gradient.php +4 -4
  98. libs/factory/forms/controls/hidden.php +2 -2
  99. libs/factory/forms/controls/holders/accordion-item.php +2 -2
  100. libs/factory/forms/controls/holders/accordion.php +2 -2
  101. libs/factory/forms/controls/holders/columns.php +2 -2
  102. libs/factory/forms/controls/holders/control-group-item.php +2 -2
  103. libs/factory/forms/controls/holders/control-group.php +3 -3
  104. libs/factory/forms/controls/holders/div.php +2 -2
  105. libs/factory/forms/controls/holders/form-group.php +2 -2
  106. libs/factory/forms/controls/holders/more-link.php +2 -2
  107. libs/factory/forms/controls/holders/tab-item.php +2 -2
  108. libs/factory/forms/controls/holders/tab.php +4 -4
  109. libs/factory/forms/controls/integer.php +2 -2
  110. libs/factory/forms/controls/list.php +4 -4
  111. libs/factory/forms/controls/multiple-textbox.php +3 -3
  112. libs/factory/forms/controls/paddings-editor.php +3 -3
  113. libs/factory/forms/controls/pattern.php +9 -9
  114. libs/factory/forms/controls/radio-colors.php +2 -2
  115. libs/factory/forms/controls/radio.php +2 -2
  116. libs/factory/forms/controls/textarea.php +2 -2
  117. libs/factory/forms/controls/textbox.php +2 -2
  118. libs/factory/forms/controls/url.php +3 -3
  119. libs/factory/forms/controls/wp-editor.php +3 -3
  120. libs/factory/forms/includes/complex-control.class.php +4 -4
  121. libs/factory/forms/includes/control-holder.class.php +5 -5
  122. libs/factory/forms/includes/control.class.php +5 -5
  123. libs/factory/forms/includes/custom-element.class.php +2 -2
  124. libs/factory/forms/includes/form-element.class.php +7 -7
  125. libs/factory/forms/includes/form-layout.class.php +5 -5
  126. libs/factory/forms/includes/form.class.php +39 -39
  127. libs/factory/forms/includes/holder.class.php +6 -6
  128. libs/factory/forms/includes/html-builder.class.php +2 -2
  129. libs/factory/forms/includes/providers/meta-value-provider.class.php +2 -2
  130. libs/factory/forms/includes/providers/options-value-provider.class.php +3 -3
  131. libs/factory/forms/includes/providers/value-provider.interface.php +2 -2
  132. libs/factory/forms/langs/{wbcr_factory_forms_412-ru_RU.mo → wbcr_factory_forms_414-ru_RU.mo} +0 -0
  133. libs/factory/forms/langs/{wbcr_factory_forms_412-ru_RU.po → wbcr_factory_forms_414-ru_RU.po} +0 -0
  134. libs/factory/forms/layouts/bootstrap-3/bootstrap-3.php +7 -7
  135. libs/factory/freemius/boot.php +13 -13
  136. libs/factory/freemius/includes/class-freemius-api.php +7 -7
  137. libs/factory/freemius/includes/entities/class-freemius-entity.php +1 -1
  138. libs/factory/freemius/includes/entities/class-freemius-license.php +2 -2
  139. libs/factory/freemius/includes/entities/class-freemius-plugin.php +1 -1
  140. libs/factory/freemius/includes/entities/class-freemius-scope.php +1 -1
  141. libs/factory/freemius/includes/entities/class-freemius-site.php +1 -1
  142. libs/factory/freemius/includes/entities/class-freemius-user.php +1 -1
  143. libs/factory/freemius/includes/licensing/class-freemius-provider.php +25 -19
  144. libs/factory/freemius/includes/updates/class-freemius-repository.php +7 -7
  145. libs/factory/pages/boot.php +10 -10
  146. libs/factory/pages/includes/admin-page.class.php +6 -6
  147. libs/factory/pages/includes/page.class.php +6 -6
  148. libs/factory/pages/langs/{wbcr_factory_pages_412-fr_FR.mo → wbcr_factory_pages_414-fr_FR.mo} +0 -0
  149. libs/factory/pages/langs/{wbcr_factory_pages_412-fr_FR.po → wbcr_factory_pages_414-fr_FR.po} +0 -0
  150. libs/factory/pages/langs/{wbcr_factory_pages_412-ru_RU.mo → wbcr_factory_pages_414-ru_RU.mo} +0 -0
  151. libs/factory/pages/langs/{wbcr_factory_pages_412-ru_RU.po → wbcr_factory_pages_414-ru_RU.po} +0 -0
  152. libs/factory/pages/pages.php +11 -11
  153. libs/factory/pages/templates/assets/css/impressive.page.template.css +116 -116
  154. libs/factory/pages/templates/impressive-page.class.php +31 -31
  155. migrations/010009.php +30 -2
  156. migrations/010300.php +22 -14
  157. migrations/010306.php +31 -8
  158. migrations/010309.php +87 -0
  159. readme.txt +17 -1
  160. robin-image-optimizer.php +8 -8
  161. views/clearfy-component-card.php +1 -1
  162. views/part-bulk-optimization-button.php +1 -1
  163. views/part-bulk-optimization-log.php +2 -2
  164. views/part-bulk-optimization-select-site.php +1 -1
  165. views/part-bulk-optimization-servers.php +1 -1
  166. views/part-bulk-optimization-statistic.php +1 -1
  167. views/part-bulk-optimization-tabs.php +1 -1
  168. views/part-page-header.php +1 -1
admin/activation.php CHANGED
@@ -5,7 +5,7 @@
5
  *
6
  * @author Webcraftic <wordpress.webraftic@gmail.com>
7
  * @copyright (c) 09.09.2017, Webcraftic
8
- * @see Factory412_Activator
9
  * @version 1.0
10
  */
11
 
@@ -14,7 +14,7 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- class WIO_Activation extends Wbcr_Factory412_Activator {
18
 
19
  /**
20
  * Runs activation actions.
@@ -36,11 +36,39 @@ class WIO_Activation extends Wbcr_Factory412_Activator {
36
  WRIO_Logger::info( 'Premium plugin installation complete!' );
37
  }
38
 
 
 
 
 
 
 
 
 
 
 
 
39
  RIO_Process_Queue::try_create_plugin_tables();
40
 
 
 
41
  WRIO_Logger::info( 'Parent plugin installation complete!' );
42
  }
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  /**
45
  * Runs activation actions.
46
  *
5
  *
6
  * @author Webcraftic <wordpress.webraftic@gmail.com>
7
  * @copyright (c) 09.09.2017, Webcraftic
8
+ * @see Factory414_Activator
9
  * @version 1.0
10
  */
11
 
14
  exit;
15
  }
16
 
17
+ class WIO_Activation extends Wbcr_Factory414_Activator {
18
 
19
  /**
20
  * Runs activation actions.
36
  WRIO_Logger::info( 'Premium plugin installation complete!' );
37
  }
38
 
39
+ $db_version = RIO_Process_Queue::get_db_version();
40
+ $plugin_version_in_db = $this->get_plugin_version_in_db();
41
+ $current_plugin_version = $this->plugin->getPluginVersion();
42
+
43
+ $create_table_log_message = "Plugin installation: try create plugin tables.\r\n";
44
+ $create_table_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-DB Version: {$db_version}\r\n";
45
+ $create_table_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Plugin Version in DB: {$plugin_version_in_db}\r\n";
46
+ $create_table_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Current Plugin Version: {$current_plugin_version}";
47
+
48
+ WRIO_Logger::info( $create_table_log_message );
49
+
50
  RIO_Process_Queue::try_create_plugin_tables();
51
 
52
+ WbcrFactoryClearfy209_Helpers::flushPageCache();
53
+
54
  WRIO_Logger::info( 'Parent plugin installation complete!' );
55
  }
56
 
57
+ /**
58
+ * Get previous plugin version
59
+ *
60
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
61
+ * @since 1.3.8
62
+ * @return number
63
+ */
64
+ public function get_plugin_version_in_db() {
65
+ if ( WRIO_Plugin::app()->isNetworkActive() ) {
66
+ return get_site_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
67
+ }
68
+
69
+ return get_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
70
+ }
71
+
72
  /**
73
  * Runs activation actions.
74
  *
admin/ajax/meta-migrations.php CHANGED
@@ -157,7 +157,7 @@ function wbcr_rio_migrate_postmeta_to_process_queue() {
157
  WRIO_Logger::info( 'Succefull migrated all items. Finishing-up...' );
158
 
159
  // Assumed to be 2 after 010105.php migration
160
- WRIO_Plugin::app()->updateOption( 'db_version', 2 );
161
 
162
  $need_more_time = false;
163
  $message = __( 'Finishing-up...', 'robin-image-optimizer' );
157
  WRIO_Logger::info( 'Succefull migrated all items. Finishing-up...' );
158
 
159
  // Assumed to be 2 after 010105.php migration
160
+ RIO_Process_Queue::update_db_version(2);
161
 
162
  $need_more_time = false;
163
  $message = __( 'Finishing-up...', 'robin-image-optimizer' );
admin/assets/js/bulk-optimization.js CHANGED
@@ -289,10 +289,10 @@ jQuery(function($) {
289
  throwError: function(error_message) {
290
  this.stop();
291
 
292
- var noticeId = $.wbcr_factory_clearfy_208.app.showNotice(error_message, 'danger');
293
 
294
  setTimeout(function() {
295
- $.wbcr_factory_clearfy_208.app.hideNotice(noticeId);
296
  }, 10000);
297
  },
298
 
@@ -386,8 +386,8 @@ jQuery(function($) {
386
  trEl.addClass('wrio-error');
387
  }
388
 
389
- var preview = $('<img width="40" height="40" src="' + value.url + '" alt="">'),
390
- previewUrl = $('<a href="' + value.url + '">' + value.file_name + '</a>');
391
 
392
  tableEl.prepend(trEl);
393
 
@@ -395,7 +395,8 @@ jQuery(function($) {
395
  trEl.append(tdEl.clone().append(previewUrl));
396
 
397
  if( 'error' === value.type ) {
398
- trEl.append(tdEl.clone().attr('colspan', '5').text("Error: " + value.error_msg));
 
399
  } else {
400
  trEl.append(tdEl.clone().text(value.original_size));
401
  trEl.append(tdEl.clone().text(value.optimized_size));
289
  throwError: function(error_message) {
290
  this.stop();
291
 
292
+ var noticeId = $.wbcr_factory_clearfy_209.app.showNotice(error_message, 'danger');
293
 
294
  setTimeout(function() {
295
+ $.wbcr_factory_clearfy_209.app.hideNotice(noticeId);
296
  }, 10000);
297
  },
298
 
386
  trEl.addClass('wrio-error');
387
  }
388
 
389
+ var preview = $('<img width="40" height="40" src="' + value.thumbnail_url + '" alt="">'),
390
+ previewUrl = $('<a href="' + value.url + '" target="_blank">' + value.file_name + '</a>');
391
 
392
  tableEl.prepend(trEl);
393
 
395
  trEl.append(tdEl.clone().append(previewUrl));
396
 
397
  if( 'error' === value.type ) {
398
+ var colspan = value.scope !== 'custom-folders' ? '6' : '5';
399
+ trEl.append(tdEl.clone().attr('colspan', colspan).text("Error: " + value.error_msg));
400
  } else {
401
  trEl.append(tdEl.clone().text(value.original_size));
402
  trEl.append(tdEl.clone().text(value.optimized_size));
admin/boot.php CHANGED
@@ -73,7 +73,7 @@ add_action( 'admin_enqueue_scripts', function () {
73
 
74
  wp_enqueue_script( 'wrio-meta-migrations', WRIO_PLUGIN_URL . '/admin/assets/js/meta-migrations.js', [
75
  'jquery',
76
- 'wbcr-factory-clearfy-208-global'
77
  ], WRIO_Plugin::app()->getPluginVersion() );
78
  } );
79
 
@@ -126,8 +126,8 @@ add_action( "wbcr_factory_notices_000_list", function ( $notices ) {
126
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
127
  * @since 1.3.0
128
  *
129
- * @param Wbcr_Factory412_Plugin $plugin
130
- * @param Wbcr_FactoryPages412_ImpressiveThemplate $obj
131
  *
132
  * @see wbcr_rio_migrate_postmeta_to_process_queue() for further information about AJAX processing function.
133
  * @see wbcr_rio_has_meta_to_migrate() used to check whether to show notice or not.
@@ -146,11 +146,11 @@ add_action( 'wbcr/factory/pages/impressive/print_all_notices', function ( $plugi
146
  * Flush configuration after saving the settings
147
  *
148
  * @param WHM_Plugin $plugin
149
- * @param Wbcr_FactoryPages412_ImpressiveThemplate $obj
150
  *
151
  * @return bool
152
  */
153
- /*add_action('wbcr_factory_412_imppage_after_form_save', function ($plugin, $obj) {
154
  $is_rio = WRIO_Plugin::app()->getPluginName() == $plugin->getPluginName();
155
 
156
  if( $is_rio ) {
@@ -174,14 +174,14 @@ function wio_rating_widget_url( $page_url, $plugin_name ) {
174
  return $page_url;
175
  }
176
 
177
- add_filter( 'wbcr_factory_pages_412_imppage_rating_widget_url', 'wio_rating_widget_url', 10, 2 );
178
 
179
  /**
180
  * Widget with the offer to buy Clearfy Business
181
  *
182
  * @param array $widgets
183
  * @param string $position
184
- * @param Wbcr_Factory412_Plugin $plugin
185
  */
186
  add_filter( 'wbcr/factory/pages/impressive/widgets', function ( $widgets, $position, $plugin ) {
187
  if ( $plugin->getPluginName() == WRIO_Plugin::app()->getPluginName() ) {
73
 
74
  wp_enqueue_script( 'wrio-meta-migrations', WRIO_PLUGIN_URL . '/admin/assets/js/meta-migrations.js', [
75
  'jquery',
76
+ 'wbcr-factory-clearfy-209-global'
77
  ], WRIO_Plugin::app()->getPluginVersion() );
78
  } );
79
 
126
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
127
  * @since 1.3.0
128
  *
129
+ * @param Wbcr_Factory414_Plugin $plugin
130
+ * @param Wbcr_FactoryPages414_ImpressiveThemplate $obj
131
  *
132
  * @see wbcr_rio_migrate_postmeta_to_process_queue() for further information about AJAX processing function.
133
  * @see wbcr_rio_has_meta_to_migrate() used to check whether to show notice or not.
146
  * Flush configuration after saving the settings
147
  *
148
  * @param WHM_Plugin $plugin
149
+ * @param Wbcr_FactoryPages414_ImpressiveThemplate $obj
150
  *
151
  * @return bool
152
  */
153
+ /*add_action('wbcr_factory_414_imppage_after_form_save', function ($plugin, $obj) {
154
  $is_rio = WRIO_Plugin::app()->getPluginName() == $plugin->getPluginName();
155
 
156
  if( $is_rio ) {
174
  return $page_url;
175
  }
176
 
177
+ add_filter( 'wbcr_factory_pages_414_imppage_rating_widget_url', 'wio_rating_widget_url', 10, 2 );
178
 
179
  /**
180
  * Widget with the offer to buy Clearfy Business
181
  *
182
  * @param array $widgets
183
  * @param string $position
184
+ * @param Wbcr_Factory414_Plugin $plugin
185
  */
186
  add_filter( 'wbcr/factory/pages/impressive/widgets', function ( $widgets, $position, $plugin ) {
187
  if ( $plugin->getPluginName() == WRIO_Plugin::app()->getPluginName() ) {
admin/includes/classes/class-rio-optimize-template.php CHANGED
@@ -26,12 +26,12 @@ class WIO_OptimizePageTemplate {
26
  /**
27
  * Выводит контент страницы с учётом мультисайта
28
  *
29
- * @param Wbcr_FactoryClearfy208_PageBase $page
30
  *
31
  * @throws Exception
32
  */
33
 
34
- /*public function showPageContent( Wbcr_FactoryClearfy208_PageBase $page ) {
35
  do_action( 'wbcr/rio/multisite_current_blog' );
36
  $this->pageContent( $page );
37
  do_action( 'wbcr/rio/multisite_restore_blog' );
@@ -174,7 +174,7 @@ class WIO_OptimizePageTemplate {
174
  class="wio-reoptimize button-wio-manual-override-upload"
175
  data-waiting-label="<?php _e( 'Optimization in progress', 'robin-image-optimizer' ); ?>">
176
  <span class="dashicons dashicons-admin-generic"></span><span
177
- class="wio-hide-if-small"><?php _e( 'Re-Optimize to', 'robin-image-optimizer' ); ?> </span><?php _e( 'Normal', 'robin-image-optimizer' ); ?>
178
  <span class="wio-hide-if-small"></span>
179
  </a>
180
  <?php endif; ?>
@@ -184,7 +184,7 @@ class WIO_OptimizePageTemplate {
184
  class="wio-reoptimize button-wio-manual-override-upload"
185
  data-waiting-label="<?php _e( 'Optimization in progress', 'robin-image-optimizer' ); ?>">
186
  <span class="dashicons dashicons-admin-generic"></span><span
187
- class="wio-hide-if-small"><?php _e( 'Re-Optimize to', 'robin-image-optimizer' ); ?> </span><?php _e( 'Medium', 'robin-image-optimizer' ); ?>
188
  <span class="wio-hide-if-small"></span>
189
  </a>
190
  <?php endif; ?>
26
  /**
27
  * Выводит контент страницы с учётом мультисайта
28
  *
29
+ * @param Wbcr_FactoryClearfy209_PageBase $page
30
  *
31
  * @throws Exception
32
  */
33
 
34
+ /*public function showPageContent( Wbcr_FactoryClearfy209_PageBase $page ) {
35
  do_action( 'wbcr/rio/multisite_current_blog' );
36
  $this->pageContent( $page );
37
  do_action( 'wbcr/rio/multisite_restore_blog' );
174
  class="wio-reoptimize button-wio-manual-override-upload"
175
  data-waiting-label="<?php _e( 'Optimization in progress', 'robin-image-optimizer' ); ?>">
176
  <span class="dashicons dashicons-admin-generic"></span><span
177
+ class="wio-hide-if-small"><?php _e( 'Re-Optimize to', 'robin-image-optimizer' ); ?> </span><?php _e( 'lossless', 'robin-image-optimizer' ); ?>
178
  <span class="wio-hide-if-small"></span>
179
  </a>
180
  <?php endif; ?>
184
  class="wio-reoptimize button-wio-manual-override-upload"
185
  data-waiting-label="<?php _e( 'Optimization in progress', 'robin-image-optimizer' ); ?>">
186
  <span class="dashicons dashicons-admin-generic"></span><span
187
+ class="wio-hide-if-small"><?php _e( 'Re-Optimize to', 'robin-image-optimizer' ); ?> </span><?php _e( 'lossy', 'robin-image-optimizer' ); ?>
188
  <span class="wio-hide-if-small"></span>
189
  </a>
190
  <?php endif; ?>
admin/pages/class-rio-license.php CHANGED
@@ -9,7 +9,7 @@ if ( ! defined( 'ABSPATH' ) ) {
9
  *
10
  * @author Alexander Teshabaev <sasha.tesh@gmail.com>
11
  */
12
- class WRIO_License_Page extends Wbcr_FactoryClearfy208_LicensePage {
13
 
14
  /**
15
  * {@inheritdoc}
@@ -43,9 +43,9 @@ class WRIO_License_Page extends Wbcr_FactoryClearfy208_LicensePage {
43
 
44
  /**
45
  * {@inheritdoc}
46
- * @param Wbcr_Factory412_Plugin $plugin
47
  */
48
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
49
  $this->menu_title = __( 'License', 'robin-image-optimizer' );
50
  $this->page_menu_short_description = __( 'Product activation', 'robin-image-optimizer' );
51
 
9
  *
10
  * @author Alexander Teshabaev <sasha.tesh@gmail.com>
11
  */
12
+ class WRIO_License_Page extends Wbcr_FactoryClearfy209_LicensePage {
13
 
14
  /**
15
  * {@inheritdoc}
43
 
44
  /**
45
  * {@inheritdoc}
46
+ * @param Wbcr_Factory414_Plugin $plugin
47
  */
48
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
49
  $this->menu_title = __( 'License', 'robin-image-optimizer' );
50
  $this->page_menu_short_description = __( 'Product activation', 'robin-image-optimizer' );
51
 
admin/pages/class-rio-log.php CHANGED
@@ -49,6 +49,8 @@ class WRIO_LogPage extends WRIO_Page {
49
  public function assets( $scripts, $styles ) {
50
  parent::assets( $scripts, $styles );
51
 
 
 
52
  // Add Clearfy styles for HMWP pages
53
  if ( defined( 'WBCR_CLEARFY_PLUGIN_ACTIVE' ) ) {
54
  $this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
@@ -104,10 +106,10 @@ class WRIO_LogPage extends WRIO_Page {
104
 
105
  jQuery('#wbcr-log-viewer').html('');
106
  jQuery('#wbcr-log-size').text('0B');
107
- jQuery.wbcr_factory_clearfy_208.app.showNotice(data.message, data.type);
108
  },
109
  error: function(jqXHR, textStatus, errorThrown) {
110
- jQuery.wbcr_factory_clearfy_208.app.showNotice('Error: ' + errorThrown + ', status: ' + textStatus, 'danger');
111
  btn.html(currentBtnText);
112
  }
113
  });
49
  public function assets( $scripts, $styles ) {
50
  parent::assets( $scripts, $styles );
51
 
52
+ $this->styles->add( WRIO_PLUGIN_URL . '/admin/assets/css/base-statistic.css' );
53
+
54
  // Add Clearfy styles for HMWP pages
55
  if ( defined( 'WBCR_CLEARFY_PLUGIN_ACTIVE' ) ) {
56
  $this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
106
 
107
  jQuery('#wbcr-log-viewer').html('');
108
  jQuery('#wbcr-log-size').text('0B');
109
+ jQuery.wbcr_factory_clearfy_209.app.showNotice(data.message, data.type);
110
  },
111
  error: function(jqXHR, textStatus, errorThrown) {
112
+ jQuery.wbcr_factory_clearfy_209.app.showNotice('Error: ' + errorThrown + ', status: ' + textStatus, 'danger');
113
  btn.html(currentBtnText);
114
  }
115
  });
admin/pages/class-rio-page.php CHANGED
@@ -18,7 +18,7 @@ if ( ! defined( 'ABSPATH' ) ) {
18
  * @copyright (c) 2018, Webcraftic
19
  * @version 1.0
20
  */
21
- class WRIO_Page extends Wbcr_FactoryClearfy208_PageBase {
22
 
23
  /**
24
  * {@inheritdoc}
18
  * @copyright (c) 2018, Webcraftic
19
  * @version 1.0
20
  */
21
+ class WRIO_Page extends Wbcr_FactoryClearfy209_PageBase {
22
 
23
  /**
24
  * {@inheritdoc}
admin/pages/class-rio-settings.php CHANGED
@@ -44,7 +44,7 @@ class WRIO_SettingsPage extends WRIO_Page {
44
  *
45
  * @since 1.0.0
46
  * @return void
47
- * @see Wbcr_FactoryPages412_AdminPage
48
  *
49
  */
50
  public function assets( $scripts, $styles ) {
44
  *
45
  * @since 1.0.0
46
  * @return void
47
+ * @see Wbcr_FactoryPages414_AdminPage
48
  *
49
  */
50
  public function assets( $scripts, $styles ) {
includes/class-rio-plugin.php CHANGED
@@ -11,10 +11,10 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  * @copyright (c) 19.02.2018, Webcraftic
12
  * @version 1.0
13
  */
14
- class WRIO_Plugin extends Wbcr_Factory412_Plugin {
15
 
16
  /**
17
- * @var Wbcr_Factory412_Plugin
18
  */
19
  private static $app;
20
 
@@ -89,7 +89,7 @@ class WRIO_Plugin extends Wbcr_Factory412_Plugin {
89
  /**
90
  * Статический метод для быстрого доступа к информации о плагине, а также часто использумых методах.
91
  *
92
- * @return Wbcr_Factory412_Plugin
93
  */
94
  public static function app() {
95
  return self::$app;
11
  * @copyright (c) 19.02.2018, Webcraftic
12
  * @version 1.0
13
  */
14
+ class WRIO_Plugin extends Wbcr_Factory414_Plugin {
15
 
16
  /**
17
+ * @var Wbcr_Factory414_Plugin
18
  */
19
  private static $app;
20
 
89
  /**
90
  * Статический метод для быстрого доступа к информации о плагине, а также часто использумых методах.
91
  *
92
+ * @return Wbcr_Factory414_Plugin
93
  */
94
  public static function app() {
95
  return self::$app;
includes/classes/class-rio-attachment.php CHANGED
@@ -8,104 +8,186 @@ if ( ! defined( 'ABSPATH' ) ) {
8
  /**
9
  * Класс для работы с WordPress attachment.
10
  *
11
- * @author Eugene Jokerov <jokerov@gmail.com>
12
  * @copyright (c) 2018, Webcraftic
13
- * @version 1.0
14
  */
15
  class WIO_Attachment {
16
-
17
  /**
18
  * @var int
19
  */
20
  private $id;
21
-
 
22
  /**
23
  * @var array meta-данные
24
  */
25
  private $attachment_meta;
26
-
27
  /**
28
  * @var array массив с данными о папке uploads
29
  */
30
  private $wp_upload_dir;
31
-
32
  /**
33
  * @var string
34
  */
35
  private $url;
36
-
37
  /**
38
  * @var string
39
  */
40
  private $path;
41
-
42
  /**
43
  * @var RIO_Process_Queue
44
  */
45
  private $optimization_data;
46
-
47
  /**
48
  * Инициализация аттачмента
49
  *
50
- * @param int $attachment_id Номер аттачмента из медиабиблиотеки
51
- * @param array|false $attachment_meta метаданные аттачмента. Ключи массива аналогичны функции wp_get_attachment_metadata
52
  */
53
  public function __construct( $attachment_id, $attachment_meta = false ) {
54
  $this->id = $attachment_id;
55
  $this->wp_upload_dir = wp_upload_dir();
56
  $this->attachment_meta = $attachment_meta;
57
-
58
  if ( ! $attachment_meta ) {
59
  // some meta can be missing due to: https://wordpress.stackexchange.com/q/330174/149161
60
  $this->attachment_meta = wp_get_attachment_metadata( $this->id );
61
  }
62
-
63
- if ( $this->attachment_meta && isset( $this->attachment_meta['file'] ) ) {
64
- $this->url = trailingslashit( $this->wp_upload_dir['baseurl'] ) . $this->attachment_meta['file'];
65
- $this->path = wp_normalize_path( trailingslashit( $this->wp_upload_dir['basedir'] ) . $this->attachment_meta['file'] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  }
 
 
 
67
  }
68
-
69
  /**
70
  * Актуализирует мета данные аттачмента и загружает актуальные мета данные и данные по оптимизации из базы.
71
  */
72
- public function reload() {
73
- $this->attachment_meta = wp_get_attachment_metadata( $this->id );
74
- $this->optimization_data = new RIO_Process_Queue( array(
 
 
 
75
  'object_id' => $this->id,
76
  'object_name' => '',
77
  'item_type' => 'attachment',
78
- ) );
79
  $this->optimization_data->load();
 
80
  }
81
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  /**
83
  * Добавляем сообщение в лог файл.
84
  *
85
- * @param string $message Текст сообщения об ошибке.
86
  */
87
  public function writeLog( $message ) {
88
-
89
  $char = "\t-> ";
90
  $nl = PHP_EOL;
91
-
92
  $error = sprintf( 'Error to optimize attachment (ID: #%s). Message: "%s"', $this->id, trim( $message ) ) . $nl;
93
  $error .= $char . sprintf( "Attachment optimized? %s", ( $this->isOptimized() ? 'Yes' : 'No' ) ) . $nl;
94
  $error .= $char . sprintf( "Should be resized? %s", ( $this->isNeedResize() ? 'Yes' : 'No' ) ) . $nl;
95
  $error .= $char . sprintf( "Original size: %sx%s", $this->attachment_meta['width'], $this->attachment_meta['height'] ) . $nl;
96
  $error .= $char . sprintf( "Relative path: %s", $this->attachment_meta['file'] ) . $nl;
97
  $error .= $char . sprintf( "Server used: %s", WRIO_Plugin::app()->getPopulateOption( 'image_optimization_server', 'server_1' ) ) . $nl;
98
-
99
  if ( ! empty( $this->attachment_meta['sizes'] ) ) {
100
  $error .= $char . ' Additional sizes:' . $nl;
101
  foreach ( $this->attachment_meta['sizes'] as $size_type => $size_info ) {
102
  $error .= "\t" . $char . sprintf( 'Type: %s, size: %sx%s, MIME type: %s', $size_type, $size_info['width'], $size_info['height'], $size_info['mime-type'] ) . $nl;
103
  }
104
  }
105
-
106
  WRIO_Logger::error( $error );
107
  }
108
-
109
  /**
110
  * Возвращает объект с информацией об оптимизации
111
  *
@@ -113,243 +195,258 @@ class WIO_Attachment {
113
  */
114
  public function getOptimizationData() {
115
  if ( ! isset( $optimization_data ) ) {
116
- $this->optimization_data = new RIO_Process_Queue( array(
117
  'object_id' => $this->id,
118
  'object_name' => '',
119
  'item_type' => 'attachment',
120
- ) );
121
  $this->optimization_data->load();
122
  }
123
-
124
  return $this->optimization_data;
125
  }
126
-
127
  /**
128
  * Оптимизация аттачмента.
129
  *
130
- * @param string $optimization_level Уровень оптимизации изображения.
131
  *
132
  * @return array
133
  */
134
  public function optimize( $optimization_level = '' ) {
135
- $optimize_results = array(
136
  'original_size' => 0,
137
  'optimized_size' => 0,
138
- );
139
-
140
  if ( empty( $optimization_level ) ) {
141
  $optimization_level = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level', 'normal' );
142
  }
143
-
144
  if ( $optimization_level == 'custom' ) {
145
  $custom_quality = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level_custom', 100 );
146
  $optimization_level = intval( $custom_quality );
147
  }
148
-
149
  $optimization_data = $this->getOptimizationData();
150
- $results = array(
151
  'original_size' => 0,
152
  'final_size' => 0,
153
  'original_mime_type' => '',
154
  'final_mime_type' => '',
155
- );
156
  $results['processing_level'] = $optimization_level;
157
-
158
- $path = $this->get( 'path' );
159
-
160
- // проверяем наличие основного файла, если его нет, то исключаем из дальнейшей обработки
161
- if ( ! file_exists( $path ) ) {
 
 
 
 
 
162
  $results['result_status'] = 'error';
163
- $extra_data = array(
 
 
 
 
 
 
 
 
 
164
  'error' => 'path',
165
- 'error_msg' => sprintf( 'File path %s', ( empty( $path ) ) ? 'is empty' : $path . ' does not exist' ),
166
- );
167
- $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
 
168
  $optimization_data->configure( $results );
169
  $optimization_data->save();
170
-
171
  WRIO_Logger::error( sprintf( 'Failed to find original attachment #%s located in %s. Skipping optimization. This may be caused due to bug in %s function, which returns false for attachment meta', $this->id, empty( $path ) ? '*empty path*' : $path, 'wp_get_attachment_metadata()' ) );
172
-
173
  return $optimize_results;
174
  }
175
-
176
  // сначала бекапим
177
  $is_image_backuped = $this->backup();
178
-
179
  if ( is_wp_error( $is_image_backuped ) ) {
180
  $error_msg = $is_image_backuped->get_error_message();
181
  $this->writeLog( $error_msg );
182
-
183
  $results['result_status'] = 'error';
184
- $extra_data = array(
185
  'error' => 'backup',
186
  'error_msg' => 'Failed to backup',
187
- );
188
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
189
  $optimization_data->configure( $results );
190
  $optimization_data->save();
191
-
192
  WRIO_Logger::error( sprintf( 'Failed to make backup of original attachment #%s. Skipping optimization.', $this->id ) );
193
-
194
  return $optimize_results;
195
  }
196
-
197
  $results['is_backed_up'] = $is_image_backuped;
198
-
199
- $original_main_size = filesize( $path );
200
-
201
  // если файл большой - изменяем размер
202
  if ( $this->isNeedResize() ) {
203
  $this->resize();
204
  }
205
-
206
  $image_processor = WIO_OptimizationTools::getImageProcessor();
207
-
208
  clearstatcache(); // на всякий случай очистим кеш файловой статистики
209
-
210
- $optimized_img_data = $image_processor->process( array(
211
  'image_url' => $this->get( 'url' ),
212
  'image_path' => $this->get( 'path' ),
213
  'quality' => $image_processor->quality( $optimization_level ),
214
  'save_exif' => WRIO_Plugin::app()->getPopulateOption( 'save_exif_data', false ),
215
- ) );
216
-
217
  // проверяем на ошибку
218
  if ( is_wp_error( $optimized_img_data ) ) {
219
  $error_msg = $optimized_img_data->get_error_message();
220
  $this->writeLog( $error_msg );
221
-
222
  $results['result_status'] = 'error';
223
-
224
- $extra_data = array(
225
  'error' => 'optimization',
226
  'error_msg' => $error_msg,
227
- );
228
-
229
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
230
-
231
  $optimization_data->configure( $results );
232
  $optimization_data->save();
233
-
234
  WRIO_Logger::error( sprintf( 'Failed to process (url: %s, path: %s, quality: %s) as error was returned: %s', $this->get( 'url' ), $this->get( 'path' ), $image_processor->quality( $optimization_level ), $error_msg ) );
235
-
236
  return $optimize_results;
237
  }
238
-
239
  $results['original_mime_type'] = '';
240
  $results['final_mime_type'] = '';
241
-
242
  // отложенная оптимизация
243
  if ( isset( $optimized_img_data['status'] ) && $optimized_img_data['status'] == 'processing' ) {
244
  $results['result_status'] = 'processing';
245
  $results['original_size'] = 0;
246
  $results['final_size'] = 0;
247
-
248
- $extra_data = array(
249
  'main_optimized_data' => $optimized_img_data,
250
  'thumbnails_optimized_data' => $this->optimizeImageSizes(),
251
- );
252
-
253
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
254
-
255
  $optimization_data->configure( $results );
256
  $optimization_data->save();
257
  $optimize_results['processing'] = 1;
258
-
259
  return $optimize_results;
260
  }
261
-
262
  //скачиваем и заменяем главную картинку
263
  $image_downloaded = $this->replaceOriginalFile( $optimized_img_data );
264
-
265
  // некоторые провайдеры не отдают оптимизированный размер, поэтому после замены файла получаем его сами
266
  if ( ! $optimized_img_data['optimized_size'] ) {
267
  clearstatcache();
268
  $optimized_img_data['optimized_size'] = filesize( $this->get( 'path' ) );
269
  }
270
-
271
  // при отрицательной оптимизации ставим значение оригинала
272
  if ( $optimized_img_data['optimized_size'] > $original_main_size ) {
273
  $optimized_img_data['optimized_size'] = $original_main_size;
274
  }
275
-
276
  if ( $image_downloaded ) {
277
  //просчитываем статистику
278
  $optimize_results['original_size'] += $original_main_size;
279
  $optimize_results['optimized_size'] += $optimized_img_data['optimized_size'];
280
  $thumbnails_count = 0;
281
-
282
  // оптимизируем дополнительные размеры
283
  $optimized_img_sizes_data = $this->optimizeImageSizes();
284
-
285
  // добавляем к статистике данные по оптимизации доп размеров
286
  if ( ! empty( $optimized_img_sizes_data ) ) {
287
  $optimize_results['original_size'] += $optimized_img_sizes_data['original_size'];
288
  $optimize_results['optimized_size'] += $optimized_img_sizes_data['optimized_size'];
289
  $thumbnails_count = $optimized_img_sizes_data['thumbnails_count'];
290
  }
291
-
292
  $results['result_status'] = 'success';
293
  $results['final_size'] = $optimize_results['optimized_size'];
294
  $results['original_size'] = $optimize_results['original_size'];
295
-
296
- $extra_data = array(
297
  'thumbnails_count' => $thumbnails_count,
298
  'original_main_size' => $original_main_size,
299
- );
300
-
301
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
302
  $mime_type = '';
303
-
304
  if ( function_exists( 'wp_get_image_mime' ) ) {
305
  $mime_type = wp_get_image_mime( $this->get( 'path' ) );
306
  } else {
307
  WRIO_Logger::error( 'App is missing wp_get_image_mime() function, unable to get MIME type' );
308
  }
309
-
310
  $results['original_mime_type'] = $mime_type;
311
  $results['final_mime_type'] = $mime_type;
312
  $optimization_data->configure( $results );
313
  } else {
314
  $error_msg = 'Failed to get optimized image from remote server';
315
  $this->writeLog( $error_msg );
316
-
317
  $results['result_status'] = 'error';
318
-
319
- $extra_data = array(
320
  'error' => 'download',
321
  'error_msg' => $error_msg,
322
- );
323
-
324
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
325
  $optimization_data->configure( $results );
326
  }
327
-
328
  $optimization_data->save();
329
-
330
  return $optimize_results;
331
  }
332
-
333
  /**
334
  * Отложенная оптимизация аттачмента
335
  *
336
  * @return bool|array
337
  */
338
  public function deferredOptimization() {
339
- $results = array(
340
  'original_size' => 0,
341
  'optimized_size' => 0,
342
  'optimized_count' => 0,
343
  'processing' => 1,
344
- );
345
-
346
  $image_processor = WIO_OptimizationTools::getImageProcessor();
347
  $optimization_data = $this->getOptimizationData();
348
-
349
  if ( $optimization_data->get_result_status() != 'processing' ) {
350
  return false;
351
  }
352
-
353
  // проверяем главную картинку
354
  /**
355
  * @var RIO_Attachment_Extra_Data $extra_data
@@ -357,7 +454,7 @@ class WIO_Attachment {
357
  $extra_data = $optimization_data->get_extra_data();
358
  $main_optimized_data = $extra_data->get_main_optimized_data();
359
  $main_image_url = '';
360
-
361
  if ( ! $main_optimized_data['optimized_img_url'] ) {
362
  $main_image_url = $image_processor->checkDeferredOptimization( $main_optimized_data );
363
  if ( $main_image_url ) {
@@ -365,11 +462,11 @@ class WIO_Attachment {
365
  $extra_data->set_main_optimized_data( $main_optimized_data );
366
  }
367
  }
368
-
369
  $thumbnails_processed = true;
370
  $thumbnails = (array) $extra_data->get_thumbnails_optimized_data();
371
  $thumbnails = json_decode( json_encode( $thumbnails ), true ); // рекурсивная конвертация объекта в массив
372
-
373
  if ( is_array( $thumbnails['thumbnails'] ) ) {
374
  foreach ( $thumbnails['thumbnails'] as &$thumbnail_optimized_data ) {
375
  if ( ! $thumbnail_optimized_data['optimized_img_url'] ) {
@@ -383,7 +480,7 @@ class WIO_Attachment {
383
  }
384
  $extra_data->set_thumbnails_optimized_data( $thumbnails );
385
  }
386
-
387
  // когда все файлы получены - сохраняем и возвращаем результат
388
  if ( $main_image_url && $thumbnails_processed ) {
389
  $original_size = 0;
@@ -391,80 +488,80 @@ class WIO_Attachment {
391
  $thumbnails_count = 0;
392
  $original_main_size = filesize( $this->get( 'path' ) );
393
  $original_size = $original_size + $original_main_size;
394
-
395
- $this->replaceOriginalFile( array(
396
  'optimized_img_url' => $main_image_url,
397
- ) );
398
-
399
  clearstatcache();
400
-
401
  $optimized_main_size = filesize( $this->get( 'path' ) );
402
-
403
  // при отрицательной оптимизации ставим значение оригинала
404
  if ( $optimized_main_size > $original_main_size ) {
405
  $optimized_main_size = $original_main_size;
406
  }
407
-
408
  $optimized_size = $optimized_size + $optimized_main_size;
409
-
410
  if ( is_array( $thumbnails['thumbnails'] ) ) {
411
  foreach ( $thumbnails['thumbnails'] as $thumbnail_size => $thumbnail ) {
412
  $thumbnail_file = $this->getImageSizePath( $thumbnail_size );
413
  $original_thumbnail_size = filesize( $thumbnail_file );
414
  $original_size = $original_size + $original_thumbnail_size;
415
-
416
- $this->replaceOriginalFile( array(
417
  'optimized_img_url' => $thumbnail['optimized_img_url'],
418
- ), $thumbnail_size );
419
-
420
  clearstatcache();
421
-
422
  $optimized_thumbnail_size = filesize( $thumbnail_file );
423
-
424
  // при отрицательной оптимизации ставим значение оригинала
425
  if ( $optimized_thumbnail_size > $original_thumbnail_size ) {
426
  $optimized_thumbnail_size = $original_thumbnail_size;
427
  }
428
-
429
  $optimized_size = $optimized_size + $optimized_thumbnail_size;
430
-
431
  $thumbnails_count ++;
432
  }
433
  }
434
-
435
  $mime_type = '';
436
  if ( function_exists( 'wp_get_image_mime' ) ) {
437
  $mime_type = wp_get_image_mime( $this->get( 'path' ) );
438
  }
439
-
440
- $optimization_data->configure( array(
441
  'final_size' => $optimized_size,
442
  'original_size' => $original_size,
443
  'result_status' => 'success',
444
  'original_mime_type' => $mime_type,
445
  'final_mime_type' => $mime_type,
446
- ) );
447
-
448
  $extra_data->set_original_main_size( $original_main_size );
449
  $extra_data->set_thumbnails_count( $thumbnails_count );
450
-
451
  // удаляем промежуточные данные
452
  $extra_data->set_main_optimized_data( null );
453
  $extra_data->set_thumbnails_optimized_data( null );
454
  $extra_data->set_main_optimized_data( null );
455
-
456
  $results['optimized_count'] = 1;
457
  $results['original_size'] = $original_size;
458
  $results['optimized_size'] = $optimized_size;
459
-
460
  unset( $results['processing'] );
461
  }
462
  $optimization_data->set_extra_data( $extra_data );
463
  $optimization_data->save();
464
-
465
  return $results;
466
  }
467
-
468
  /**
469
  * Метод проверяет, оптимизирован ли аттачмент
470
  *
@@ -475,10 +572,10 @@ class WIO_Attachment {
475
  if ( $optimization_data->is_optimized() ) {
476
  return true;
477
  }
478
-
479
  return false;
480
  }
481
-
482
  /**
483
  * Возвращает все размеры аттачмента, которые нужно оптимизировать
484
  *
@@ -486,16 +583,16 @@ class WIO_Attachment {
486
  */
487
  public function getAllowedSizes() {
488
  $allowed_sizes = WRIO_Plugin::app()->getPopulateOption( 'allowed_sizes_thumbnail', 'thumbnail,medium' );
489
-
490
  if ( ! $allowed_sizes ) {
491
  return false;
492
  }
493
-
494
  $allowed_sizes = explode( ',', $allowed_sizes );
495
-
496
  return $allowed_sizes;
497
  }
498
-
499
  /**
500
  * Оптимизация других размеров аттачмента.
501
  *
@@ -503,47 +600,47 @@ class WIO_Attachment {
503
  */
504
  public function optimizeImageSizes() {
505
  $allowed_sizes = $this->getAllowedSizes();
506
-
507
  if ( $allowed_sizes === false ) {
508
- return array();
509
  }
510
-
511
  $image_processor = WIO_OptimizationTools::getImageProcessor();
512
  $quality = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level', 'normal' );
513
-
514
  if ( $quality == 'custom' ) {
515
  $custom_quality = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level_custom', 100 );
516
  $quality = intval( $custom_quality );
517
  }
518
-
519
  $exif = WRIO_Plugin::app()->getPopulateOption( 'save_exif_data', false );
520
-
521
  $original_size = 0;
522
  $optimized_size = 0;
523
  $errors_count = 0;
524
  $optimized_count = 0;
525
- $thumbnails = array();
526
-
527
  foreach ( $allowed_sizes as $image_size ) {
528
  $url = $this->getImageSizeUrl( $image_size );
529
  $path = $this->getImageSizePath( $image_size );
530
-
531
  if ( ! $url || ! $path ) {
532
  continue;
533
  }
534
-
535
  $original_file_size = 0;
536
-
537
  if ( is_file( $path ) ) {
538
  $original_file_size = filesize( $path );
539
  }
540
-
541
- $optimized_img_data = $image_processor->process( array(
542
  'image_url' => $url,
543
  'image_path' => $path,
544
  'quality' => $image_processor->quality( $quality ),
545
  'save_exif' => $exif,
546
- ) );
547
  // проверяем на ошибку
548
  if ( is_wp_error( $optimized_img_data ) ) {
549
  $errors_count ++;
@@ -558,94 +655,94 @@ class WIO_Attachment {
558
  if ( ! $optimized_img_data['src_size'] ) {
559
  $optimized_img_data['src_size'] = $original_file_size;
560
  }
561
-
562
  // при отрицательной оптимизации ставим значение оригинала
563
  if ( $optimized_img_data['optimized_size'] > $original_file_size ) {
564
  $optimized_img_data['optimized_size'] = $original_file_size;
565
  }
566
-
567
  $thumbnails[ $image_size ] = $optimized_img_data;
568
-
569
  //просчитываем статистику
570
  $original_size += $optimized_img_data['src_size'];
571
  $optimized_size += $optimized_img_data['optimized_size'];
572
  $optimized_count ++;
573
  }
574
  }
575
-
576
- return array(
577
  'errors_count' => $errors_count,
578
  'original_size' => $original_size,
579
  'optimized_size' => $optimized_size,
580
  'thumbnails_count' => $optimized_count,
581
  'thumbnails' => $thumbnails,
582
- );
583
  }
584
-
585
  /**
586
  * Возвращает путь.
587
  *
588
- * @param string $image_size Размер(thumbnail, medium ... )
589
  *
590
  * @return string
591
  */
592
  public function getPath( $image_size = '' ) {
593
-
594
  if ( empty( $image_size ) ) {
595
  $path = $this->path;
596
  } else {
597
  $path = $this->getImageSizePath( $image_size );
598
  }
599
-
600
  return $path;
601
  }
602
-
603
  /**
604
  * Заменяет оригинальный файл на оптимизированный.
605
  *
606
- * @param array $optimized_img_data Hезультат оптимизации ввиде массива данных.
607
- * @param string $image_size Размер (thumbnail, medium ... )
608
  *
609
  * @return bool
610
  */
611
  public function replaceOriginalFile( $optimized_img_data, $image_size = '' ) {
612
-
613
  $optimized_img_url = $optimized_img_data['optimized_img_url'];
614
-
615
  if ( isset( $optimized_img_data['not_need_download'] ) && (bool) $optimized_img_data['not_need_download'] ) {
616
  $optimized_file = $optimized_img_url;
617
  } else {
618
  $optimized_file = $this->remoteDownloadImage( $optimized_img_url );
619
  }
620
-
621
  if ( empty( $optimized_file ) ) {
622
  WRIO_Logger::error( sprintf( 'Unable to replace original image with new as failed to download %s', $optimized_img_url ) );
623
-
624
  return false;
625
  }
626
-
627
  if ( isset( $optimized_img_data['not_need_replace'] ) && $optimized_img_data['not_need_replace'] ) {
628
  // если картинка уже оптимизирована и провайдер её не может уменьшить - он может вернуть положительный ответ, но без самой картинки. В таком случае ничего заменять не надо
629
  return true;
630
  }
631
-
632
  $attachment_size_path = $this->getPath( $image_size );
633
-
634
  if ( ! is_file( $attachment_size_path ) ) {
635
  return false;
636
  }
637
-
638
  $bytes = @file_put_contents( $attachment_size_path, $optimized_file );
639
-
640
  if ( $bytes === false ) {
641
  WRIO_Logger::error( sprintf( 'Failed to put new image\'s %s content to %s as file_put_contents() failed', $optimized_img_url, $attachment_size_path ) );
642
-
643
  return false;
644
  }
645
-
646
  return true;
647
  }
648
-
649
  /**
650
  * Скачивание изображения с удалённого сервера
651
  *
@@ -654,44 +751,44 @@ class WIO_Attachment {
654
  * @return string|null Image content on success, NULL on failure.
655
  */
656
  protected function remoteDownloadImage( $url ) {
657
-
658
  if ( ! function_exists( 'curl_version' ) ) {
659
  $content = @file_get_contents( $url );
660
-
661
  if ( $content === false ) {
662
  WRIO_Logger::error( sprintf( 'Failed to get content of "%s" using file_get_contents()', $url ) );
663
-
664
  return null;
665
  }
666
-
667
  return $content;
668
  }
669
-
670
  $ch = curl_init();
671
  curl_setopt( $ch, CURLOPT_HEADER, 0 );
672
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
673
  curl_setopt( $ch, CURLOPT_URL, $url );
674
-
675
  $image_body = curl_exec( $ch );
676
  $http_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
677
  if ( $http_code != '200' ) {
678
  $image_body = false;
679
  }
680
  curl_close( $ch );
681
-
682
  if ( $image_body === false ) {
683
  WRIO_Logger::error( sprintf( 'Failed to get content of "%s" using curl_exec()', $url ) );
684
-
685
  return null;
686
  }
687
-
688
  return $image_body;
689
  }
690
-
691
  /**
692
  * Возвращает свойство аттачмента
693
  *
694
- * @param string $property имя свойства
695
  *
696
  * @return mixed
697
  */
@@ -699,14 +796,14 @@ class WIO_Attachment {
699
  if ( isset( $this->$property ) ) {
700
  return $this->$property;
701
  }
702
-
703
  return false;
704
  }
705
-
706
  /**
707
  * Возвращает URL изображения по указанному размеру
708
  *
709
- * @param string $size - размер изображения(thumbnail,medium,large...)
710
  *
711
  * @return string|null
712
  */
@@ -714,17 +811,17 @@ class WIO_Attachment {
714
  if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
715
  return null;
716
  }
717
-
718
  $file = $this->attachment_meta['sizes'][ $size ]['file'];
719
  $url = str_replace( wp_basename( $this->url ), $file, $this->url );
720
-
721
  return $url;
722
  }
723
-
724
  /**
725
  * Возвращает путь к изображению по указанному размеру.
726
  *
727
- * @param string $size Размер изображения (thumbnail, medium, large ...)
728
  *
729
  * @return string Путь до изображения.
730
  */
@@ -732,13 +829,13 @@ class WIO_Attachment {
732
  if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
733
  return null;
734
  }
735
-
736
  $file = $this->attachment_meta['sizes'][ $size ]['file'];
737
  $path = str_replace( wp_basename( $this->path ), $file, $this->path );
738
-
739
  return $path;
740
  }
741
-
742
  /**
743
  * Проверка необходимости делать изменение размера.
744
  *
@@ -746,18 +843,18 @@ class WIO_Attachment {
746
  */
747
  protected function isNeedResize() {
748
  $resize_large_images = WRIO_Plugin::app()->getPopulateOption( 'resize_larger', true );
749
-
750
  if ( ! $resize_large_images ) {
751
  return false;
752
  }
753
-
754
  $resize_larger_w = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_w', 1600 );
755
  $resize_larger_h = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_h', 1600 );
756
-
757
  if ( ! $resize_larger_w && ! $resize_larger_h ) {
758
  return false;
759
  }
760
-
761
  // если ширина и высота установлены и > 0
762
  if ( $this->attachment_meta['width'] >= $this->attachment_meta['height'] ) {
763
  $larger_side = $this->attachment_meta['width'];
@@ -780,10 +877,10 @@ class WIO_Attachment {
780
  if ( $larger_side <= $resize_larger_side ) {
781
  return false;
782
  }
783
-
784
  return true;
785
  }
786
-
787
  /**
788
  * Возвращает метаданные аттачмента
789
  *
@@ -792,7 +889,7 @@ class WIO_Attachment {
792
  public function getMetaData() {
793
  return $this->attachment_meta;
794
  }
795
-
796
  /**
797
  * Изменяет размер изображения до заданного в настройках размера.
798
  *
@@ -801,19 +898,19 @@ class WIO_Attachment {
801
  protected function resize() {
802
  $resize_larger_h = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_h', 1600 );
803
  $resize_larger_w = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_w', 1600 );
804
-
805
  $image = wp_get_image_editor( $this->path );
806
-
807
  if ( is_wp_error( $image ) ) {
808
  WRIO_Logger::error( sprintf( 'Failed to get image edit via wp_get_image_editor(), error: "%s"', $image->get_error_message() ) );
809
-
810
  return false;
811
  }
812
-
813
  $current_size = $image->get_size();
814
  $new_width = 0;
815
  $new_height = 0;
816
-
817
  // если обе стороны заданы
818
  if ( $resize_larger_h && $resize_larger_w ) {
819
  // определяем большую сторону и по ней маштабируем
@@ -837,38 +934,38 @@ class WIO_Attachment {
837
  $new_height = round( $current_size['height'] * $new_width / $current_size['width'] );
838
  }
839
  }
840
-
841
  $nl = PHP_EOL;
842
  $log_message = sprintf( "\tResize from: %sx%s to %sx%s", $current_size['width'], $current_size['height'], $new_width, $new_height ) . $nl;
843
  $log_message .= sprintf( "\tLarger resize from %sx%s", $resize_larger_w, $resize_larger_h ) . $nl;
844
  $log_message .= sprintf( "\tAbsolute path: %s", $this->path ) . $nl;
845
-
846
  $resize_result = $image->resize( $new_width, $new_height, false );
847
-
848
  if ( is_wp_error( $resize_result ) ) {
849
  $this->writeLog( sprintf( 'Resize error: %s. Details: %s', $resize_result->get_error_messages(), $log_message ) );
850
-
851
  return false;
852
  }
853
-
854
  $save_result = $image->save( $this->path );
855
-
856
  if ( is_wp_error( $save_result ) ) {
857
  $this->writeLog( sprintf( 'Failed to save resized error in db: %s, Details: %s', $save_result->get_error_messages(), $log_message ) );
858
-
859
  return false;
860
  }
861
-
862
  $this->attachment_meta['width'] = $new_width;
863
  $this->attachment_meta['height'] = $new_height;
864
  $this->attachment_meta['old_width'] = $current_size['width'];
865
  $this->attachment_meta['old_height'] = $current_size['height'];
866
-
867
  wp_update_attachment_metadata( $this->id, $this->attachment_meta );
868
-
869
  return true;
870
  }
871
-
872
  /**
873
  * Делает резервную копию
874
  *
@@ -876,10 +973,10 @@ class WIO_Attachment {
876
  */
877
  protected function backup() {
878
  $backup = WIO_Backup::get_instance();
879
-
880
  return $backup->backupAttachment( $this );
881
  }
882
-
883
  /**
884
  * Восстанавливает файлы из резервной копии
885
  *
@@ -887,7 +984,7 @@ class WIO_Attachment {
887
  */
888
  public function restore() {
889
  $backup = WIO_Backup::get_instance();
890
-
891
  return $backup->restoreAttachment( $this );
892
  }
893
  }
8
  /**
9
  * Класс для работы с WordPress attachment.
10
  *
11
+ * @author Eugene Jokerov <jokerov@gmail.com>
12
  * @copyright (c) 2018, Webcraftic
13
+ * @version 1.0
14
  */
15
  class WIO_Attachment {
16
+
17
  /**
18
  * @var int
19
  */
20
  private $id;
21
+
22
+
23
  /**
24
  * @var array meta-данные
25
  */
26
  private $attachment_meta;
27
+
28
  /**
29
  * @var array массив с данными о папке uploads
30
  */
31
  private $wp_upload_dir;
32
+
33
  /**
34
  * @var string
35
  */
36
  private $url;
37
+
38
  /**
39
  * @var string
40
  */
41
  private $path;
42
+
43
  /**
44
  * @var RIO_Process_Queue
45
  */
46
  private $optimization_data;
47
+
48
  /**
49
  * Инициализация аттачмента
50
  *
51
+ * @param int $attachment_id Номер аттачмента из медиабиблиотеки
52
+ * @param array|false $attachment_meta метаданные аттачмента. Ключи массива аналогичны функции wp_get_attachment_metadata
53
  */
54
  public function __construct( $attachment_id, $attachment_meta = false ) {
55
  $this->id = $attachment_id;
56
  $this->wp_upload_dir = wp_upload_dir();
57
  $this->attachment_meta = $attachment_meta;
58
+
59
  if ( ! $attachment_meta ) {
60
  // some meta can be missing due to: https://wordpress.stackexchange.com/q/330174/149161
61
  $this->attachment_meta = wp_get_attachment_metadata( $this->id );
62
  }
63
+
64
+ $this->set_paths();
65
+ }
66
+
67
+ /**
68
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
69
+ * @since 1.3.9
70
+ * @return bool
71
+ */
72
+ public function isset_attachment_meta() {
73
+ return $this->attachment_meta && isset( $this->attachment_meta['file'] );
74
+ }
75
+
76
+ /**
77
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
78
+ * @since 1.3.9
79
+ */
80
+ public function set_paths() {
81
+ if ( ! $this->isset_attachment_meta() ) {
82
+ return;
83
  }
84
+
85
+ $this->url = trailingslashit( $this->wp_upload_dir['baseurl'] ) . $this->attachment_meta['file'];
86
+ $this->path = wp_normalize_path( trailingslashit( $this->wp_upload_dir['basedir'] ) . $this->attachment_meta['file'] );
87
  }
88
+
89
  /**
90
  * Актуализирует мета данные аттачмента и загружает актуальные мета данные и данные по оптимизации из базы.
91
  */
92
+ public function reload( $attachment_meta = [] ) {
93
+ if ( empty( $attachment_meta ) ) {
94
+ $attachment_meta = wp_get_attachment_metadata( $this->id );
95
+ }
96
+ $this->attachment_meta = $attachment_meta;
97
+ $this->optimization_data = new RIO_Process_Queue( [
98
  'object_id' => $this->id,
99
  'object_name' => '',
100
  'item_type' => 'attachment',
101
+ ] );
102
  $this->optimization_data->load();
103
+ $this->set_paths();
104
  }
105
+
106
+ /**
107
+ * Fallback to get attachment meta it can be empty when WordPress failed to create it or invocation
108
+ * of method was produced too soon.
109
+ *
110
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
111
+ * @since 1.3.9
112
+ * @return bool
113
+ */
114
+ public function regenerate_metadata() {
115
+ if ( $this->isset_attachment_meta() ) {
116
+ return true;
117
+ }
118
+
119
+ WRIO_Logger::info( sprintf( 'Try regenerate metadata for attachment #%d', $this->id ) );
120
+
121
+ // Need to remove this filter, as it would start recursion
122
+ remove_filter( 'wp_generate_attachment_metadata', 'WRIO_Media_Library::optimize_after_upload' );
123
+
124
+ $file_path = get_attached_file( $this->id );
125
+
126
+ if ( empty( $file_path ) ) {
127
+ $attachment = get_post( $this->id );
128
+
129
+ if ( empty( $attachment ) || 'attachment' !== $attachment->post_type ) {
130
+ return false;
131
+ }
132
+
133
+ $file_path = wrio_convert_url_to_abs_path( $attachment->guid );
134
+ }
135
+
136
+ if ( empty( $file_path ) || ! file_exists( $file_path ) ) {
137
+ WRIO_Logger::info( sprintf( 'Failed regenerate attachment meta data. Attachment file (%s) doesn\'t exists!', $file_path ) );
138
+
139
+ return false;
140
+ }
141
+
142
+ $attachment_meta = wp_generate_attachment_metadata( $this->id, $file_path );
143
+
144
+ if ( empty( $attachment_meta ) ) {
145
+ WRIO_Logger::error( sprintf( 'Failed regenerate meta data for attachment file (%s).', $file_path ) );
146
+
147
+ return false;
148
+ }
149
+
150
+ WRIO_Logger::debug( sprintf( 'Generated metadata: %s', var_export( $attachment_meta, true ) ) );
151
+
152
+ # Updating metadata in database
153
+ wp_update_attachment_metadata( $this->id, $attachment_meta );
154
+
155
+ $this->reload( $attachment_meta );
156
+
157
+ add_filter( 'wp_generate_attachment_metadata', 'WRIO_Media_Library::optimize_after_upload', 10, 2 );
158
+
159
+ WRIO_Logger::info( sprintf( 'Finish regenerate metadata for attachment #%d!', $this->id ) );
160
+
161
+ return true;
162
+ }
163
+
164
  /**
165
  * Добавляем сообщение в лог файл.
166
  *
167
+ * @param string $message Текст сообщения об ошибке.
168
  */
169
  public function writeLog( $message ) {
170
+
171
  $char = "\t-> ";
172
  $nl = PHP_EOL;
173
+
174
  $error = sprintf( 'Error to optimize attachment (ID: #%s). Message: "%s"', $this->id, trim( $message ) ) . $nl;
175
  $error .= $char . sprintf( "Attachment optimized? %s", ( $this->isOptimized() ? 'Yes' : 'No' ) ) . $nl;
176
  $error .= $char . sprintf( "Should be resized? %s", ( $this->isNeedResize() ? 'Yes' : 'No' ) ) . $nl;
177
  $error .= $char . sprintf( "Original size: %sx%s", $this->attachment_meta['width'], $this->attachment_meta['height'] ) . $nl;
178
  $error .= $char . sprintf( "Relative path: %s", $this->attachment_meta['file'] ) . $nl;
179
  $error .= $char . sprintf( "Server used: %s", WRIO_Plugin::app()->getPopulateOption( 'image_optimization_server', 'server_1' ) ) . $nl;
180
+
181
  if ( ! empty( $this->attachment_meta['sizes'] ) ) {
182
  $error .= $char . ' Additional sizes:' . $nl;
183
  foreach ( $this->attachment_meta['sizes'] as $size_type => $size_info ) {
184
  $error .= "\t" . $char . sprintf( 'Type: %s, size: %sx%s, MIME type: %s', $size_type, $size_info['width'], $size_info['height'], $size_info['mime-type'] ) . $nl;
185
  }
186
  }
187
+
188
  WRIO_Logger::error( $error );
189
  }
190
+
191
  /**
192
  * Возвращает объект с информацией об оптимизации
193
  *
195
  */
196
  public function getOptimizationData() {
197
  if ( ! isset( $optimization_data ) ) {
198
+ $this->optimization_data = new RIO_Process_Queue( [
199
  'object_id' => $this->id,
200
  'object_name' => '',
201
  'item_type' => 'attachment',
202
+ ] );
203
  $this->optimization_data->load();
204
  }
205
+
206
  return $this->optimization_data;
207
  }
208
+
209
  /**
210
  * Оптимизация аттачмента.
211
  *
212
+ * @param string $optimization_level Уровень оптимизации изображения.
213
  *
214
  * @return array
215
  */
216
  public function optimize( $optimization_level = '' ) {
217
+ $optimize_results = [
218
  'original_size' => 0,
219
  'optimized_size' => 0,
220
+ ];
221
+
222
  if ( empty( $optimization_level ) ) {
223
  $optimization_level = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level', 'normal' );
224
  }
225
+
226
  if ( $optimization_level == 'custom' ) {
227
  $custom_quality = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level_custom', 100 );
228
  $optimization_level = intval( $custom_quality );
229
  }
230
+
231
  $optimization_data = $this->getOptimizationData();
232
+ $results = [
233
  'original_size' => 0,
234
  'final_size' => 0,
235
  'original_mime_type' => '',
236
  'final_mime_type' => '',
237
+ ];
238
  $results['processing_level'] = $optimization_level;
239
+
240
+ # The path may be empty because no metadata has been created for the image.
241
+ # We should try to create image metadata again.
242
+ if ( ! $this->isset_attachment_meta() ) {
243
+ WRIO_Logger::warning( sprintf( 'Attachment #%d doesn\'t have metadata.', $this->id ) );
244
+
245
+ $this->regenerate_metadata();
246
+ }
247
+
248
+ if ( empty( $this->path ) || ! file_exists( $this->path ) ) {
249
  $results['result_status'] = 'error';
250
+
251
+ $error_message = __( 'Attachment cannot be optimized.', 'robin-image-optimizer' );
252
+
253
+ if ( empty( $this->path ) ) {
254
+ $error_message .= ' ' . sprintf( __( 'Attachment #%d doesn\'t have metadata, the image may be damaged.', 'robin-image-optimizer' ), $this->id );
255
+ } else {
256
+ $error_message .= ' ' . sprintf( __( 'File "(%s)" doesn\'t exist', 'robin-image-optimizer' ), $this->path );
257
+ }
258
+
259
+ $extra_data = [
260
  'error' => 'path',
261
+ 'error_msg' => $error_message,
262
+ ];
263
+
264
+ $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
265
  $optimization_data->configure( $results );
266
  $optimization_data->save();
267
+
268
  WRIO_Logger::error( sprintf( 'Failed to find original attachment #%s located in %s. Skipping optimization. This may be caused due to bug in %s function, which returns false for attachment meta', $this->id, empty( $path ) ? '*empty path*' : $path, 'wp_get_attachment_metadata()' ) );
269
+
270
  return $optimize_results;
271
  }
272
+
273
  // сначала бекапим
274
  $is_image_backuped = $this->backup();
275
+
276
  if ( is_wp_error( $is_image_backuped ) ) {
277
  $error_msg = $is_image_backuped->get_error_message();
278
  $this->writeLog( $error_msg );
279
+
280
  $results['result_status'] = 'error';
281
+ $extra_data = [
282
  'error' => 'backup',
283
  'error_msg' => 'Failed to backup',
284
+ ];
285
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
286
  $optimization_data->configure( $results );
287
  $optimization_data->save();
288
+
289
  WRIO_Logger::error( sprintf( 'Failed to make backup of original attachment #%s. Skipping optimization.', $this->id ) );
290
+
291
  return $optimize_results;
292
  }
293
+
294
  $results['is_backed_up'] = $is_image_backuped;
295
+
296
+ $original_main_size = filesize( $this->path );
297
+
298
  // если файл большой - изменяем размер
299
  if ( $this->isNeedResize() ) {
300
  $this->resize();
301
  }
302
+
303
  $image_processor = WIO_OptimizationTools::getImageProcessor();
304
+
305
  clearstatcache(); // на всякий случай очистим кеш файловой статистики
306
+
307
+ $optimized_img_data = $image_processor->process( [
308
  'image_url' => $this->get( 'url' ),
309
  'image_path' => $this->get( 'path' ),
310
  'quality' => $image_processor->quality( $optimization_level ),
311
  'save_exif' => WRIO_Plugin::app()->getPopulateOption( 'save_exif_data', false ),
312
+ ] );
313
+
314
  // проверяем на ошибку
315
  if ( is_wp_error( $optimized_img_data ) ) {
316
  $error_msg = $optimized_img_data->get_error_message();
317
  $this->writeLog( $error_msg );
318
+
319
  $results['result_status'] = 'error';
320
+
321
+ $extra_data = [
322
  'error' => 'optimization',
323
  'error_msg' => $error_msg,
324
+ ];
325
+
326
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
327
+
328
  $optimization_data->configure( $results );
329
  $optimization_data->save();
330
+
331
  WRIO_Logger::error( sprintf( 'Failed to process (url: %s, path: %s, quality: %s) as error was returned: %s', $this->get( 'url' ), $this->get( 'path' ), $image_processor->quality( $optimization_level ), $error_msg ) );
332
+
333
  return $optimize_results;
334
  }
335
+
336
  $results['original_mime_type'] = '';
337
  $results['final_mime_type'] = '';
338
+
339
  // отложенная оптимизация
340
  if ( isset( $optimized_img_data['status'] ) && $optimized_img_data['status'] == 'processing' ) {
341
  $results['result_status'] = 'processing';
342
  $results['original_size'] = 0;
343
  $results['final_size'] = 0;
344
+
345
+ $extra_data = [
346
  'main_optimized_data' => $optimized_img_data,
347
  'thumbnails_optimized_data' => $this->optimizeImageSizes(),
348
+ ];
349
+
350
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
351
+
352
  $optimization_data->configure( $results );
353
  $optimization_data->save();
354
  $optimize_results['processing'] = 1;
355
+
356
  return $optimize_results;
357
  }
358
+
359
  //скачиваем и заменяем главную картинку
360
  $image_downloaded = $this->replaceOriginalFile( $optimized_img_data );
361
+
362
  // некоторые провайдеры не отдают оптимизированный размер, поэтому после замены файла получаем его сами
363
  if ( ! $optimized_img_data['optimized_size'] ) {
364
  clearstatcache();
365
  $optimized_img_data['optimized_size'] = filesize( $this->get( 'path' ) );
366
  }
367
+
368
  // при отрицательной оптимизации ставим значение оригинала
369
  if ( $optimized_img_data['optimized_size'] > $original_main_size ) {
370
  $optimized_img_data['optimized_size'] = $original_main_size;
371
  }
372
+
373
  if ( $image_downloaded ) {
374
  //просчитываем статистику
375
  $optimize_results['original_size'] += $original_main_size;
376
  $optimize_results['optimized_size'] += $optimized_img_data['optimized_size'];
377
  $thumbnails_count = 0;
378
+
379
  // оптимизируем дополнительные размеры
380
  $optimized_img_sizes_data = $this->optimizeImageSizes();
381
+
382
  // добавляем к статистике данные по оптимизации доп размеров
383
  if ( ! empty( $optimized_img_sizes_data ) ) {
384
  $optimize_results['original_size'] += $optimized_img_sizes_data['original_size'];
385
  $optimize_results['optimized_size'] += $optimized_img_sizes_data['optimized_size'];
386
  $thumbnails_count = $optimized_img_sizes_data['thumbnails_count'];
387
  }
388
+
389
  $results['result_status'] = 'success';
390
  $results['final_size'] = $optimize_results['optimized_size'];
391
  $results['original_size'] = $optimize_results['original_size'];
392
+
393
+ $extra_data = [
394
  'thumbnails_count' => $thumbnails_count,
395
  'original_main_size' => $original_main_size,
396
+ ];
397
+
398
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
399
  $mime_type = '';
400
+
401
  if ( function_exists( 'wp_get_image_mime' ) ) {
402
  $mime_type = wp_get_image_mime( $this->get( 'path' ) );
403
  } else {
404
  WRIO_Logger::error( 'App is missing wp_get_image_mime() function, unable to get MIME type' );
405
  }
406
+
407
  $results['original_mime_type'] = $mime_type;
408
  $results['final_mime_type'] = $mime_type;
409
  $optimization_data->configure( $results );
410
  } else {
411
  $error_msg = 'Failed to get optimized image from remote server';
412
  $this->writeLog( $error_msg );
413
+
414
  $results['result_status'] = 'error';
415
+
416
+ $extra_data = [
417
  'error' => 'download',
418
  'error_msg' => $error_msg,
419
+ ];
420
+
421
  $results['extra_data'] = new RIO_Attachment_Extra_Data( $extra_data );
422
  $optimization_data->configure( $results );
423
  }
424
+
425
  $optimization_data->save();
426
+
427
  return $optimize_results;
428
  }
429
+
430
  /**
431
  * Отложенная оптимизация аттачмента
432
  *
433
  * @return bool|array
434
  */
435
  public function deferredOptimization() {
436
+ $results = [
437
  'original_size' => 0,
438
  'optimized_size' => 0,
439
  'optimized_count' => 0,
440
  'processing' => 1,
441
+ ];
442
+
443
  $image_processor = WIO_OptimizationTools::getImageProcessor();
444
  $optimization_data = $this->getOptimizationData();
445
+
446
  if ( $optimization_data->get_result_status() != 'processing' ) {
447
  return false;
448
  }
449
+
450
  // проверяем главную картинку
451
  /**
452
  * @var RIO_Attachment_Extra_Data $extra_data
454
  $extra_data = $optimization_data->get_extra_data();
455
  $main_optimized_data = $extra_data->get_main_optimized_data();
456
  $main_image_url = '';
457
+
458
  if ( ! $main_optimized_data['optimized_img_url'] ) {
459
  $main_image_url = $image_processor->checkDeferredOptimization( $main_optimized_data );
460
  if ( $main_image_url ) {
462
  $extra_data->set_main_optimized_data( $main_optimized_data );
463
  }
464
  }
465
+
466
  $thumbnails_processed = true;
467
  $thumbnails = (array) $extra_data->get_thumbnails_optimized_data();
468
  $thumbnails = json_decode( json_encode( $thumbnails ), true ); // рекурсивная конвертация объекта в массив
469
+
470
  if ( is_array( $thumbnails['thumbnails'] ) ) {
471
  foreach ( $thumbnails['thumbnails'] as &$thumbnail_optimized_data ) {
472
  if ( ! $thumbnail_optimized_data['optimized_img_url'] ) {
480
  }
481
  $extra_data->set_thumbnails_optimized_data( $thumbnails );
482
  }
483
+
484
  // когда все файлы получены - сохраняем и возвращаем результат
485
  if ( $main_image_url && $thumbnails_processed ) {
486
  $original_size = 0;
488
  $thumbnails_count = 0;
489
  $original_main_size = filesize( $this->get( 'path' ) );
490
  $original_size = $original_size + $original_main_size;
491
+
492
+ $this->replaceOriginalFile( [
493
  'optimized_img_url' => $main_image_url,
494
+ ] );
495
+
496
  clearstatcache();
497
+
498
  $optimized_main_size = filesize( $this->get( 'path' ) );
499
+
500
  // при отрицательной оптимизации ставим значение оригинала
501
  if ( $optimized_main_size > $original_main_size ) {
502
  $optimized_main_size = $original_main_size;
503
  }
504
+
505
  $optimized_size = $optimized_size + $optimized_main_size;
506
+
507
  if ( is_array( $thumbnails['thumbnails'] ) ) {
508
  foreach ( $thumbnails['thumbnails'] as $thumbnail_size => $thumbnail ) {
509
  $thumbnail_file = $this->getImageSizePath( $thumbnail_size );
510
  $original_thumbnail_size = filesize( $thumbnail_file );
511
  $original_size = $original_size + $original_thumbnail_size;
512
+
513
+ $this->replaceOriginalFile( [
514
  'optimized_img_url' => $thumbnail['optimized_img_url'],
515
+ ], $thumbnail_size );
516
+
517
  clearstatcache();
518
+
519
  $optimized_thumbnail_size = filesize( $thumbnail_file );
520
+
521
  // при отрицательной оптимизации ставим значение оригинала
522
  if ( $optimized_thumbnail_size > $original_thumbnail_size ) {
523
  $optimized_thumbnail_size = $original_thumbnail_size;
524
  }
525
+
526
  $optimized_size = $optimized_size + $optimized_thumbnail_size;
527
+
528
  $thumbnails_count ++;
529
  }
530
  }
531
+
532
  $mime_type = '';
533
  if ( function_exists( 'wp_get_image_mime' ) ) {
534
  $mime_type = wp_get_image_mime( $this->get( 'path' ) );
535
  }
536
+
537
+ $optimization_data->configure( [
538
  'final_size' => $optimized_size,
539
  'original_size' => $original_size,
540
  'result_status' => 'success',
541
  'original_mime_type' => $mime_type,
542
  'final_mime_type' => $mime_type,
543
+ ] );
544
+
545
  $extra_data->set_original_main_size( $original_main_size );
546
  $extra_data->set_thumbnails_count( $thumbnails_count );
547
+
548
  // удаляем промежуточные данные
549
  $extra_data->set_main_optimized_data( null );
550
  $extra_data->set_thumbnails_optimized_data( null );
551
  $extra_data->set_main_optimized_data( null );
552
+
553
  $results['optimized_count'] = 1;
554
  $results['original_size'] = $original_size;
555
  $results['optimized_size'] = $optimized_size;
556
+
557
  unset( $results['processing'] );
558
  }
559
  $optimization_data->set_extra_data( $extra_data );
560
  $optimization_data->save();
561
+
562
  return $results;
563
  }
564
+
565
  /**
566
  * Метод проверяет, оптимизирован ли аттачмент
567
  *
572
  if ( $optimization_data->is_optimized() ) {
573
  return true;
574
  }
575
+
576
  return false;
577
  }
578
+
579
  /**
580
  * Возвращает все размеры аттачмента, которые нужно оптимизировать
581
  *
583
  */
584
  public function getAllowedSizes() {
585
  $allowed_sizes = WRIO_Plugin::app()->getPopulateOption( 'allowed_sizes_thumbnail', 'thumbnail,medium' );
586
+
587
  if ( ! $allowed_sizes ) {
588
  return false;
589
  }
590
+
591
  $allowed_sizes = explode( ',', $allowed_sizes );
592
+
593
  return $allowed_sizes;
594
  }
595
+
596
  /**
597
  * Оптимизация других размеров аттачмента.
598
  *
600
  */
601
  public function optimizeImageSizes() {
602
  $allowed_sizes = $this->getAllowedSizes();
603
+
604
  if ( $allowed_sizes === false ) {
605
+ return [];
606
  }
607
+
608
  $image_processor = WIO_OptimizationTools::getImageProcessor();
609
  $quality = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level', 'normal' );
610
+
611
  if ( $quality == 'custom' ) {
612
  $custom_quality = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level_custom', 100 );
613
  $quality = intval( $custom_quality );
614
  }
615
+
616
  $exif = WRIO_Plugin::app()->getPopulateOption( 'save_exif_data', false );
617
+
618
  $original_size = 0;
619
  $optimized_size = 0;
620
  $errors_count = 0;
621
  $optimized_count = 0;
622
+ $thumbnails = [];
623
+
624
  foreach ( $allowed_sizes as $image_size ) {
625
  $url = $this->getImageSizeUrl( $image_size );
626
  $path = $this->getImageSizePath( $image_size );
627
+
628
  if ( ! $url || ! $path ) {
629
  continue;
630
  }
631
+
632
  $original_file_size = 0;
633
+
634
  if ( is_file( $path ) ) {
635
  $original_file_size = filesize( $path );
636
  }
637
+
638
+ $optimized_img_data = $image_processor->process( [
639
  'image_url' => $url,
640
  'image_path' => $path,
641
  'quality' => $image_processor->quality( $quality ),
642
  'save_exif' => $exif,
643
+ ] );
644
  // проверяем на ошибку
645
  if ( is_wp_error( $optimized_img_data ) ) {
646
  $errors_count ++;
655
  if ( ! $optimized_img_data['src_size'] ) {
656
  $optimized_img_data['src_size'] = $original_file_size;
657
  }
658
+
659
  // при отрицательной оптимизации ставим значение оригинала
660
  if ( $optimized_img_data['optimized_size'] > $original_file_size ) {
661
  $optimized_img_data['optimized_size'] = $original_file_size;
662
  }
663
+
664
  $thumbnails[ $image_size ] = $optimized_img_data;
665
+
666
  //просчитываем статистику
667
  $original_size += $optimized_img_data['src_size'];
668
  $optimized_size += $optimized_img_data['optimized_size'];
669
  $optimized_count ++;
670
  }
671
  }
672
+
673
+ return [
674
  'errors_count' => $errors_count,
675
  'original_size' => $original_size,
676
  'optimized_size' => $optimized_size,
677
  'thumbnails_count' => $optimized_count,
678
  'thumbnails' => $thumbnails,
679
+ ];
680
  }
681
+
682
  /**
683
  * Возвращает путь.
684
  *
685
+ * @param string $image_size Размер(thumbnail, medium ... )
686
  *
687
  * @return string
688
  */
689
  public function getPath( $image_size = '' ) {
690
+
691
  if ( empty( $image_size ) ) {
692
  $path = $this->path;
693
  } else {
694
  $path = $this->getImageSizePath( $image_size );
695
  }
696
+
697
  return $path;
698
  }
699
+
700
  /**
701
  * Заменяет оригинальный файл на оптимизированный.
702
  *
703
+ * @param array $optimized_img_data Hезультат оптимизации ввиде массива данных.
704
+ * @param string $image_size Размер (thumbnail, medium ... )
705
  *
706
  * @return bool
707
  */
708
  public function replaceOriginalFile( $optimized_img_data, $image_size = '' ) {
709
+
710
  $optimized_img_url = $optimized_img_data['optimized_img_url'];
711
+
712
  if ( isset( $optimized_img_data['not_need_download'] ) && (bool) $optimized_img_data['not_need_download'] ) {
713
  $optimized_file = $optimized_img_url;
714
  } else {
715
  $optimized_file = $this->remoteDownloadImage( $optimized_img_url );
716
  }
717
+
718
  if ( empty( $optimized_file ) ) {
719
  WRIO_Logger::error( sprintf( 'Unable to replace original image with new as failed to download %s', $optimized_img_url ) );
720
+
721
  return false;
722
  }
723
+
724
  if ( isset( $optimized_img_data['not_need_replace'] ) && $optimized_img_data['not_need_replace'] ) {
725
  // если картинка уже оптимизирована и провайдер её не может уменьшить - он может вернуть положительный ответ, но без самой картинки. В таком случае ничего заменять не надо
726
  return true;
727
  }
728
+
729
  $attachment_size_path = $this->getPath( $image_size );
730
+
731
  if ( ! is_file( $attachment_size_path ) ) {
732
  return false;
733
  }
734
+
735
  $bytes = @file_put_contents( $attachment_size_path, $optimized_file );
736
+
737
  if ( $bytes === false ) {
738
  WRIO_Logger::error( sprintf( 'Failed to put new image\'s %s content to %s as file_put_contents() failed', $optimized_img_url, $attachment_size_path ) );
739
+
740
  return false;
741
  }
742
+
743
  return true;
744
  }
745
+
746
  /**
747
  * Скачивание изображения с удалённого сервера
748
  *
751
  * @return string|null Image content on success, NULL on failure.
752
  */
753
  protected function remoteDownloadImage( $url ) {
754
+
755
  if ( ! function_exists( 'curl_version' ) ) {
756
  $content = @file_get_contents( $url );
757
+
758
  if ( $content === false ) {
759
  WRIO_Logger::error( sprintf( 'Failed to get content of "%s" using file_get_contents()', $url ) );
760
+
761
  return null;
762
  }
763
+
764
  return $content;
765
  }
766
+
767
  $ch = curl_init();
768
  curl_setopt( $ch, CURLOPT_HEADER, 0 );
769
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
770
  curl_setopt( $ch, CURLOPT_URL, $url );
771
+
772
  $image_body = curl_exec( $ch );
773
  $http_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
774
  if ( $http_code != '200' ) {
775
  $image_body = false;
776
  }
777
  curl_close( $ch );
778
+
779
  if ( $image_body === false ) {
780
  WRIO_Logger::error( sprintf( 'Failed to get content of "%s" using curl_exec()', $url ) );
781
+
782
  return null;
783
  }
784
+
785
  return $image_body;
786
  }
787
+
788
  /**
789
  * Возвращает свойство аттачмента
790
  *
791
+ * @param string $property имя свойства
792
  *
793
  * @return mixed
794
  */
796
  if ( isset( $this->$property ) ) {
797
  return $this->$property;
798
  }
799
+
800
  return false;
801
  }
802
+
803
  /**
804
  * Возвращает URL изображения по указанному размеру
805
  *
806
+ * @param string $size - размер изображения(thumbnail,medium,large...)
807
  *
808
  * @return string|null
809
  */
811
  if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
812
  return null;
813
  }
814
+
815
  $file = $this->attachment_meta['sizes'][ $size ]['file'];
816
  $url = str_replace( wp_basename( $this->url ), $file, $this->url );
817
+
818
  return $url;
819
  }
820
+
821
  /**
822
  * Возвращает путь к изображению по указанному размеру.
823
  *
824
+ * @param string $size Размер изображения (thumbnail, medium, large ...)
825
  *
826
  * @return string Путь до изображения.
827
  */
829
  if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
830
  return null;
831
  }
832
+
833
  $file = $this->attachment_meta['sizes'][ $size ]['file'];
834
  $path = str_replace( wp_basename( $this->path ), $file, $this->path );
835
+
836
  return $path;
837
  }
838
+
839
  /**
840
  * Проверка необходимости делать изменение размера.
841
  *
843
  */
844
  protected function isNeedResize() {
845
  $resize_large_images = WRIO_Plugin::app()->getPopulateOption( 'resize_larger', true );
846
+
847
  if ( ! $resize_large_images ) {
848
  return false;
849
  }
850
+
851
  $resize_larger_w = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_w', 1600 );
852
  $resize_larger_h = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_h', 1600 );
853
+
854
  if ( ! $resize_larger_w && ! $resize_larger_h ) {
855
  return false;
856
  }
857
+
858
  // если ширина и высота установлены и > 0
859
  if ( $this->attachment_meta['width'] >= $this->attachment_meta['height'] ) {
860
  $larger_side = $this->attachment_meta['width'];
877
  if ( $larger_side <= $resize_larger_side ) {
878
  return false;
879
  }
880
+
881
  return true;
882
  }
883
+
884
  /**
885
  * Возвращает метаданные аттачмента
886
  *
889
  public function getMetaData() {
890
  return $this->attachment_meta;
891
  }
892
+
893
  /**
894
  * Изменяет размер изображения до заданного в настройках размера.
895
  *
898
  protected function resize() {
899
  $resize_larger_h = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_h', 1600 );
900
  $resize_larger_w = (int) WRIO_Plugin::app()->getPopulateOption( 'resize_larger_w', 1600 );
901
+
902
  $image = wp_get_image_editor( $this->path );
903
+
904
  if ( is_wp_error( $image ) ) {
905
  WRIO_Logger::error( sprintf( 'Failed to get image edit via wp_get_image_editor(), error: "%s"', $image->get_error_message() ) );
906
+
907
  return false;
908
  }
909
+
910
  $current_size = $image->get_size();
911
  $new_width = 0;
912
  $new_height = 0;
913
+
914
  // если обе стороны заданы
915
  if ( $resize_larger_h && $resize_larger_w ) {
916
  // определяем большую сторону и по ней маштабируем
934
  $new_height = round( $current_size['height'] * $new_width / $current_size['width'] );
935
  }
936
  }
937
+
938
  $nl = PHP_EOL;
939
  $log_message = sprintf( "\tResize from: %sx%s to %sx%s", $current_size['width'], $current_size['height'], $new_width, $new_height ) . $nl;
940
  $log_message .= sprintf( "\tLarger resize from %sx%s", $resize_larger_w, $resize_larger_h ) . $nl;
941
  $log_message .= sprintf( "\tAbsolute path: %s", $this->path ) . $nl;
942
+
943
  $resize_result = $image->resize( $new_width, $new_height, false );
944
+
945
  if ( is_wp_error( $resize_result ) ) {
946
  $this->writeLog( sprintf( 'Resize error: %s. Details: %s', $resize_result->get_error_messages(), $log_message ) );
947
+
948
  return false;
949
  }
950
+
951
  $save_result = $image->save( $this->path );
952
+
953
  if ( is_wp_error( $save_result ) ) {
954
  $this->writeLog( sprintf( 'Failed to save resized error in db: %s, Details: %s', $save_result->get_error_messages(), $log_message ) );
955
+
956
  return false;
957
  }
958
+
959
  $this->attachment_meta['width'] = $new_width;
960
  $this->attachment_meta['height'] = $new_height;
961
  $this->attachment_meta['old_width'] = $current_size['width'];
962
  $this->attachment_meta['old_height'] = $current_size['height'];
963
+
964
  wp_update_attachment_metadata( $this->id, $this->attachment_meta );
965
+
966
  return true;
967
  }
968
+
969
  /**
970
  * Делает резервную копию
971
  *
973
  */
974
  protected function backup() {
975
  $backup = WIO_Backup::get_instance();
976
+
977
  return $backup->backupAttachment( $this );
978
  }
979
+
980
  /**
981
  * Восстанавливает файлы из резервной копии
982
  *
984
  */
985
  public function restore() {
986
  $backup = WIO_Backup::get_instance();
987
+
988
  return $backup->restoreAttachment( $this );
989
  }
990
  }
includes/classes/class-rio-image-statistic.php CHANGED
@@ -135,7 +135,7 @@ class WRIO_Image_Statistic {
135
  $optimized_count = 0;
136
  }
137
  // unoptimized count: all - optimized - error
138
- $unoptimized_count = $this->getUnoptimizedCount();
139
  if ( $unoptimized_count < 0 ) {
140
  $unoptimized_count = 0;
141
  }
@@ -147,7 +147,7 @@ class WRIO_Image_Statistic {
147
  $percent_diff_line = 100;
148
  }
149
  if ( $total_images ) {
150
- $optimized_images_percent = round( $optimized_count * 100 / $total_images );
151
  } else {
152
  $optimized_images_percent = 0;
153
  }
@@ -166,9 +166,13 @@ class WRIO_Image_Statistic {
166
  }
167
 
168
  /**
169
- * Кол-во неоптимизированных изображений
 
 
 
 
170
  */
171
- public function getUnoptimizedCount() {
172
  global $wpdb;
173
  $db_table = RIO_Process_Queue::table_name();
174
 
@@ -181,57 +185,112 @@ class WRIO_Image_Statistic {
181
 
182
  $total_images = $wpdb->get_var( $sql_unoptimized );
183
 
184
- return $total_images;
185
  }
186
 
187
  /**
188
  * Возвращает результат последних оптимизаций изображений
189
  *
190
- * @param int $limit лимит
191
  *
192
  * @return array {
193
- * Параметры
194
- * {type} string $id id
195
- * {type} string $file_name Имя файла
196
- * {type} string $url URL
197
- * {type} string $thumbnail_url URL превьюшки
198
- * {type} string $original_size Размер до оптимизации
199
- * {type} string $optimized_size Размер после оптимизации
200
- * {type} string $webp_enabled webP включен
201
- * {type} string $webp_size webP размер
202
- * {type} string $original_saving На сколько процентов изменился главный файл
203
- * {type} string $thumbnails_count Сколько превьюшек оптимизировано
204
- * {type} string $total_saving Процент оптимизации главного файла и превьюшек
205
  * }
206
  */
207
  public function get_last_optimized_images( $limit = 100 ) {
208
  global $wpdb;
209
 
210
- $logs = [];
211
  $db_table = RIO_Process_Queue::table_name();
212
- $sql = $wpdb->prepare( "SELECT t1.*,t2.meta_value as attachment_meta
213
- FROM {$db_table} as t1
214
- LEFT JOIN {$wpdb->prefix}postmeta as t2 ON t1.object_id = t2.post_id
215
- WHERE t2.meta_key = '_wp_attachment_metadata' AND t1.item_type = 'attachment' AND t1.result_status IN (%s, %s)
216
  ORDER BY id DESC
217
  LIMIT %d ;", RIO_Process_Queue::STATUS_SUCCESS, RIO_Process_Queue::STATUS_ERROR, $limit );
218
 
219
- $optimized_images = $wpdb->get_results( $sql );
220
 
221
- if ( empty( $optimized_images ) ) {
222
- return $logs;
 
 
223
  }
224
 
225
- $upload_dir = wp_upload_dir();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
 
227
- if ( isset( $upload_dir['error'] ) && $upload_dir['error'] !== false ) {
228
- return $logs;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
  }
230
 
231
- foreach ( $optimized_images as $row ) {
232
- $optimization_data = new RIO_Process_Queue( $row );
233
- $attachment_meta = unserialize( $row->attachment_meta );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
 
 
 
 
235
  $image_url = trailingslashit( $upload_dir['baseurl'] ) . $attachment_meta['file'];
236
  $thumbnail_url = $image_url;
237
 
@@ -240,58 +299,65 @@ class WRIO_Image_Statistic {
240
  $thumbnail_url = str_replace( $image_basename, $attachment_meta['sizes']['thumbnail']['file'], $image_url );
241
  }
242
 
243
- $item = [
244
- 'id' => $row->id,
245
- 'url' => $image_url,
246
- 'thumbnail_url' => $thumbnail_url,
247
- 'file_name' => wp_basename( $attachment_meta['file'] ),
248
- 'original_size' => size_format( $row->original_size, 2 ),
249
- 'optimized_size' => size_format( $row->final_size, 2 ),
250
- 'type' => 'success',
251
- 'webp_size' => null,
252
- 'original_saving' => 0,
253
- 'thumbnails_count' => 0,
254
- 'total_saving' => 0,
255
- ];
256
 
257
  $main_file = trailingslashit( $upload_dir['basedir'] ) . $attachment_meta['file'];
258
 
259
- /**
260
- * @var RIO_Attachment_Extra_Data $extra_data
261
- */
262
- $extra_data = $optimization_data->get_extra_data();
263
-
264
  if ( ! empty( $extra_data ) ) {
265
  $original_main_size = $extra_data->get_original_main_size();
266
 
267
  if ( $original_main_size && file_exists( $main_file ) ) {
268
- $original_saving = ( $original_main_size - filesize( $main_file ) ) * 100 / $original_main_size;
269
- $item['original_saving'] = round( $original_saving ) . '%';
270
  }
271
 
272
  $webp_size = $extra_data->get_webp_main_size();
273
 
274
  if ( $webp_size ) {
275
- $item['webp_size'] = size_format( $webp_size, 2 );
276
  }
277
 
278
- $item['thumbnails_count'] = $extra_data->get_thumbnails_count();
 
279
 
280
- if ( $row->result_status == RIO_Process_Queue::STATUS_ERROR || ! empty( $error ) ) {
281
- $item['type'] = 'error';
282
- $item['error_msg'] = $extra_data->get_error_msg();
283
- }
 
 
 
 
 
 
 
 
284
  }
285
 
286
- if ( $row->original_size ) {
287
- $total_saving = ( $row->original_size - $row->final_size ) * 100 / $row->original_size;
288
- $item['total_saving'] = round( $total_saving, 2 ) . '%';
 
 
 
 
 
 
289
  }
290
 
291
- $logs[] = $item;
 
 
 
292
  }
293
 
294
- return $logs;
295
  }
296
 
297
  /**
135
  $optimized_count = 0;
136
  }
137
  // unoptimized count: all - optimized - error
138
+ $unoptimized_count = static::get_unoptimized_count();
139
  if ( $unoptimized_count < 0 ) {
140
  $unoptimized_count = 0;
141
  }
147
  $percent_diff_line = 100;
148
  }
149
  if ( $total_images ) {
150
+ $optimized_images_percent = floor( $optimized_count * 100 / $total_images );
151
  } else {
152
  $optimized_images_percent = 0;
153
  }
166
  }
167
 
168
  /**
169
+ * Count of non-optimized images
170
+ *
171
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
172
+ * @since 1.3.6
173
+ * @return int
174
  */
175
+ public static function get_unoptimized_count() {
176
  global $wpdb;
177
  $db_table = RIO_Process_Queue::table_name();
178
 
185
 
186
  $total_images = $wpdb->get_var( $sql_unoptimized );
187
 
188
+ return (int) $total_images;
189
  }
190
 
191
  /**
192
  * Возвращает результат последних оптимизаций изображений
193
  *
194
+ * @param int $limit лимит
195
  *
196
  * @return array {
197
+ * Параметры
198
+ * @type string $id id
199
+ * @type string $file_name Имя файла
200
+ * @type string $url URL
201
+ * @type string $thumbnail_url URL превьюшки
202
+ * @type string $original_size Размер до оптимизации
203
+ * @type string $optimized_size Размер после оптимизации
204
+ * @type string $webp_size webP размер
205
+ * @type string $original_saving На сколько процентов изменился главный файл
206
+ * @type string $thumbnails_count Сколько превьюшек оптимизировано
207
+ * @type string $total_saving Процент оптимизации главного файла и превьюшек
 
208
  * }
209
  */
210
  public function get_last_optimized_images( $limit = 100 ) {
211
  global $wpdb;
212
 
213
+ $items = [];
214
  $db_table = RIO_Process_Queue::table_name();
215
+ $sql = $wpdb->prepare( "SELECT * FROM {$db_table}
216
+ WHERE item_type = 'attachment' AND result_status IN (%s, %s)
 
 
217
  ORDER BY id DESC
218
  LIMIT %d ;", RIO_Process_Queue::STATUS_SUCCESS, RIO_Process_Queue::STATUS_ERROR, $limit );
219
 
220
+ $optimized_images = $wpdb->get_results( $sql, ARRAY_A );
221
 
222
+ if ( ! empty( $optimized_images ) ) {
223
+ foreach ( $optimized_images as $row ) {
224
+ $items[] = $this->format_for_log( new RIO_Process_Queue( $row ) );
225
+ }
226
  }
227
 
228
+ return $items;
229
+ }
230
+
231
+ /**
232
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
233
+ * @since 1.3.9
234
+ *
235
+ * @param int $object_id
236
+ */
237
+ public function get_last_optimized_image( $object_id ) {
238
+ global $wpdb;
239
+
240
+ $items = [];
241
+ $db_table = RIO_Process_Queue::table_name();
242
+ $sql = $wpdb->prepare( "SELECT * FROM {$db_table}
243
+ WHERE object_id = '%d' AND item_type = 'attachment' AND result_status IN (%s, %s)
244
+ ORDER BY id DESC
245
+ LIMIT 1;", (int) $object_id, RIO_Process_Queue::STATUS_SUCCESS, RIO_Process_Queue::STATUS_ERROR );
246
+
247
+ $model = $wpdb->get_row( $sql, ARRAY_A );
248
 
249
+ if ( ! empty( $model ) ) {
250
+ $items[] = $this->format_for_log( new RIO_Process_Queue( $model ) );
251
+ }
252
+
253
+ return $items;
254
+ }
255
+
256
+ /**
257
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
258
+ * @since 1.3.9
259
+ *
260
+ * @param RIO_Process_Queue $queue_model
261
+ *
262
+ * @return array
263
+ * @throws \Exception
264
+ */
265
+ protected function format_for_log( $queue_model ) {
266
+ if ( ! $queue_model instanceof RIO_Process_Queue ) {
267
+ throw new Exception( 'Variable $queue_model must be an instance of RIO_Process_Queue!' );
268
  }
269
 
270
+ /**
271
+ * @var RIO_Attachment_Extra_Data $extra_data
272
+ */
273
+ $extra_data = $queue_model->get_extra_data();
274
+
275
+ $default_formated_data = [
276
+ 'id' => $queue_model->get_id(),
277
+ 'url' => admin_url( sprintf( "post.php?post=%d&action=edit", $queue_model->get_object_id() ) ),
278
+ 'thumbnail_url' => null,
279
+ 'file_name' => null,
280
+ 'original_size' => 0,
281
+ 'optimized_size' => 0,
282
+ 'type' => 'success',
283
+ 'webp_size' => null,
284
+ 'original_saving' => 0,
285
+ 'thumbnails_count' => 0,
286
+ 'total_saving' => 0,
287
+ ];
288
+
289
+ $upload_dir = wp_upload_dir();
290
 
291
+ $attachment_meta = wp_get_attachment_metadata( $queue_model->get_object_id() );
292
+
293
+ if ( ! empty( $attachment_meta ) ) {
294
  $image_url = trailingslashit( $upload_dir['baseurl'] ) . $attachment_meta['file'];
295
  $thumbnail_url = $image_url;
296
 
299
  $thumbnail_url = str_replace( $image_basename, $attachment_meta['sizes']['thumbnail']['file'], $image_url );
300
  }
301
 
302
+ $formated_data = wp_parse_args( [
303
+ 'thumbnail_url' => $thumbnail_url,
304
+ 'file_name' => wp_basename( $attachment_meta['file'] ),
305
+ 'original_size' => size_format( $queue_model->get_original_size(), 2 ),
306
+ 'optimized_size' => size_format( $queue_model->get_final_size(), 2 )
307
+ ], $default_formated_data );
 
 
 
 
 
 
 
308
 
309
  $main_file = trailingslashit( $upload_dir['basedir'] ) . $attachment_meta['file'];
310
 
311
+ # An extra data may be empty after a failed migration or an unknown error.
 
 
 
 
312
  if ( ! empty( $extra_data ) ) {
313
  $original_main_size = $extra_data->get_original_main_size();
314
 
315
  if ( $original_main_size && file_exists( $main_file ) ) {
316
+ $original_saving = ( $original_main_size - filesize( $main_file ) ) * 100 / $original_main_size;
317
+ $formated_data['original_saving'] = round( $original_saving ) . '%';
318
  }
319
 
320
  $webp_size = $extra_data->get_webp_main_size();
321
 
322
  if ( $webp_size ) {
323
+ $formated_data['webp_size'] = size_format( $webp_size, 2 );
324
  }
325
 
326
+ $formated_data['thumbnails_count'] = $extra_data->get_thumbnails_count();
327
+ }
328
 
329
+ if ( $queue_model->get_original_size() ) {
330
+ $total_saving = ( $queue_model->get_original_size() - $queue_model->get_final_size() ) * 100 / $queue_model->get_original_size();
331
+ $formated_data['total_saving'] = round( $total_saving, 2 ) . '%';
332
+ }
333
+ } else {
334
+ $attachment = get_post( $queue_model->get_object_id() );
335
+
336
+ if ( ! empty( $attachment ) ) {
337
+ $formated_data = [
338
+ 'thumbnail_url' => $attachment->guid,
339
+ 'file_name' => wp_basename( $attachment->guid )
340
+ ];
341
  }
342
 
343
+ $formated_data = wp_parse_args( $formated_data, $default_formated_data );
344
+ }
345
+
346
+ # We collect information about errors
347
+ if ( $queue_model->get_result_status() == RIO_Process_Queue::STATUS_ERROR ) {
348
+ $error_message = null;
349
+
350
+ if ( ! empty( $extra_data ) ) {
351
+ $error_message = $extra_data->get_error_msg();
352
  }
353
 
354
+ $formated_data['type'] = 'error';
355
+ $formated_data['error_msg'] = ! empty( $error_message ) ? $error_message : __( 'Unknown error', 'robin-image-optimizer' );
356
+
357
+ return $formated_data;
358
  }
359
 
360
+ return $formated_data;
361
  }
362
 
363
  /**
includes/classes/class-rio-media-library.php CHANGED
@@ -48,8 +48,7 @@ class WRIO_Media_Library {
48
  public function initHooks() {
49
  // оптимизация при загрузке в медиабиблиотеку
50
  if ( WRIO_Plugin::app()->getPopulateOption( 'auto_optimize_when_upload', false ) ) {
51
- add_filter( 'wp_generate_attachment_metadata', [ $this, 'optimizeAfterUpload' ], 10, 2 );
52
- //rest_after_insert_attachment
53
  }
54
 
55
  // соло оптимизация
@@ -71,26 +70,29 @@ class WRIO_Media_Library {
71
  *
72
  * @return array $metadata Метаданные аттачмента
73
  */
74
- public function optimizeAfterUpload( $metadata, $attachment_id ) {
75
  // todo: There is a bug in this method! The filter is executed when meta data is not saved yet.
76
  // todo: So you need to generate the meta data of the image again in the process of optimizing the image.
77
  // todo: The best solution would be to add images to the queue for optimization. And do not optimize them from the current moment.
78
 
79
  $backup = WIO_Backup::get_instance();
80
  $backup_origin_images = WRIO_Plugin::app()->getPopulateOption( 'backup_origin_images', false );
 
81
  if ( $backup_origin_images && ! $backup->isBackupWritable() ) {
82
  return $metadata;
83
  }
84
 
85
- $attachment = $this->getAttachment( $attachment_id, $metadata );
86
- $this->optimizeAttachment( $attachment_id );
 
 
87
  $metadata = $attachment->getMetaData();
88
  $server = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_server', 'server_1' );
89
 
90
  // если отложенная оптимизация
91
  if ( in_array( $server, [ 'server_4' ] ) ) {
92
  sleep( 2 );
93
- $this->processDeferredOptimization();
94
  }
95
 
96
  return $metadata;
@@ -123,6 +125,7 @@ class WRIO_Media_Library {
123
  public function optimizeAttachment( $attachment_id, $level = '' ) {
124
  $wio_attachment = $this->getAttachment( $attachment_id );
125
  $optimization_data = $wio_attachment->getOptimizationData();
 
126
  if ( 'processing' == $optimization_data->get_result_status() ) {
127
  return $this->deferredOptimizeAttachment( $attachment_id );
128
  }
@@ -230,75 +233,47 @@ class WRIO_Media_Library {
230
  * @return array|\WP_Error
231
  */
232
  public function processUnoptimizedImages( $max_process_per_request ) {
233
- // $server = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_server', 'server_1' );
234
- $backup_origin_images = WRIO_Plugin::app()->getPopulateOption( 'backup_origin_images', false );
235
- $optimization_level = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level', 'normal' );
236
 
237
- if ( $optimization_level == 'custom' ) {
238
- $custom_quality = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level_custom', 100 );
239
- $optimization_level = $custom_quality;
240
- }
241
 
242
- //do_action( 'wbcr/rio/multisite_current_blog' );
243
  $backup = WIO_Backup::get_instance();
244
 
245
  if ( $backup_origin_images && ! $backup->isBackupWritable() ) {
246
  return new WP_Error( 'unwritable_backup_dir', __( 'No access for writing backups.', 'robin-image-optimizer' ) );
247
- //do_action( 'wbcr/rio/multisite_restore_blog' );
248
  }
249
 
250
  if ( ! $backup->isUploadWritable() ) {
251
- //do_action( 'wbcr/rio/multisite_restore_blog' );
252
  return new WP_Error( 'unwritable_upload_dir', __( 'No access for writing backups.', 'robin-image-optimizer' ) );
253
  }
254
 
255
- global $wpdb;
256
  $db_table = RIO_Process_Queue::table_name();
257
  $max_process_per_request = intval( $max_process_per_request );
258
- $level = esc_sql( $optimization_level );
259
 
260
  $sql = "SELECT DISTINCT posts.ID
261
- FROM {$wpdb->posts} AS posts
262
- LEFT JOIN {$db_table} AS rio ON posts.ID = rio.object_id
263
- WHERE ( ( rio.object_id IS NULL ) OR ( rio.item_type = 'attachment' AND rio.result_status = 'success' AND rio.processing_level != '{$level}' ) )
264
- AND posts.post_type = 'attachment'
265
- AND posts.post_status = 'inherit'
266
- AND posts.post_mime_type IN ( 'image/jpeg', 'image/gif', 'image/png' )
267
- LIMIT {$max_process_per_request}";
268
-
269
- // This was cut from $sql query above due to bug investigation from RIO-111, but related to media
270
- // AND ( rio.item_type = 'attachment' OR rio.item_type IS NULL )
271
 
272
  //выборка неоптимизированных изображений
273
  $unoptimized_attachments_ids = $wpdb->get_col( $sql );
274
 
275
  // временно
276
- $optimized_count = RIO_Process_Queue::count_by_type_status( 'attachment', 'success' );
277
-
278
- if ( ! $optimized_count ) {
279
- $optimized_count = 0;
280
- }
281
-
282
- $sql_unoptimized = "SELECT COUNT(DISTINCT p.ID)
283
- FROM {$wpdb->posts} p
284
- WHERE NOT EXISTS (SELECT *
285
- FROM {$db_table}
286
- WHERE p.ID = object_id AND p.post_type = item_type)
287
- AND p.post_type = 'attachment' AND p.post_mime_type IN ( 'image/jpeg', 'image/gif', 'image/png' )";
288
-
289
- $total_unoptimized = $wpdb->get_var( $sql_unoptimized );
290
 
291
- $attachments_count = 0;
292
-
293
- if ( isset( $unoptimized_attachments_ids ) ) {
294
- $attachments_count = count( $unoptimized_attachments_ids );
295
- }
296
-
297
- $original_size = 0;
298
- $optimized_size = 0;
299
 
300
  // обработка
301
  if ( ! empty( $attachments_count ) ) {
 
302
  foreach ( $unoptimized_attachments_ids as $attachment_id ) {
303
  $wio_attachment = $this->getAttachment( $attachment_id );
304
  if ( $wio_attachment->isOptimized() ) {
@@ -308,6 +283,7 @@ LIMIT {$max_process_per_request}";
308
  $attachment_optimized_data = $wio_attachment->optimize();
309
  $original_size = $original_size + $attachment_optimized_data['original_size'];
310
  $optimized_size = $optimized_size + $attachment_optimized_data['optimized_size'];
 
311
  }
312
  }
313
 
@@ -323,6 +299,7 @@ LIMIT {$max_process_per_request}";
323
 
324
  // проверяем, есть ли аттачменты в очереди на отложенную оптимизацию
325
  $optimized_data = $this->processDeferredOptimization();
 
326
  if ( $optimized_data ) {
327
  $optimized_count = $optimized_data['optimized_count'];
328
  $remain = $total_unoptimized - $optimized_count;
@@ -332,16 +309,17 @@ LIMIT {$max_process_per_request}";
332
  $remain = 0;
333
  }
334
 
 
 
 
335
  $response = [
336
  'remain' => $remain,
337
  'end' => false,
338
  'statistic' => $image_statistics->load(),
339
- 'last_optimized' => $image_statistics->get_last_optimized_images( $max_process_per_request ),
340
  'optimized_count' => $optimized_count,
341
  ];
342
 
343
- //do_action( 'wbcr/rio/multisite_restore_blog' );
344
-
345
  return $response;
346
  }
347
 
48
  public function initHooks() {
49
  // оптимизация при загрузке в медиабиблиотеку
50
  if ( WRIO_Plugin::app()->getPopulateOption( 'auto_optimize_when_upload', false ) ) {
51
+ add_filter( 'wp_generate_attachment_metadata', 'WRIO_Media_Library::optimize_after_upload', 10, 2 );
 
52
  }
53
 
54
  // соло оптимизация
70
  *
71
  * @return array $metadata Метаданные аттачмента
72
  */
73
+ public static function optimize_after_upload( $metadata, $attachment_id ) {
74
  // todo: There is a bug in this method! The filter is executed when meta data is not saved yet.
75
  // todo: So you need to generate the meta data of the image again in the process of optimizing the image.
76
  // todo: The best solution would be to add images to the queue for optimization. And do not optimize them from the current moment.
77
 
78
  $backup = WIO_Backup::get_instance();
79
  $backup_origin_images = WRIO_Plugin::app()->getPopulateOption( 'backup_origin_images', false );
80
+
81
  if ( $backup_origin_images && ! $backup->isBackupWritable() ) {
82
  return $metadata;
83
  }
84
 
85
+ $media_library = static::get_instance();
86
+
87
+ $attachment = $media_library->getAttachment( $attachment_id, $metadata );
88
+ $media_library->optimizeAttachment( $attachment_id );
89
  $metadata = $attachment->getMetaData();
90
  $server = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_server', 'server_1' );
91
 
92
  // если отложенная оптимизация
93
  if ( in_array( $server, [ 'server_4' ] ) ) {
94
  sleep( 2 );
95
+ $media_library->processDeferredOptimization();
96
  }
97
 
98
  return $metadata;
125
  public function optimizeAttachment( $attachment_id, $level = '' ) {
126
  $wio_attachment = $this->getAttachment( $attachment_id );
127
  $optimization_data = $wio_attachment->getOptimizationData();
128
+
129
  if ( 'processing' == $optimization_data->get_result_status() ) {
130
  return $this->deferredOptimizeAttachment( $attachment_id );
131
  }
233
  * @return array|\WP_Error
234
  */
235
  public function processUnoptimizedImages( $max_process_per_request ) {
236
+ global $wpdb;
 
 
237
 
238
+ $backup_origin_images = WRIO_Plugin::app()->getPopulateOption( 'backup_origin_images', false );
 
 
 
239
 
 
240
  $backup = WIO_Backup::get_instance();
241
 
242
  if ( $backup_origin_images && ! $backup->isBackupWritable() ) {
243
  return new WP_Error( 'unwritable_backup_dir', __( 'No access for writing backups.', 'robin-image-optimizer' ) );
 
244
  }
245
 
246
  if ( ! $backup->isUploadWritable() ) {
 
247
  return new WP_Error( 'unwritable_upload_dir', __( 'No access for writing backups.', 'robin-image-optimizer' ) );
248
  }
249
 
 
250
  $db_table = RIO_Process_Queue::table_name();
251
  $max_process_per_request = intval( $max_process_per_request );
 
252
 
253
  $sql = "SELECT DISTINCT posts.ID
254
+ FROM {$wpdb->posts} AS posts
255
+ LEFT JOIN {$db_table} AS rio ON posts.ID = rio.object_id AND rio.item_type = 'attachment'
256
+ WHERE rio.object_id IS NULL
257
+ AND posts.post_type = 'attachment'
258
+ AND posts.post_status = 'inherit'
259
+ AND posts.post_mime_type IN ( 'image/jpeg', 'image/gif', 'image/png' )
260
+ LIMIT {$max_process_per_request}";
 
 
 
261
 
262
  //выборка неоптимизированных изображений
263
  $unoptimized_attachments_ids = $wpdb->get_col( $sql );
264
 
265
  // временно
266
+ $optimized_count = (int) RIO_Process_Queue::count_by_type_status( 'attachment', 'success' );
267
+ $attachments_count = ! empty( $unoptimized_attachments_ids ) ? sizeof( $unoptimized_attachments_ids ) : 0;
268
+ $total_unoptimized = WRIO_Image_Statistic::get_unoptimized_count();
 
 
 
 
 
 
 
 
 
 
 
269
 
270
+ $original_size = 0;
271
+ $optimized_size = 0;
272
+ $optimized_items = [];
 
 
 
 
 
273
 
274
  // обработка
275
  if ( ! empty( $attachments_count ) ) {
276
+
277
  foreach ( $unoptimized_attachments_ids as $attachment_id ) {
278
  $wio_attachment = $this->getAttachment( $attachment_id );
279
  if ( $wio_attachment->isOptimized() ) {
283
  $attachment_optimized_data = $wio_attachment->optimize();
284
  $original_size = $original_size + $attachment_optimized_data['original_size'];
285
  $optimized_size = $optimized_size + $attachment_optimized_data['optimized_size'];
286
+ $optimized_items[] = $attachment_id;
287
  }
288
  }
289
 
299
 
300
  // проверяем, есть ли аттачменты в очереди на отложенную оптимизацию
301
  $optimized_data = $this->processDeferredOptimization();
302
+
303
  if ( $optimized_data ) {
304
  $optimized_count = $optimized_data['optimized_count'];
305
  $remain = $total_unoptimized - $optimized_count;
309
  $remain = 0;
310
  }
311
 
312
+ # Take the last optimized image ID. Used to log 100 optimized images.
313
+ $last_optimized_id = end( $optimized_items );
314
+
315
  $response = [
316
  'remain' => $remain,
317
  'end' => false,
318
  'statistic' => $image_statistics->load(),
319
+ 'last_optimized' => $image_statistics->get_last_optimized_image( $last_optimized_id ),
320
  'optimized_count' => $optimized_count,
321
  ];
322
 
 
 
323
  return $response;
324
  }
325
 
includes/classes/class-rio-views.php CHANGED
@@ -63,11 +63,11 @@ class WRIO_Views {
63
  *
64
  * @param string $template The template name.
65
  * @param mixed $data Some data to pass to the template.
66
- * @param Wbcr_FactoryClearfy208_PageBase $page
67
  *
68
  * @return bool|string The page contents. False if the template doesn't exist.
69
  */
70
- public function get_template( $template, $data = [], Wbcr_FactoryClearfy208_PageBase $page = null ) {
71
  $template = str_replace( '_', '-', $template );
72
  $path = $this->plugin_dir . '/views/' . $template . '.php';
73
 
@@ -92,9 +92,9 @@ class WRIO_Views {
92
  *
93
  * @param string $template The template name.
94
  * @param mixed $data Some data to pass to the template.
95
- * @param Wbcr_FactoryClearfy208_PageBase $page
96
  */
97
- public function print_template( $template, $data = [], Wbcr_FactoryClearfy208_PageBase $page = null ) {
98
  echo $this->get_template( $template, $data, $page );
99
  }
100
  }
63
  *
64
  * @param string $template The template name.
65
  * @param mixed $data Some data to pass to the template.
66
+ * @param Wbcr_FactoryClearfy209_PageBase $page
67
  *
68
  * @return bool|string The page contents. False if the template doesn't exist.
69
  */
70
+ public function get_template( $template, $data = [], Wbcr_FactoryClearfy209_PageBase $page = null ) {
71
  $template = str_replace( '_', '-', $template );
72
  $path = $this->plugin_dir . '/views/' . $template . '.php';
73
 
92
  *
93
  * @param string $template The template name.
94
  * @param mixed $data Some data to pass to the template.
95
+ * @param Wbcr_FactoryClearfy209_PageBase $page
96
  */
97
+ public function print_template( $template, $data = [], Wbcr_FactoryClearfy209_PageBase $page = null ) {
98
  echo $this->get_template( $template, $data, $page );
99
  }
100
  }
includes/classes/logger/class-rio-logger.php CHANGED
@@ -329,6 +329,10 @@ class WRIO_Logger {
329
  * @return bool|string
330
  */
331
  public static function get_content() {
 
 
 
 
332
  return @file_get_contents( static::get_dir() );
333
  }
334
 
329
  * @return bool|string
330
  */
331
  public static function get_content() {
332
+ if ( ! file_exists( static::get_dir() ) ) {
333
+ return null;
334
+ }
335
+
336
  return @file_get_contents( static::get_dir() );
337
  }
338
 
includes/classes/models/class-rio-process-queue-table.php CHANGED
@@ -154,6 +154,40 @@ class RIO_Process_Queue extends RIO_Base_Active_Record {
154
  return $wpdb->prefix . 'rio_process_queue';
155
  }
156
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  /**
158
  * Find db item by hash.
159
  *
@@ -879,12 +913,14 @@ class RIO_Process_Queue extends RIO_Base_Active_Record {
879
  $sql_index_type_status_level = "ALTER TABLE {$table_name} ADD INDEX `index-type-status-level` (`item_type`, `result_status`, `processing_level`);";
880
  $sql_index_hash = "ALTER TABLE {$table_name} ADD UNIQUE `index-hash` (`item_hash`);";
881
  $sql_index_hash_alternative = "ALTER TABLE {$table_name} ADD INDEX `index-hash-alternative` (`item_hash_alternative`);";
 
882
 
883
  return [
884
  $sql_index_type_status,
885
  $sql_index_type_status_level,
886
  $sql_index_hash,
887
  $sql_index_hash_alternative,
 
888
  ];
889
  }
890
 
@@ -903,9 +939,7 @@ class RIO_Process_Queue extends RIO_Base_Active_Record {
903
  return;
904
  }
905
 
906
- $db_version = (int) WRIO_Plugin::app()->getOption( 'db_version', 0 );
907
-
908
- if ( ! $db_version ) {
909
  $sql = static::get_table_schema();
910
  $wpdb->query( $sql );
911
 
@@ -917,8 +951,7 @@ class RIO_Process_Queue extends RIO_Base_Active_Record {
917
  }
918
  }
919
 
920
- WRIO_Plugin::app()->updateOption( 'db_version', 1 );
921
-
922
  static::fix_table_collation();
923
  }
924
  } catch( \Exception $e ) {
154
  return $wpdb->prefix . 'rio_process_queue';
155
  }
156
 
157
+ /**
158
+ * It is used to check the migration and create a schema in the database.
159
+ * Gets the level of activity performed in the database.
160
+ *
161
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
162
+ * @since 1.3.8
163
+ * @return int
164
+ */
165
+ public static function get_db_version() {
166
+ if ( WRIO_Plugin::app()->isNetworkActive() ) {
167
+ return (int) get_site_option( WRIO_Plugin::app()->getOptionName( 'db_version' ), 0 );
168
+ }
169
+
170
+ return (int) get_option( WRIO_Plugin::app()->getOptionName( 'db_version' ), 0 );
171
+ }
172
+
173
+ /**
174
+ * It is used to check the migration and create a schema in the database.
175
+ * Updates the level of activity performed in the database.
176
+ *
177
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
178
+ * @since 1.3.8
179
+ * @return void
180
+ */
181
+ public static function update_db_version( $version ) {
182
+ if ( WRIO_Plugin::app()->isNetworkActive() ) {
183
+ update_site_option( WRIO_Plugin::app()->getOptionName( 'db_version' ), (int) $version );
184
+
185
+ return;
186
+ }
187
+
188
+ update_option( WRIO_Plugin::app()->getOptionName( 'db_version' ), (int) $version );
189
+ }
190
+
191
  /**
192
  * Find db item by hash.
193
  *
913
  $sql_index_type_status_level = "ALTER TABLE {$table_name} ADD INDEX `index-type-status-level` (`item_type`, `result_status`, `processing_level`);";
914
  $sql_index_hash = "ALTER TABLE {$table_name} ADD UNIQUE `index-hash` (`item_hash`);";
915
  $sql_index_hash_alternative = "ALTER TABLE {$table_name} ADD INDEX `index-hash-alternative` (`item_hash_alternative`);";
916
+ $sql_index_type_attachments = "ALTER TABLE {$table_name} ADD INDEX `index-type-attachments` (`object_id`, `item_type`);";
917
 
918
  return [
919
  $sql_index_type_status,
920
  $sql_index_type_status_level,
921
  $sql_index_hash,
922
  $sql_index_hash_alternative,
923
+ $sql_index_type_attachments
924
  ];
925
  }
926
 
939
  return;
940
  }
941
 
942
+ if ( ! static::get_db_version() ) {
 
 
943
  $sql = static::get_table_schema();
944
  $wpdb->query( $sql );
945
 
951
  }
952
  }
953
 
954
+ static::update_db_version( 1 );
 
955
  static::fix_table_collation();
956
  }
957
  } catch( \Exception $e ) {
includes/functions.php CHANGED
@@ -79,6 +79,7 @@ function wrio_convert_url_to_abs_path( $url ) {
79
 
80
  $url = rtrim( $url, '/' );
81
 
 
82
  return str_replace( get_site_url(), untrailingslashit( wp_normalize_path( ABSPATH ) ), $url );
83
  }
84
 
@@ -348,9 +349,9 @@ function wrio_get_server_url( $server_name ) {
348
  */
349
  function wbcr_rio_has_meta_to_migrate() {
350
 
351
- $db_version = WRIO_Plugin::app()->getOption( 'db_version', false );
352
 
353
- if ( $db_version !== false && (int) $db_version === 2 ) {
354
  return false;
355
  }
356
 
@@ -361,8 +362,8 @@ function wbcr_rio_has_meta_to_migrate() {
361
  return true;
362
  }
363
 
364
- if ( 1 === (int) $db_version ) {
365
- WRIO_Plugin::app()->updateOption( 'db_version', 2 );
366
  }
367
 
368
  return false;
79
 
80
  $url = rtrim( $url, '/' );
81
 
82
+ # todo: if the external site, then it will not work
83
  return str_replace( get_site_url(), untrailingslashit( wp_normalize_path( ABSPATH ) ), $url );
84
  }
85
 
349
  */
350
  function wbcr_rio_has_meta_to_migrate() {
351
 
352
+ $db_version = RIO_Process_Queue::get_db_version();
353
 
354
+ if ( 2 === $db_version ) {
355
  return false;
356
  }
357
 
362
  return true;
363
  }
364
 
365
+ if ( 1 === $db_version ) {
366
+ RIO_Process_Queue::update_db_version( 2 );
367
  }
368
 
369
  return false;
libs/addons/admin/ajax/folders.php CHANGED
@@ -2,8 +2,6 @@
2
 
3
  /**
4
  * AJAX обработчик выбора папки
5
- * todo: добавить обработку ошибок
6
- * todo: добавить nonce
7
  */
8
  add_action( 'wp_ajax_wriop_browse_dir', function () {
9
  if ( ! current_user_can( 'manage_options' ) ) {
@@ -36,12 +34,30 @@ add_action( 'wp_ajax_wriop_browse_dir', function () {
36
  $checkbox = $multiselect ? "<input type='checkbox' />" : null;
37
 
38
  $upload_dir = wp_upload_dir();
39
- $upload_dir_path = trailingslashit( str_replace( untrailingslashit( ABSPATH ), '', $upload_dir['basedir'] ) );
 
 
 
 
 
 
40
 
41
  $exclude_dirs = [
 
 
 
 
 
 
 
 
 
 
42
  $upload_dir_path . 'wio_backup',
43
- '/wp-admin',
44
- '/wp-includes'
 
 
45
  ];
46
  // исключаем все директории /wp-content/uploads/2019 - они уже оптимизируются в медиабиблиотеке.
47
  // с основания WP в 2003 году до текущего года + 1 на всякий случай.
2
 
3
  /**
4
  * AJAX обработчик выбора папки
 
 
5
  */
6
  add_action( 'wp_ajax_wriop_browse_dir', function () {
7
  if ( ! current_user_can( 'manage_options' ) ) {
34
  $checkbox = $multiselect ? "<input type='checkbox' />" : null;
35
 
36
  $upload_dir = wp_upload_dir();
37
+ $upload_dir_path = trailingslashit( str_replace( ABSPATH, '', $upload_dir['basedir'] ) );
38
+ $wp_content_dir = trailingslashit( str_replace( ABSPATH, '', WP_CONTENT_DIR ) );
39
+
40
+ $ngg_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_ngg_galleries_path() );
41
+ $shortpixel_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_shortpixel_path() );
42
+ $ewww_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_ewww_tools_path() );
43
+ $wc_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_wc_logs_path() );
44
 
45
  $exclude_dirs = [
46
+ $ngg_path,
47
+ $shortpixel_path,
48
+ $ewww_path,
49
+ $wc_path,
50
+ $wp_content_dir . 'backup',
51
+ $wp_content_dir . 'backups',
52
+ $wp_content_dir . 'cache',
53
+ $wp_content_dir . 'lang',
54
+ $wp_content_dir . 'langs',
55
+ $wp_content_dir . 'languages',
56
  $upload_dir_path . 'wio_backup',
57
+ $upload_dir_path . 'wrio',
58
+ $upload_dir_path . 'wrio-webp-uploads',
59
+ //'wp-admin',
60
+ //'wp-includes'
61
  ];
62
  // исключаем все директории /wp-content/uploads/2019 - они уже оптимизируются в медиабиблиотеке.
63
  // с основания WP в 2003 году до текущего года + 1 на всякий случай.
libs/addons/admin/assets/js/custom-folders.js CHANGED
@@ -86,10 +86,10 @@
86
  if( response.data && response.data.error_message ) {
87
  // todo: так как фреймворк не используется в аддоне, нужно доработать этот кусок кода. Он не
88
  // может быть скомпилирован.
89
- var noticeId = $.wbcr_factory_clearfy_208.app.showNotice(response.data.error_message, 'danger');
90
 
91
  setTimeout(function() {
92
- $.wbcr_factory_clearfy_208.app.hideNotice(noticeId);
93
  }, 5000);
94
  }
95
  return;
@@ -150,10 +150,10 @@
150
  if( response.data && response.data.error_message ) {
151
  // todo: так как фреймворк не используется в аддоне, нужно доработать этот кусок кода. Он не
152
  // может быть скомпилирован.
153
- var noticeId = $.wbcr_factory_clearfy_208.app.showNotice(response.data.error_message, 'danger');
154
 
155
  setTimeout(function() {
156
- $.wbcr_factory_clearfy_208.app.hideNotice(noticeId);
157
  }, 5000);
158
  }
159
  return;
86
  if( response.data && response.data.error_message ) {
87
  // todo: так как фреймворк не используется в аддоне, нужно доработать этот кусок кода. Он не
88
  // может быть скомпилирован.
89
+ var noticeId = $.wbcr_factory_clearfy_209.app.showNotice(response.data.error_message, 'danger');
90
 
91
  setTimeout(function() {
92
+ $.wbcr_factory_clearfy_209.app.hideNotice(noticeId);
93
  }, 5000);
94
  }
95
  return;
150
  if( response.data && response.data.error_message ) {
151
  // todo: так как фреймворк не используется в аддоне, нужно доработать этот кусок кода. Он не
152
  // может быть скомпилирован.
153
+ var noticeId = $.wbcr_factory_clearfy_209.app.showNotice(response.data.error_message, 'danger');
154
 
155
  setTimeout(function() {
156
+ $.wbcr_factory_clearfy_209.app.hideNotice(noticeId);
157
  }, 5000);
158
  }
159
  return;
libs/addons/admin/boot.php CHANGED
@@ -20,7 +20,7 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  * Flush configuration after saving the settings
21
  *
22
  * @param WHM_Plugin $plugin
23
- * @param Wbcr_FactoryPages412_ImpressiveThemplate $page
24
  *
25
  * @return bool
26
  */
20
  * Flush configuration after saving the settings
21
  *
22
  * @param WHM_Plugin $plugin
23
+ * @param Wbcr_FactoryPages414_ImpressiveThemplate $page
24
  *
25
  * @return bool
26
  */
libs/addons/includes/classes/webp/class-webp-listener.php CHANGED
@@ -7,6 +7,7 @@ if ( ! defined( 'ABSPATH' ) ) {
7
  exit;
8
  }
9
 
 
10
  use WRIO\WEBP\HTML\Delivery;
11
 
12
  /**
@@ -396,25 +397,22 @@ class Listener {
396
  // Fallback to get attachment meta it can be empty when WordPress failed to create it or invocation
397
  // of method was produced too soon
398
  if ( empty( $attachment_meta ) ) {
399
- $exploded_url = explode( 'wp-content/uploads/', $attachment->guid, 2 );
 
 
 
 
400
  if ( isset( $exploded_url[1] ) ) {
401
  $exploded_relative_path = trim( $exploded_url[1] );
402
  $path_from_url = trailingslashit( $dirs['basedir'] ) . $exploded_relative_path;
403
 
404
  // Need to remove this filter, as it would start recursion
405
- remove_filter( 'wp_generate_attachment_metadata', 'wp_generate_attachment_metadata' );
406
- remove_filter( 'wp_generate_attachment_metadata', [
407
- \WRIO_Media_Library::get_instance(),
408
- 'optimizeAfterUpload',
409
- ] );
410
 
411
  $attachment_meta = wp_generate_attachment_metadata( $attachment->ID, $path_from_url );
412
 
413
- add_filter( 'wp_generate_attachment_metadata', [
414
- \WRIO_Media_Library::get_instance(),
415
- 'optimizeAfterUpload',
416
- ], 10, 2 );
417
- }
418
  }
419
 
420
  if ( isset( $dirs['basedir'] ) && isset( $attachment_meta['file'] ) ) {
7
  exit;
8
  }
9
 
10
+ use WP_Post;
11
  use WRIO\WEBP\HTML\Delivery;
12
 
13
  /**
397
  // Fallback to get attachment meta it can be empty when WordPress failed to create it or invocation
398
  // of method was produced too soon
399
  if ( empty( $attachment_meta ) ) {
400
+ \WRIO_Logger::error( sprintf( 'Attachment #%d metadata is empty. Webp image can not be converted.',$attachment->ID ) );
401
+
402
+ return $hashmap;
403
+ /*$exploded_url = explode( 'wp-content/uploads/', $attachment->guid, 2 );
404
+
405
  if ( isset( $exploded_url[1] ) ) {
406
  $exploded_relative_path = trim( $exploded_url[1] );
407
  $path_from_url = trailingslashit( $dirs['basedir'] ) . $exploded_relative_path;
408
 
409
  // Need to remove this filter, as it would start recursion
410
+ remove_filter( 'wp_generate_attachment_metadata', 'WRIO_Media_Library::optimize_after_upload' );
 
 
 
 
411
 
412
  $attachment_meta = wp_generate_attachment_metadata( $attachment->ID, $path_from_url );
413
 
414
+ add_filter( 'wp_generate_attachment_metadata', 'WRIO_Media_Library::optimize_after_upload', 10, 2 );
415
+ }*/
 
 
 
416
  }
417
 
418
  if ( isset( $dirs['basedir'] ) && isset( $attachment_meta['file'] ) ) {
libs/addons/includes/functions.php CHANGED
@@ -6,3 +6,113 @@
6
  * @copyright (c) 19.04.2019, Webcraftic
7
  * @version 1.0
8
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  * @copyright (c) 19.04.2019, Webcraftic
7
  * @version 1.0
8
  */
9
+
10
+ /**
11
+ * Get the path to NextGen galleries on monosites.
12
+ *
13
+ * @since 1.0.4
14
+ * @return string|bool An absolute path. False if it can't be retrieved.
15
+ */
16
+ function wrio_get_ngg_galleries_path() {
17
+ $galleries_path = get_site_option( 'ngg_options' );
18
+
19
+ if ( empty( $galleries_path['gallerypath'] ) ) {
20
+ return false;
21
+ }
22
+
23
+ $galleries_path = wp_normalize_path( $galleries_path['gallerypath'] );
24
+ $galleries_path = trim( $galleries_path, '/' ); // Something like `wp-content/gallery`.
25
+
26
+ $ngg_root = defined( 'NGG_GALLERY_ROOT_TYPE' ) ? NGG_GALLERY_ROOT_TYPE : 'site';
27
+
28
+ if ( $galleries_path && 'content' === $ngg_root ) {
29
+ $ngg_root = wp_normalize_path( WP_CONTENT_DIR );
30
+ $ngg_root = trim( $ngg_root, '/' ); // Something like `abs-path/to/wp-content`.
31
+
32
+ $exploded_root = explode( '/', $ngg_root );
33
+ $exploded_galleries = explode( '/', $galleries_path );
34
+ $first_gallery_dirname = reset( $exploded_galleries );
35
+ $last_root_dirname = end( $exploded_root );
36
+
37
+ if ( $last_root_dirname === $first_gallery_dirname ) {
38
+ array_shift( $exploded_galleries );
39
+ $galleries_path = implode( '/', $exploded_galleries );
40
+ }
41
+ }
42
+
43
+ if ( 'content' === $ngg_root ) {
44
+ $ngg_root = wp_normalize_path( WP_CONTENT_DIR );
45
+ } else {
46
+ $ngg_root = wp_normalize_path( ABSPATH );
47
+ }
48
+
49
+ if ( strpos( $galleries_path, $ngg_root ) !== 0 ) {
50
+ $galleries_path = $ngg_root . $galleries_path;
51
+ }
52
+
53
+ return $galleries_path;
54
+ }
55
+
56
+ /**
57
+ * Get the path to WooCommerce logs on monosites.
58
+ *
59
+ * @since 1.0.4
60
+ * @access public
61
+ * @return string An absolute path.
62
+ */
63
+
64
+ function wrio_get_wc_logs_path() {
65
+ if ( defined( 'WC_LOG_DIR' ) ) {
66
+ return WC_LOG_DIR;
67
+ }
68
+
69
+ $wp_upload_dir = wp_upload_dir();
70
+
71
+ if ( isset( $wp_upload_dir['error'] ) && $wp_upload_dir['error'] !== false ) {
72
+ return null;
73
+ }
74
+
75
+ $wp_upload_dir_path = wp_normalize_path( trailingslashit( $wp_upload_dir['basedir'] ) );
76
+
77
+ return $wp_upload_dir_path . 'wc-logs';
78
+ }
79
+
80
+ /**
81
+ * Get the path to EWWW optimization tools.
82
+ * It is the same for all sites on multisite.
83
+ *
84
+ * @since 1.0.4
85
+ * @return string An absolute path.
86
+ */
87
+ function wrio_get_ewww_tools_path() {
88
+ if ( defined( 'EWWW_IMAGE_OPTIMIZER_TOOL_PATH' ) ) {
89
+ return wp_normalize_path( EWWW_IMAGE_OPTIMIZER_TOOL_PATH );
90
+ }
91
+
92
+ return trailingslashit( wp_normalize_path( WP_CONTENT_DIR ) ) . 'ewww';
93
+ }
94
+
95
+ /**
96
+ * Get the path to ShortPixel backup folder.
97
+ * It is the same for all sites on multisite (and yes, you'll get a surprise if your upload base dir -aka uploads/sites/12/- is not 2 folders deeper than theuploads folder).
98
+ *
99
+ * @since 1.0.4
100
+ * @access public
101
+ * @return string An absolute path.
102
+ */
103
+
104
+ function wrio_get_shortpixel_path() {
105
+ if ( defined( 'SHORTPIXEL_BACKUP_FOLDER' ) ) {
106
+ return trailingslashit( SHORTPIXEL_BACKUP_FOLDER );
107
+ }
108
+
109
+ $wp_upload_dir = wp_upload_dir();
110
+
111
+ if ( isset( $wp_upload_dir['error'] ) && $wp_upload_dir['error'] !== false ) {
112
+ return null;
113
+ }
114
+
115
+ $wp_upload_dir_path = wp_normalize_path( trailingslashit( $wp_upload_dir['basedir'] ) );
116
+
117
+ return $wp_upload_dir_path . 'ShortpixelBackups';
118
+ }
libs/addons/views/modal-select-custom-folders.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
  ?>
10
  <p><?php _e( 'Select a directory for optimization. All nested images and folders will be optimized recursively.', 'robin-image-optimizer' ) ?></p>
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
  ?>
10
  <p><?php _e( 'Select a directory for optimization. All nested images and folders will be optimized recursively.', 'robin-image-optimizer' ) ?></p>
libs/addons/views/part-bulk-optimization-table-folders.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
 
10
  $cf = WRIO_Custom_Folders::get_instance();
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
 
10
  $cf = WRIO_Custom_Folders::get_instance();
libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css CHANGED
@@ -8,4 +8,4 @@
8
  */
9
 
10
 
11
- .factory-bootstrap-412 .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-412 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-412 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-412 .factory-accordion-item{display:none}.factory-bootstrap-412 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-412 .factory-accordion>h3.active:hover{cursor:default}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-414 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-414 .factory-accordion-item{display:none}.factory-bootstrap-414 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-414 .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-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .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-412 .btn-primary:disabled,.factory-bootstrap-412 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-412 .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-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{background-color:#e1a948;border-color:#d39323}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .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-414 .btn-primary:disabled,.factory-bootstrap-414 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-414 .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-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .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-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .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-412 .btn-primary:disabled,.factory-bootstrap-412 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-412 .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-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{background-color:#c7a589;border-color:#b78a66}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .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-414 .btn-primary:disabled,.factory-bootstrap-414 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-414 .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-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .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-412 article,.factory-bootstrap-412 aside,.factory-bootstrap-412 details,.factory-bootstrap-412 figcaption,.factory-bootstrap-412 figure,.factory-bootstrap-412 footer,.factory-bootstrap-412 header,.factory-bootstrap-412 hgroup,.factory-bootstrap-412 main,.factory-bootstrap-412 nav,.factory-bootstrap-412 section,.factory-bootstrap-412 summary{display:block}.factory-bootstrap-412 audio,.factory-bootstrap-412 canvas,.factory-bootstrap-412 video{display:inline-block}.factory-bootstrap-412 audio:not([controls]){display:none;height:0}.factory-bootstrap-412 [hidden],.factory-bootstrap-412 template{display:none}.factory-bootstrap-412 body{margin:0}.factory-bootstrap-412 a{background:0 0}.factory-bootstrap-412 a:focus{outline:thin dotted}.factory-bootstrap-412 a:active,.factory-bootstrap-412 a:hover{outline:0}.factory-bootstrap-412 h1{margin:.67em 0}.factory-bootstrap-412 b,.factory-bootstrap-412 strong{font-weight:700}.factory-bootstrap-412 dfn{font-style:italic}.factory-bootstrap-412 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-412 mark{color:#000;background:#ff0}.factory-bootstrap-412 code,.factory-bootstrap-412 kbd,.factory-bootstrap-412 pre,.factory-bootstrap-412 samp{font-size:1em}.factory-bootstrap-412 pre{white-space:pre-wrap}.factory-bootstrap-412 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-412 sub,.factory-bootstrap-412 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-412 sup{top:-.5em}.factory-bootstrap-412 sub{bottom:-.25em}.factory-bootstrap-412 img{border:0}.factory-bootstrap-412 svg:not(:root){overflow:hidden}.factory-bootstrap-412 figure{margin:0}.factory-bootstrap-412 button,.factory-bootstrap-412 input,.factory-bootstrap-412 select,.factory-bootstrap-412 textarea{margin:0}.factory-bootstrap-412 button,.factory-bootstrap-412 select{text-transform:none}.factory-bootstrap-412 select{padding-right:4px!important}.factory-bootstrap-412 button,.factory-bootstrap-412 input[type=reset],.factory-bootstrap-412 input[type=submit],html .factory-bootstrap-412 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-412 button[disabled],html .factory-bootstrap-412 input[disabled]{cursor:default}.factory-bootstrap-412 input[type=checkbox],.factory-bootstrap-412 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-412 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-412 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-412 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-412 button::-moz-focus-inner,.factory-bootstrap-412 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-412 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-412 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-412 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-412 a,.factory-bootstrap-412 a:visited{text-decoration:underline}.factory-bootstrap-412 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-412 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-412 a[href^="javascript:"]:after,.factory-bootstrap-412 a[href^="#"]:after{content:""}.factory-bootstrap-412 blockquote,.factory-bootstrap-412 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-412 thead{display:table-header-group}.factory-bootstrap-412 img,.factory-bootstrap-412 tr{page-break-inside:avoid}.factory-bootstrap-412 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-412 h2,.factory-bootstrap-412 h3,.factory-bootstrap-412 p{orphans:3;widows:3}.factory-bootstrap-412 h2,.factory-bootstrap-412 h3{page-break-after:avoid}.factory-bootstrap-412 select{background:#fff!important}.factory-bootstrap-412 .navbar{display:none}.factory-bootstrap-412 .table td,.factory-bootstrap-412 .table th{background-color:#fff!important}.factory-bootstrap-412 .btn>.caret,.factory-bootstrap-412 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-412 .label{border:1px solid #000}.factory-bootstrap-412 .table{border-collapse:collapse!important}.factory-bootstrap-412 .table-bordered td,.factory-bootstrap-412 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-412 *,.factory-bootstrap-412 :after,.factory-bootstrap-412 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-412{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-412 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-412 button,.factory-bootstrap-412 input,.factory-bootstrap-412 select,.factory-bootstrap-412 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-412 img{vertical-align:middle}.factory-bootstrap-412 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-412 .img-rounded{border-radius:6px}.factory-bootstrap-412 .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-412 .img-circle{border-radius:50%}.factory-bootstrap-412 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-412 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-412 .h1,.factory-bootstrap-412 .h2,.factory-bootstrap-412 .h3,.factory-bootstrap-412 .h4,.factory-bootstrap-412 .h5,.factory-bootstrap-412 .h6,.factory-bootstrap-412 h1,.factory-bootstrap-412 h2,.factory-bootstrap-412 h3,.factory-bootstrap-412 h4,.factory-bootstrap-412 h5,.factory-bootstrap-412 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-412 .h1 .small,.factory-bootstrap-412 .h1 small,.factory-bootstrap-412 .h2 .small,.factory-bootstrap-412 .h2 small,.factory-bootstrap-412 .h3 .small,.factory-bootstrap-412 .h3 small,.factory-bootstrap-412 .h4 .small,.factory-bootstrap-412 .h4 small,.factory-bootstrap-412 .h5 .small,.factory-bootstrap-412 .h5 small,.factory-bootstrap-412 .h6 .small,.factory-bootstrap-412 .h6 small,.factory-bootstrap-412 h1 .small,.factory-bootstrap-412 h1 small,.factory-bootstrap-412 h2 .small,.factory-bootstrap-412 h2 small,.factory-bootstrap-412 h3 .small,.factory-bootstrap-412 h3 small,.factory-bootstrap-412 h4 .small,.factory-bootstrap-412 h4 small,.factory-bootstrap-412 h5 .small,.factory-bootstrap-412 h5 small,.factory-bootstrap-412 h6 .small,.factory-bootstrap-412 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-412 h1,.factory-bootstrap-412 h2,.factory-bootstrap-412 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-412 h1 .small,.factory-bootstrap-412 h1 small,.factory-bootstrap-412 h2 .small,.factory-bootstrap-412 h2 small,.factory-bootstrap-412 h3 .small,.factory-bootstrap-412 h3 small{font-size:65%}.factory-bootstrap-412 h4,.factory-bootstrap-412 h5,.factory-bootstrap-412 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-412 h4 .small,.factory-bootstrap-412 h4 small,.factory-bootstrap-412 h5 .small,.factory-bootstrap-412 h5 small,.factory-bootstrap-412 h6 .small,.factory-bootstrap-412 h6 small{font-size:75%}.factory-bootstrap-412 .h1,.factory-bootstrap-412 h1{font-size:36px}.factory-bootstrap-412 .h2,.factory-bootstrap-412 h2{font-size:30px}.factory-bootstrap-412 .h3,.factory-bootstrap-412 h3{font-size:24px}.factory-bootstrap-412 .h4,.factory-bootstrap-412 h4{font-size:18px}.factory-bootstrap-412 .h5,.factory-bootstrap-412 h5{font-size:14px}.factory-bootstrap-412 .h6,.factory-bootstrap-412 h6{font-size:12px}.factory-bootstrap-412 p{margin:0 0 10px}.factory-bootstrap-412 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-412 .small,.factory-bootstrap-412 small{font-size:85%}.factory-bootstrap-412 cite{font-style:normal}.factory-bootstrap-412 .text-muted{color:#999}.factory-bootstrap-412 .text-primary{color:#428bca}.factory-bootstrap-412 .text-primary:hover{color:#3071a9}.factory-bootstrap-412 .text-warning{color:#8a6d3b}.factory-bootstrap-412 .text-warning:hover{color:#66512c}.factory-bootstrap-412 .text-danger{color:#a94442}.factory-bootstrap-412 .text-danger:hover{color:#843534}.factory-bootstrap-412 .text-success{color:#3c763d}.factory-bootstrap-412 .text-success:hover{color:#2b542c}.factory-bootstrap-412 .text-info{color:#31708f}.factory-bootstrap-412 .text-info:hover{color:#245269}.factory-bootstrap-412 .text-left{text-align:left}.factory-bootstrap-412 .text-right{text-align:right}.factory-bootstrap-412 .text-center{text-align:center}.factory-bootstrap-412 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-412 ol,.factory-bootstrap-412 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-412 ol ol,.factory-bootstrap-412 ol ul,.factory-bootstrap-412 ul ol,.factory-bootstrap-412 ul ul{margin-bottom:0}.factory-bootstrap-412 .list-inline,.factory-bootstrap-412 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-412 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-412 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-412 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-412 dd,.factory-bootstrap-412 dt{line-height:1.428571429}.factory-bootstrap-412 dt{font-weight:700}.factory-bootstrap-412 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-412 abbr[data-original-title],.factory-bootstrap-412 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-412 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-412 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-412 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-412 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-412 blockquote .small,.factory-bootstrap-412 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-412 blockquote .small:before,.factory-bootstrap-412 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-412 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-412 blockquote.pull-right .small,.factory-bootstrap-412 blockquote.pull-right p,.factory-bootstrap-412 blockquote.pull-right small{text-align:right}.factory-bootstrap-412 blockquote.pull-right .small:before,.factory-bootstrap-412 blockquote.pull-right small:before{content:''}.factory-bootstrap-412 blockquote.pull-right .small:after,.factory-bootstrap-412 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-412 blockquote:after,.factory-bootstrap-412 blockquote:before{content:""}.factory-bootstrap-412 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-412 code,.factory-bootstrap-412 kbd,.factory-bootstrap-412 pre,.factory-bootstrap-412 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-412 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-412 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-412 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-412 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-412 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-412 .container:after,.factory-bootstrap-412 .container:before{display:table;content:" "}.factory-bootstrap-412 .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-412 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-412 .row:after,.factory-bootstrap-412 .row:before{display:table;content:" "}.factory-bootstrap-412 .row:after{clear:both}.factory-bootstrap-412 .col-lg-1,.factory-bootstrap-412 .col-lg-10,.factory-bootstrap-412 .col-lg-11,.factory-bootstrap-412 .col-lg-12,.factory-bootstrap-412 .col-lg-2,.factory-bootstrap-412 .col-lg-3,.factory-bootstrap-412 .col-lg-4,.factory-bootstrap-412 .col-lg-5,.factory-bootstrap-412 .col-lg-6,.factory-bootstrap-412 .col-lg-7,.factory-bootstrap-412 .col-lg-8,.factory-bootstrap-412 .col-lg-9,.factory-bootstrap-412 .col-md-1,.factory-bootstrap-412 .col-md-10,.factory-bootstrap-412 .col-md-11,.factory-bootstrap-412 .col-md-12,.factory-bootstrap-412 .col-md-2,.factory-bootstrap-412 .col-md-3,.factory-bootstrap-412 .col-md-4,.factory-bootstrap-412 .col-md-5,.factory-bootstrap-412 .col-md-6,.factory-bootstrap-412 .col-md-7,.factory-bootstrap-412 .col-md-8,.factory-bootstrap-412 .col-md-9,.factory-bootstrap-412 .col-sm-1,.factory-bootstrap-412 .col-sm-10,.factory-bootstrap-412 .col-sm-11,.factory-bootstrap-412 .col-sm-12,.factory-bootstrap-412 .col-sm-2,.factory-bootstrap-412 .col-sm-3,.factory-bootstrap-412 .col-sm-4,.factory-bootstrap-412 .col-sm-5,.factory-bootstrap-412 .col-sm-6,.factory-bootstrap-412 .col-sm-7,.factory-bootstrap-412 .col-sm-8,.factory-bootstrap-412 .col-sm-9,.factory-bootstrap-412 .col-xs-1,.factory-bootstrap-412 .col-xs-10,.factory-bootstrap-412 .col-xs-11,.factory-bootstrap-412 .col-xs-12,.factory-bootstrap-412 .col-xs-2,.factory-bootstrap-412 .col-xs-3,.factory-bootstrap-412 .col-xs-4,.factory-bootstrap-412 .col-xs-5,.factory-bootstrap-412 .col-xs-6,.factory-bootstrap-412 .col-xs-7,.factory-bootstrap-412 .col-xs-8,.factory-bootstrap-412 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-412 .col-xs-1,.factory-bootstrap-412 .col-xs-10,.factory-bootstrap-412 .col-xs-11,.factory-bootstrap-412 .col-xs-12,.factory-bootstrap-412 .col-xs-2,.factory-bootstrap-412 .col-xs-3,.factory-bootstrap-412 .col-xs-4,.factory-bootstrap-412 .col-xs-5,.factory-bootstrap-412 .col-xs-6,.factory-bootstrap-412 .col-xs-7,.factory-bootstrap-412 .col-xs-8,.factory-bootstrap-412 .col-xs-9{float:left}.factory-bootstrap-412 .col-xs-12{width:100%}.factory-bootstrap-412 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-412 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-412 .col-xs-9{width:75%}.factory-bootstrap-412 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-412 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-412 .col-xs-6{width:50%}.factory-bootstrap-412 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-412 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-412 .col-xs-3{width:25%}.factory-bootstrap-412 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-412 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-412 .col-xs-pull-12{right:100%}.factory-bootstrap-412 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-412 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-412 .col-xs-pull-9{right:75%}.factory-bootstrap-412 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-412 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-412 .col-xs-pull-6{right:50%}.factory-bootstrap-412 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-412 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-412 .col-xs-pull-3{right:25%}.factory-bootstrap-412 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-412 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-412 .col-xs-pull-0{right:0}.factory-bootstrap-412 .col-xs-push-12{left:100%}.factory-bootstrap-412 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-412 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-412 .col-xs-push-9{left:75%}.factory-bootstrap-412 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-412 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-412 .col-xs-push-6{left:50%}.factory-bootstrap-412 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-412 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-412 .col-xs-push-3{left:25%}.factory-bootstrap-412 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-412 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-412 .col-xs-push-0{left:0}.factory-bootstrap-412 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-412 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-412 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-412 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-412 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-412 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-412 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-412 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-412 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-412 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-412 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-412 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-412 .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-412 table{max-width:100%;background-color:transparent}.factory-bootstrap-412 th{text-align:left}.factory-bootstrap-412 .table{width:100%;margin-bottom:20px}.factory-bootstrap-412 .table>tbody>tr>td,.factory-bootstrap-412 .table>tbody>tr>th,.factory-bootstrap-412 .table>tfoot>tr>td,.factory-bootstrap-412 .table>tfoot>tr>th,.factory-bootstrap-412 .table>thead>tr>td,.factory-bootstrap-412 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-412 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-412 .table>caption+thead>tr:first-child>td,.factory-bootstrap-412 .table>caption+thead>tr:first-child>th,.factory-bootstrap-412 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-412 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-412 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-412 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-412 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-412 .table .table{background-color:#fff}.factory-bootstrap-412 .table-condensed>tbody>tr>td,.factory-bootstrap-412 .table-condensed>tbody>tr>th,.factory-bootstrap-412 .table-condensed>tfoot>tr>td,.factory-bootstrap-412 .table-condensed>tfoot>tr>th,.factory-bootstrap-412 .table-condensed>thead>tr>td,.factory-bootstrap-412 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-412 .table-bordered,.factory-bootstrap-412 .table-bordered>tbody>tr>td,.factory-bootstrap-412 .table-bordered>tbody>tr>th,.factory-bootstrap-412 .table-bordered>tfoot>tr>td,.factory-bootstrap-412 .table-bordered>tfoot>tr>th,.factory-bootstrap-412 .table-bordered>thead>tr>td,.factory-bootstrap-412 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-412 .table-bordered>thead>tr>td,.factory-bootstrap-412 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-412 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-412 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-412 .table-hover>tbody>tr:hover>td,.factory-bootstrap-412 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-412 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-412 table td[class*=col-],.factory-bootstrap-412 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-412 .table>tbody>.active>td,.factory-bootstrap-412 .table>tbody>.active>th,.factory-bootstrap-412 .table>tbody>tr>.active,.factory-bootstrap-412 .table>tfoot>.active>td,.factory-bootstrap-412 .table>tfoot>.active>th,.factory-bootstrap-412 .table>tfoot>tr>.active,.factory-bootstrap-412 .table>thead>.active>td,.factory-bootstrap-412 .table>thead>.active>th,.factory-bootstrap-412 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-412 .table-hover>tbody>.active:hover>td,.factory-bootstrap-412 .table-hover>tbody>.active:hover>th,.factory-bootstrap-412 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-412 .table>tbody>.success>td,.factory-bootstrap-412 .table>tbody>.success>th,.factory-bootstrap-412 .table>tbody>tr>.success,.factory-bootstrap-412 .table>tfoot>.success>td,.factory-bootstrap-412 .table>tfoot>.success>th,.factory-bootstrap-412 .table>tfoot>tr>.success,.factory-bootstrap-412 .table>thead>.success>td,.factory-bootstrap-412 .table>thead>.success>th,.factory-bootstrap-412 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-412 .table-hover>tbody>.success:hover>td,.factory-bootstrap-412 .table-hover>tbody>.success:hover>th,.factory-bootstrap-412 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-412 .table>tbody>.danger>td,.factory-bootstrap-412 .table>tbody>.danger>th,.factory-bootstrap-412 .table>tbody>tr>.danger,.factory-bootstrap-412 .table>tfoot>.danger>td,.factory-bootstrap-412 .table>tfoot>.danger>th,.factory-bootstrap-412 .table>tfoot>tr>.danger,.factory-bootstrap-412 .table>thead>.danger>td,.factory-bootstrap-412 .table>thead>.danger>th,.factory-bootstrap-412 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-412 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-412 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-412 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-412 .table>tbody>.warning>td,.factory-bootstrap-412 .table>tbody>.warning>th,.factory-bootstrap-412 .table>tbody>tr>.warning,.factory-bootstrap-412 .table>tfoot>.warning>td,.factory-bootstrap-412 .table>tfoot>.warning>th,.factory-bootstrap-412 .table>tfoot>tr>.warning,.factory-bootstrap-412 .table>thead>.warning>td,.factory-bootstrap-412 .table>thead>.warning>th,.factory-bootstrap-412 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-412 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-412 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-412 .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-412 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-412 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-412 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-412 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-412 input[type=checkbox],.factory-bootstrap-412 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-412 input[type=file]{display:block}.factory-bootstrap-412 select[multiple],.factory-bootstrap-412 select[size]{height:auto}.factory-bootstrap-412 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-412 input[type=checkbox]:focus,.factory-bootstrap-412 input[type=file]:focus,.factory-bootstrap-412 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-412 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-412 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-412 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-412 .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-412 .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-412 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-412 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-412 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-412 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-412 .form-control[disabled],.factory-bootstrap-412 .form-control[readonly],.factory-bootstrap-412 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-412 textarea.form-control{height:auto}.factory-bootstrap-412 .form-group{margin-bottom:15px}.factory-bootstrap-412 .checkbox,.factory-bootstrap-412 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-412 .checkbox label,.factory-bootstrap-412 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-412 .checkbox input[type=checkbox],.factory-bootstrap-412 .checkbox-inline input[type=checkbox],.factory-bootstrap-412 .radio input[type=radio],.factory-bootstrap-412 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-412 .checkbox+.checkbox,.factory-bootstrap-412 .radio+.radio{margin-top:-5px}.factory-bootstrap-412 .checkbox-inline,.factory-bootstrap-412 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-412 .checkbox-inline+.checkbox-inline,.factory-bootstrap-412 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-412 .checkbox-inline[disabled],.factory-bootstrap-412 .checkbox[disabled],.factory-bootstrap-412 .radio-inline[disabled],.factory-bootstrap-412 .radio[disabled],.factory-bootstrap-412 fieldset[disabled] .checkbox,.factory-bootstrap-412 fieldset[disabled] .checkbox-inline,.factory-bootstrap-412 fieldset[disabled] .radio,.factory-bootstrap-412 fieldset[disabled] .radio-inline,.factory-bootstrap-412 fieldset[disabled] input[type=checkbox],.factory-bootstrap-412 fieldset[disabled] input[type=radio],.factory-bootstrap-412 input[type=checkbox][disabled],.factory-bootstrap-412 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-412 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-412 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-412 textarea.input-sm{height:auto}.factory-bootstrap-412 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-412 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-412 textarea.input-lg{height:auto}.factory-bootstrap-412 .has-warning .checkbox,.factory-bootstrap-412 .has-warning .checkbox-inline,.factory-bootstrap-412 .has-warning .control-label,.factory-bootstrap-412 .has-warning .help-block,.factory-bootstrap-412 .has-warning .radio,.factory-bootstrap-412 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-412 .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-412 .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-412 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-412 .has-error .checkbox,.factory-bootstrap-412 .has-error .checkbox-inline,.factory-bootstrap-412 .has-error .control-label,.factory-bootstrap-412 .has-error .help-block,.factory-bootstrap-412 .has-error .radio,.factory-bootstrap-412 .has-error .radio-inline{color:#a94442}.factory-bootstrap-412 .controls{display:block}.factory-bootstrap-412 .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-412 .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-412 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-412 .has-success .checkbox,.factory-bootstrap-412 .has-success .checkbox-inline,.factory-bootstrap-412 .has-success .control-label,.factory-bootstrap-412 .has-success .help-block,.factory-bootstrap-412 .has-success .radio,.factory-bootstrap-412 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-412 .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-412 .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-412 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-412 .form-control-static{margin-bottom:0}.factory-bootstrap-412 .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-412 .form-horizontal .checkbox,.factory-bootstrap-412 .form-horizontal .checkbox-inline,.factory-bootstrap-412 .form-horizontal .control-label,.factory-bootstrap-412 .form-horizontal .radio,.factory-bootstrap-412 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-412 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-412 .form-horizontal .checkbox,.factory-bootstrap-412 .form-horizontal .radio{min-height:27px}.factory-bootstrap-412 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-412 .form-horizontal .form-group:after,.factory-bootstrap-412 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-412 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-412 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-412 .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-412 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-412 .btn{text-decoration:none}.factory-bootstrap-412 .btn:focus,.factory-bootstrap-412 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-412 .btn.disabled,.factory-bootstrap-412 .btn[disabled],.factory-bootstrap-412 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-412 .btn-default.active,.factory-bootstrap-412 .btn-default:active,.factory-bootstrap-412 .btn-default:focus,.factory-bootstrap-412 .btn-default:hover,.factory-bootstrap-412 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-412 .btn-default.active,.factory-bootstrap-412 .btn-default:active,.factory-bootstrap-412 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-412 .btn-default.disabled,.factory-bootstrap-412 .btn-default.disabled.active,.factory-bootstrap-412 .btn-default.disabled:active,.factory-bootstrap-412 .btn-default.disabled:focus,.factory-bootstrap-412 .btn-default.disabled:hover,.factory-bootstrap-412 .btn-default[disabled],.factory-bootstrap-412 .btn-default[disabled].active,.factory-bootstrap-412 .btn-default[disabled]:active,.factory-bootstrap-412 .btn-default[disabled]:focus,.factory-bootstrap-412 .btn-default[disabled]:hover,.factory-bootstrap-412 fieldset[disabled] .btn-default,.factory-bootstrap-412 fieldset[disabled] .btn-default.active,.factory-bootstrap-412 fieldset[disabled] .btn-default:active,.factory-bootstrap-412 fieldset[disabled] .btn-default:focus,.factory-bootstrap-412 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-412 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-412 .btn-primary.active,.factory-bootstrap-412 .btn-primary:active,.factory-bootstrap-412 .btn-primary:focus,.factory-bootstrap-412 .btn-primary:hover,.factory-bootstrap-412 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-412 .btn-primary.active,.factory-bootstrap-412 .btn-primary:active,.factory-bootstrap-412 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-412 .btn-primary.disabled,.factory-bootstrap-412 .btn-primary.disabled.active,.factory-bootstrap-412 .btn-primary.disabled:active,.factory-bootstrap-412 .btn-primary.disabled:focus,.factory-bootstrap-412 .btn-primary.disabled:hover,.factory-bootstrap-412 .btn-primary[disabled],.factory-bootstrap-412 .btn-primary[disabled].active,.factory-bootstrap-412 .btn-primary[disabled]:active,.factory-bootstrap-412 .btn-primary[disabled]:focus,.factory-bootstrap-412 .btn-primary[disabled]:hover,.factory-bootstrap-412 fieldset[disabled] .btn-primary,.factory-bootstrap-412 fieldset[disabled] .btn-primary.active,.factory-bootstrap-412 fieldset[disabled] .btn-primary:active,.factory-bootstrap-412 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-412 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-412 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-412 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-412 .btn-warning.active,.factory-bootstrap-412 .btn-warning:active,.factory-bootstrap-412 .btn-warning:focus,.factory-bootstrap-412 .btn-warning:hover,.factory-bootstrap-412 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-412 .btn-warning.active,.factory-bootstrap-412 .btn-warning:active,.factory-bootstrap-412 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-412 .btn-warning.disabled,.factory-bootstrap-412 .btn-warning.disabled.active,.factory-bootstrap-412 .btn-warning.disabled:active,.factory-bootstrap-412 .btn-warning.disabled:focus,.factory-bootstrap-412 .btn-warning.disabled:hover,.factory-bootstrap-412 .btn-warning[disabled],.factory-bootstrap-412 .btn-warning[disabled].active,.factory-bootstrap-412 .btn-warning[disabled]:active,.factory-bootstrap-412 .btn-warning[disabled]:focus,.factory-bootstrap-412 .btn-warning[disabled]:hover,.factory-bootstrap-412 fieldset[disabled] .btn-warning,.factory-bootstrap-412 fieldset[disabled] .btn-warning.active,.factory-bootstrap-412 fieldset[disabled] .btn-warning:active,.factory-bootstrap-412 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-412 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-412 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-412 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-412 .btn-success.active,.factory-bootstrap-412 .btn-success:active,.factory-bootstrap-412 .btn-success:focus,.factory-bootstrap-412 .btn-success:hover,.factory-bootstrap-412 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-412 .btn-success.active,.factory-bootstrap-412 .btn-success:active,.factory-bootstrap-412 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-412 .btn-success.disabled,.factory-bootstrap-412 .btn-success.disabled.active,.factory-bootstrap-412 .btn-success.disabled:active,.factory-bootstrap-412 .btn-success.disabled:focus,.factory-bootstrap-412 .btn-success.disabled:hover,.factory-bootstrap-412 .btn-success[disabled],.factory-bootstrap-412 .btn-success[disabled].active,.factory-bootstrap-412 .btn-success[disabled]:active,.factory-bootstrap-412 .btn-success[disabled]:focus,.factory-bootstrap-412 .btn-success[disabled]:hover,.factory-bootstrap-412 fieldset[disabled] .btn-success,.factory-bootstrap-412 fieldset[disabled] .btn-success.active,.factory-bootstrap-412 fieldset[disabled] .btn-success:active,.factory-bootstrap-412 fieldset[disabled] .btn-success:focus,.factory-bootstrap-412 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-412 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-412 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-412 .btn-info.active,.factory-bootstrap-412 .btn-info:active,.factory-bootstrap-412 .btn-info:focus,.factory-bootstrap-412 .btn-info:hover,.factory-bootstrap-412 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-412 .btn-info.active,.factory-bootstrap-412 .btn-info:active,.factory-bootstrap-412 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-412 .btn-info.disabled,.factory-bootstrap-412 .btn-info.disabled.active,.factory-bootstrap-412 .btn-info.disabled:active,.factory-bootstrap-412 .btn-info.disabled:focus,.factory-bootstrap-412 .btn-info.disabled:hover,.factory-bootstrap-412 .btn-info[disabled],.factory-bootstrap-412 .btn-info[disabled].active,.factory-bootstrap-412 .btn-info[disabled]:active,.factory-bootstrap-412 .btn-info[disabled]:focus,.factory-bootstrap-412 .btn-info[disabled]:hover,.factory-bootstrap-412 fieldset[disabled] .btn-info,.factory-bootstrap-412 fieldset[disabled] .btn-info.active,.factory-bootstrap-412 fieldset[disabled] .btn-info:active,.factory-bootstrap-412 fieldset[disabled] .btn-info:focus,.factory-bootstrap-412 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-412 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-412 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-412 .btn-link,.factory-bootstrap-412 .btn-link:active,.factory-bootstrap-412 .btn-link[disabled],.factory-bootstrap-412 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-412 .btn-link,.factory-bootstrap-412 .btn-link:active,.factory-bootstrap-412 .btn-link:focus,.factory-bootstrap-412 .btn-link:hover{border-color:transparent}.factory-bootstrap-412 .btn-link:focus,.factory-bootstrap-412 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-412 .btn-link[disabled]:focus,.factory-bootstrap-412 .btn-link[disabled]:hover,.factory-bootstrap-412 fieldset[disabled] .btn-link:focus,.factory-bootstrap-412 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-412 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-412 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-412 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-412 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-412 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-412 input[type=button].btn-block,.factory-bootstrap-412 input[type=reset].btn-block,.factory-bootstrap-412 input[type=submit].btn-block{width:100%}.factory-bootstrap-412 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-412 .fade.in{opacity:1}.factory-bootstrap-412 .collapse{display:none}.factory-bootstrap-412 .collapse.in{display:block}.factory-bootstrap-412 .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-412 .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-412 .glyphicon:empty{width:1em}.factory-bootstrap-412 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-412 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-412 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-412 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-412 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-412 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-412 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-412 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-412 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-412 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-412 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-412 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-412 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-412 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-412 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-412 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-412 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-412 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-412 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-412 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-412 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-412 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-412 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-412 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-412 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-412 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-412 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-412 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-412 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-412 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-412 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-412 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-412 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-412 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-412 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-412 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-412 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-412 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-412 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-412 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-412 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-412 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-412 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-412 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-412 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-412 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-412 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-412 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-412 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-412 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-412 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-412 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-412 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-412 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-412 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-412 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-412 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-412 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-412 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-412 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-412 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-412 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-412 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-412 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-412 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-412 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-412 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-412 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-412 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-412 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-412 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-412 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-412 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-412 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-412 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-412 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-412 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-412 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-412 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-412 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-412 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-412 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-412 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-412 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-412 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-412 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-412 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-412 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-412 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-412 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-412 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-412 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-412 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-412 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-412 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-412 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-412 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-412 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-412 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-412 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-412 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-412 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-412 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-412 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-412 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-412 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-412 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-412 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-412 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-412 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-412 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-412 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-412 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-412 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-412 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-412 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-412 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-412 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-412 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-412 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-412 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-412 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-412 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-412 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-412 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-412 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-412 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-412 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-412 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-412 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-412 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-412 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-412 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-412 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-412 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-412 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-412 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-412 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-412 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-412 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-412 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-412 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-412 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-412 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-412 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-412 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-412 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-412 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-412 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-412 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-412 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-412 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-412 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-412 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-412 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-412 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-412 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-412 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-412 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-412 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-412 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-412 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-412 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-412 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-412 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-412 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-412 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-412 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-412 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-412 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-412 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-412 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-412 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-412 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-412 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-412 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-412 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-412 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-412 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-412 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-412 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-412 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-412 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-412 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-412 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-412 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-412 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-412 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-412 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-412 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-412 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-412 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-412 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-412 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-412 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-412 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-412 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-412 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-412 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-412 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-412 .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-412 .dropdown{position:relative}.factory-bootstrap-412 .dropdown-toggle:focus{outline:0}.factory-bootstrap-412 .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-412 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-412 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-412 .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-412 .dropdown-menu>li>a:focus,.factory-bootstrap-412 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-412 .dropdown-menu>.active>a,.factory-bootstrap-412 .dropdown-menu>.active>a:focus,.factory-bootstrap-412 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-412 .dropdown-menu>.disabled>a,.factory-bootstrap-412 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-412 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-412 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-412 .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-412 .open>.dropdown-menu{display:block}.factory-bootstrap-412 .open>a{outline:0}.factory-bootstrap-412 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-412 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-412 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-412 .dropup .caret,.factory-bootstrap-412 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-412 .dropup .dropdown-menu,.factory-bootstrap-412 .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-412 .btn-group,.factory-bootstrap-412 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-412 .btn-group-vertical>.btn,.factory-bootstrap-412 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-412 .btn-group-vertical>.btn.active,.factory-bootstrap-412 .btn-group-vertical>.btn:active,.factory-bootstrap-412 .btn-group-vertical>.btn:focus,.factory-bootstrap-412 .btn-group-vertical>.btn:hover,.factory-bootstrap-412 .btn-group>.btn.active,.factory-bootstrap-412 .btn-group>.btn:active,.factory-bootstrap-412 .btn-group>.btn:focus,.factory-bootstrap-412 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-412 .btn-group-vertical>.btn:focus,.factory-bootstrap-412 .btn-group>.btn:focus{outline:0}.factory-bootstrap-412 .btn-group .btn+.btn,.factory-bootstrap-412 .btn-group .btn+.btn-group,.factory-bootstrap-412 .btn-group .btn-group+.btn,.factory-bootstrap-412 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-412 .btn-toolbar:after,.factory-bootstrap-412 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-412 .btn-toolbar:after{clear:both}.factory-bootstrap-412 .btn-toolbar .btn-group{float:left}.factory-bootstrap-412 .btn-toolbar>.btn+.btn,.factory-bootstrap-412 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-412 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-412 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-412 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-412 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-412 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-412 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-412 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-412 .btn-group>.btn-group{float:left}.factory-bootstrap-412 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-412 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-412 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-412 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-412 .btn-group .dropdown-toggle:active,.factory-bootstrap-412 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-412 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-412 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-412 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-412 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-412 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-412 .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-412 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-412 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-412 .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-412 .btn .caret{margin-left:0}.factory-bootstrap-412 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-412 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-412 .btn-group-vertical>.btn,.factory-bootstrap-412 .btn-group-vertical>.btn-group,.factory-bootstrap-412 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-412 .btn-group-vertical>.btn-group:after,.factory-bootstrap-412 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-412 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-412 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-412 .btn-group-vertical>.btn+.btn,.factory-bootstrap-412 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-412 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-412 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-412 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-412 .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-412 .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-412 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-412 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-412 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-412 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-412 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-412 .btn-group-justified>.btn,.factory-bootstrap-412 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-412 .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-412 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-412 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-412 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-412 .input-group-lg>.form-control,.factory-bootstrap-412 .input-group-lg>.input-group-addon,.factory-bootstrap-412 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-412 select.input-group-lg>.form-control,.factory-bootstrap-412 select.input-group-lg>.input-group-addon,.factory-bootstrap-412 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-412 textarea.input-group-lg>.form-control,.factory-bootstrap-412 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-412 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-412 .input-group-sm>.form-control,.factory-bootstrap-412 .input-group-sm>.input-group-addon,.factory-bootstrap-412 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-412 select.input-group-sm>.form-control,.factory-bootstrap-412 select.input-group-sm>.input-group-addon,.factory-bootstrap-412 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-412 textarea.input-group-sm>.form-control,.factory-bootstrap-412 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-412 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-412 .input-group .form-control,.factory-bootstrap-412 .input-group-addon,.factory-bootstrap-412 .input-group-btn{display:table-cell}.factory-bootstrap-412 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-412 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-412 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-412 .input-group-addon,.factory-bootstrap-412 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-412 .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-412 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-412 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-412 .input-group-addon input[type=checkbox],.factory-bootstrap-412 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-412 .input-group .form-control:first-child,.factory-bootstrap-412 .input-group-addon:first-child,.factory-bootstrap-412 .input-group-btn:first-child>.btn,.factory-bootstrap-412 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-412 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-412 .input-group-addon:first-child{border-right:0}.factory-bootstrap-412 .input-group .form-control:last-child,.factory-bootstrap-412 .input-group-addon:last-child,.factory-bootstrap-412 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-412 .input-group-btn:last-child>.btn,.factory-bootstrap-412 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-412 .input-group-addon:last-child{border-left:0}.factory-bootstrap-412 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-412 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-412 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-412 .input-group-btn>.btn{position:relative}.factory-bootstrap-412 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-412 .input-group-btn>.btn:active,.factory-bootstrap-412 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-412 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-412 .nav:after,.factory-bootstrap-412 .nav:before{display:table;content:" "}.factory-bootstrap-412 .nav:after{clear:both}.factory-bootstrap-412 .nav>li{position:relative;display:block}.factory-bootstrap-412 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-412 .nav>li>a:focus,.factory-bootstrap-412 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-412 .nav>li.disabled>a{color:#999}.factory-bootstrap-412 .nav>li.disabled>a:focus,.factory-bootstrap-412 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-412 .nav .open>a,.factory-bootstrap-412 .nav .open>a:focus,.factory-bootstrap-412 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-412 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-412 .nav>li>a>img{max-width:none}.factory-bootstrap-412 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-412 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-412 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-412 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-412 .nav-tabs>li.active>a,.factory-bootstrap-412 .nav-tabs>li.active>a:focus,.factory-bootstrap-412 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-412 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-412 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-412 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-412 .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-412 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-412 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-412 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-412 .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-412 .nav-pills>li{float:left}.factory-bootstrap-412 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-412 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-412 .nav-pills>li.active>a,.factory-bootstrap-412 .nav-pills>li.active>a:focus,.factory-bootstrap-412 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-412 .nav-stacked>li{float:none}.factory-bootstrap-412 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-412 .nav-justified{width:100%}.factory-bootstrap-412 .nav-justified>li{float:none}.factory-bootstrap-412 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-412 .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-412 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-412 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-412 .nav-tabs-justified>.active>a,.factory-bootstrap-412 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-412 .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-412 .tab-content>.tab-pane{display:none}.factory-bootstrap-412 .tab-content>.active{display:block}.factory-bootstrap-412 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-412 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-412 .navbar:after,.factory-bootstrap-412 .navbar:before{display:table;content:" "}.factory-bootstrap-412 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-412 .navbar-header:after,.factory-bootstrap-412 .navbar-header:before{display:table;content:" "}.factory-bootstrap-412 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-412 .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-412 .navbar-collapse:after,.factory-bootstrap-412 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-412 .navbar-collapse:after{clear:both}.factory-bootstrap-412 .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-412 .container>.navbar-collapse,.factory-bootstrap-412 .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-412 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-412 .navbar-fixed-bottom,.factory-bootstrap-412 .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-412 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-412 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-412 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-412 .navbar-brand:focus,.factory-bootstrap-412 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-412 .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-412 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-412 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-412 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-412 .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-412 .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-412 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-412 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-412 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-412 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-412 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-412 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-412 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-412 .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-412 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-412 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-412 .navbar-default .navbar-brand:focus,.factory-bootstrap-412 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-412 .navbar-default .navbar-nav>li>a,.factory-bootstrap-412 .navbar-default .navbar-text{color:#777}.factory-bootstrap-412 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-412 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-412 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-412 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-412 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-412 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-412 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-412 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-412 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-412 .navbar-default .navbar-toggle:focus,.factory-bootstrap-412 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-412 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-412 .navbar-default .navbar-collapse,.factory-bootstrap-412 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-412 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-412 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-412 .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-412 .navbar-default .navbar-link{color:#777}.factory-bootstrap-412 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-412 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-412 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-412 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-412 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-412 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-412 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-412 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-412 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-412 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-412 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-412 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-412 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-412 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-412 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-412 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-412 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-412 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-412 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-412 .navbar-inverse .navbar-collapse,.factory-bootstrap-412 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-412 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-412 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-412 .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-412 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-412 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-412 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-412 .breadcrumb>li{display:inline-block}.factory-bootstrap-412 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-412 .breadcrumb>.active{color:#999}.factory-bootstrap-412 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-412 .pagination>li{display:inline}.factory-bootstrap-412 .pagination>li>a,.factory-bootstrap-412 .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-412 .pagination>li:first-child>a,.factory-bootstrap-412 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-412 .pagination>li:last-child>a,.factory-bootstrap-412 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-412 .pagination>li>a:focus,.factory-bootstrap-412 .pagination>li>a:hover,.factory-bootstrap-412 .pagination>li>span:focus,.factory-bootstrap-412 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-412 .pagination>.disabled>a,.factory-bootstrap-412 .pagination>.disabled>a:focus,.factory-bootstrap-412 .pagination>.disabled>a:hover,.factory-bootstrap-412 .pagination>.disabled>span,.factory-bootstrap-412 .pagination>.disabled>span:focus,.factory-bootstrap-412 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-412 .pagination-lg>li>a,.factory-bootstrap-412 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-412 .pagination-lg>li:first-child>a,.factory-bootstrap-412 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-412 .pagination-lg>li:last-child>a,.factory-bootstrap-412 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-412 .pagination-sm>li>a,.factory-bootstrap-412 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-412 .pagination-sm>li:first-child>a,.factory-bootstrap-412 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-412 .pagination-sm>li:last-child>a,.factory-bootstrap-412 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-412 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-412 .pager:after,.factory-bootstrap-412 .pager:before{display:table;content:" "}.factory-bootstrap-412 .pager:after{clear:both}.factory-bootstrap-412 .pager li{display:inline}.factory-bootstrap-412 .pager li>a,.factory-bootstrap-412 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-412 .pager li>a:focus,.factory-bootstrap-412 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-412 .pager .next>a,.factory-bootstrap-412 .pager .next>span{float:right}.factory-bootstrap-412 .pager .previous>a,.factory-bootstrap-412 .pager .previous>span{float:left}.factory-bootstrap-412 .pager .disabled>a,.factory-bootstrap-412 .pager .disabled>a:focus,.factory-bootstrap-412 .pager .disabled>a:hover,.factory-bootstrap-412 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-412 .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-412 .label[href]:focus,.factory-bootstrap-412 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-412 .label:empty{display:none}.factory-bootstrap-412 .btn .label{position:relative;top:-1px}.factory-bootstrap-412 .label-default{background-color:#999}.factory-bootstrap-412 .label-default[href]:focus,.factory-bootstrap-412 .label-default[href]:hover{background-color:gray}.factory-bootstrap-412 .label-primary{background-color:#428bca}.factory-bootstrap-412 .label-primary[href]:focus,.factory-bootstrap-412 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-412 .label-success{background-color:#5cb85c}.factory-bootstrap-412 .label-success[href]:focus,.factory-bootstrap-412 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-412 .label-info{background-color:#5bc0de}.factory-bootstrap-412 .label-info[href]:focus,.factory-bootstrap-412 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-412 .label-warning{background-color:#f0ad4e}.factory-bootstrap-412 .label-warning[href]:focus,.factory-bootstrap-412 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-412 .label-danger{background-color:#d9534f}.factory-bootstrap-412 .label-danger[href]:focus,.factory-bootstrap-412 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-412 .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-412 .badge:empty{display:none}.factory-bootstrap-412 .btn .badge{position:relative;top:-1px}.factory-bootstrap-412 a.badge:focus,.factory-bootstrap-412 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-412 .nav-pills>.active>a>.badge,.factory-bootstrap-412 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-412 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-412 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-412 .jumbotron .h1,.factory-bootstrap-412 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-412 .jumbotron p{line-height:1.4}.factory-bootstrap-412 .container .jumbotron{border-radius:6px}.factory-bootstrap-412 .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-412 .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-412 .thumbnail a>img,.factory-bootstrap-412 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-412 a.thumbnail.active,.factory-bootstrap-412 a.thumbnail:focus,.factory-bootstrap-412 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-412 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-412 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-412 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-412 .alert .alert-link{font-weight:700}.factory-bootstrap-412 .alert>p,.factory-bootstrap-412 .alert>ul{margin-bottom:0}.factory-bootstrap-412 .alert>p+p{margin-top:5px}.factory-bootstrap-412 .alert-dismissable{padding-right:35px}.factory-bootstrap-412 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-412 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-412 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-412 .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-412 .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-412 .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-412 .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-412 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-412 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-412 .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-412 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-412 .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-412 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-412 .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-412 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-412 .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-412 .media,.factory-bootstrap-412 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-412 .media,.factory-bootstrap-412 .media .media{margin-top:15px}.factory-bootstrap-412 .media:first-child{margin-top:0}.factory-bootstrap-412 .media-object{display:block}.factory-bootstrap-412 .media-heading{margin:0 0 5px}.factory-bootstrap-412 .media>.pull-left{margin-right:10px}.factory-bootstrap-412 .media>.pull-right{margin-left:10px}.factory-bootstrap-412 .media-list{padding-left:0;list-style:none}.factory-bootstrap-412 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-412 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-412 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-412 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-412 .list-group-item>.badge{float:right}.factory-bootstrap-412 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-412 a.list-group-item{color:#555}.factory-bootstrap-412 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-412 a.list-group-item:focus,.factory-bootstrap-412 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-412 a.list-group-item.active,.factory-bootstrap-412 a.list-group-item.active:focus,.factory-bootstrap-412 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-412 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-412 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-412 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-412 a.list-group-item.active .list-group-item-text,.factory-bootstrap-412 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-412 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-412 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-412 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-412 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-412 .panel-body{padding:15px}.factory-bootstrap-412 .panel-body:after,.factory-bootstrap-412 .panel-body:before{display:table;content:" "}.factory-bootstrap-412 .panel-body:after{clear:both}.factory-bootstrap-412 .panel>.list-group{margin-bottom:0}.factory-bootstrap-412 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-412 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-412 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-412 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-412 .panel>.table,.factory-bootstrap-412 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-412 .panel>.panel-body+.table,.factory-bootstrap-412 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-412 .panel>.table>tbody:first-child td,.factory-bootstrap-412 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-412 .panel>.table-bordered,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-412 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-412 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-412 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-412 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-412 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-412 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-412 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-412 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-412 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-412 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-412 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-412 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-412 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-412 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-412 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-412 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-412 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-412 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-412 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-412 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-412 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-412 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-412 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-412 .panel-title>a{color:inherit}.factory-bootstrap-412 .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-412 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-412 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-412 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-412 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-412 .panel-group .panel-footer{border-top:0}.factory-bootstrap-412 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-412 .panel-default{border-color:#ddd}.factory-bootstrap-412 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-412 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-412 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-412 .panel-primary{border-color:#428bca}.factory-bootstrap-412 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-412 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-412 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-412 .panel-success{border-color:#d6e9c6}.factory-bootstrap-412 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-412 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-412 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-412 .panel-warning{border-color:#faebcc}.factory-bootstrap-412 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-412 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-412 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-412 .panel-danger{border-color:#ebccd1}.factory-bootstrap-412 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-412 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-412 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-412 .panel-info{border-color:#bce8f1}.factory-bootstrap-412 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-412 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-412 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-412 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-412 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-412 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-412 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-412 .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-412 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-412 .close:focus,.factory-bootstrap-412 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-412 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-412 .modal-open{overflow:hidden}.factory-bootstrap-412 .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-412 .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-412 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-412 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-412 .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-412 .modal-backdrop,.factory-bootstrap-412-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-412 .modal-backdrop.fade,.factory-bootstrap-412-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-412 .modal-backdrop.in,.factory-bootstrap-412-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-412 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-412 .modal-header .close{margin-top:-2px}.factory-bootstrap-412 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-412 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-412 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-412 .modal-footer:after,.factory-bootstrap-412 .modal-footer:before{display:table;content:" "}.factory-bootstrap-412 .modal-footer:after{clear:both}.factory-bootstrap-412 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-412 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-412 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-412 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-412 .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-412 .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-412 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-412 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-412 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-412 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-412 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-412 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-412 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-412 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-412 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-412 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-412 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-412 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-412 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-412 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-412 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-412 .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-412 .popover.top{margin-top:-10px}.factory-bootstrap-412 .popover.right{margin-left:10px}.factory-bootstrap-412 .popover.bottom{margin-top:10px}.factory-bootstrap-412 .popover.left{margin-left:-10px}.factory-bootstrap-412 .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-412 .popover-content{padding:9px 14px}.factory-bootstrap-412 .popover .arrow,.factory-bootstrap-412 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-412 .popover .arrow{border-width:11px}.factory-bootstrap-412 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-412 .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-412 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-412 .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-412 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-412 .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-412 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-412 .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-412 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-412 .carousel{position:relative}.factory-bootstrap-412 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-412 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-412 .carousel-inner>.item>a>img,.factory-bootstrap-412 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-412 .carousel-inner>.active,.factory-bootstrap-412 .carousel-inner>.next,.factory-bootstrap-412 .carousel-inner>.prev{display:block}.factory-bootstrap-412 .carousel-inner>.active{left:0}.factory-bootstrap-412 .carousel-inner>.next,.factory-bootstrap-412 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-412 .carousel-inner>.next{left:100%}.factory-bootstrap-412 .carousel-inner>.prev{left:-100%}.factory-bootstrap-412 .carousel-inner>.next.left,.factory-bootstrap-412 .carousel-inner>.prev.right{left:0}.factory-bootstrap-412 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-412 .carousel-inner>.active.right{left:100%}.factory-bootstrap-412 .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-412 .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-412 .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-412 .carousel-control:focus,.factory-bootstrap-412 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-412 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-412 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-412 .carousel-control .icon-next,.factory-bootstrap-412 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-412 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-412 .carousel-control .icon-prev{left:50%}.factory-bootstrap-412 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-412 .carousel-control .icon-next{right:50%}.factory-bootstrap-412 .carousel-control .icon-next,.factory-bootstrap-412 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-412 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-412 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-412 .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-412 .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-412 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-412 .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-412 .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-412 .clearfix:after,.factory-bootstrap-412 .clearfix:before{display:table;content:" "}.factory-bootstrap-412 .clearfix:after{clear:both}.factory-bootstrap-412 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-412 .pull-right{float:right!important}.factory-bootstrap-412 .pull-left{float:left!important}.factory-bootstrap-412 .hide{display:none!important}.factory-bootstrap-412 .show{display:block!important}.factory-bootstrap-412 .invisible{visibility:hidden}.factory-bootstrap-412 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-412 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-412 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-412 .visible-lg,.factory-bootstrap-412 .visible-md,.factory-bootstrap-412 .visible-sm,.factory-bootstrap-412 .visible-xs,.factory-bootstrap-412 td.visible-lg,.factory-bootstrap-412 td.visible-md,.factory-bootstrap-412 td.visible-sm,.factory-bootstrap-412 td.visible-xs,.factory-bootstrap-412 th.visible-lg,.factory-bootstrap-412 th.visible-md,.factory-bootstrap-412 th.visible-sm,.factory-bootstrap-412 th.visible-xs,.factory-bootstrap-412 tr.visible-lg,.factory-bootstrap-412 tr.visible-md,.factory-bootstrap-412 tr.visible-sm,.factory-bootstrap-412 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-412 .hidden-xs{display:block!important}.factory-bootstrap-412 table.hidden-xs{display:table}.factory-bootstrap-412 tr.hidden-xs{display:table-row!important}.factory-bootstrap-412 td.hidden-xs,.factory-bootstrap-412 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-412 .hidden-sm{display:block!important}.factory-bootstrap-412 table.hidden-sm{display:table}.factory-bootstrap-412 tr.hidden-sm{display:table-row!important}.factory-bootstrap-412 td.hidden-sm,.factory-bootstrap-412 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-412 .hidden-md{display:block!important}.factory-bootstrap-412 table.hidden-md{display:table}.factory-bootstrap-412 tr.hidden-md{display:table-row!important}.factory-bootstrap-412 td.hidden-md,.factory-bootstrap-412 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-412 .hidden-lg{display:block!important}.factory-bootstrap-412 table.hidden-lg{display:table}.factory-bootstrap-412 tr.hidden-lg{display:table-row!important}.factory-bootstrap-412 td.hidden-lg,.factory-bootstrap-412 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-412 .hidden-lg.hidden-xs,.factory-bootstrap-412 td.hidden-lg.hidden-xs,.factory-bootstrap-412 th.hidden-lg.hidden-xs,.factory-bootstrap-412 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-412 .hidden-lg.hidden-sm,.factory-bootstrap-412 td.hidden-lg.hidden-sm,.factory-bootstrap-412 th.hidden-lg.hidden-sm,.factory-bootstrap-412 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-412 .hidden-lg.hidden-md,.factory-bootstrap-412 td.hidden-lg.hidden-md,.factory-bootstrap-412 th.hidden-lg.hidden-md,.factory-bootstrap-412 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-412 .hidden-lg,.factory-bootstrap-412 td.hidden-lg,.factory-bootstrap-412 th.hidden-lg,.factory-bootstrap-412 tr.hidden-lg{display:none!important}}.factory-bootstrap-412 .visible-print,.factory-bootstrap-412 td.visible-print,.factory-bootstrap-412 th.visible-print,.factory-bootstrap-412 tr.visible-print{display:none!important}@media print{.factory-bootstrap-412 .visible-print{display:block!important}.factory-bootstrap-412 table.visible-print{display:table}.factory-bootstrap-412 tr.visible-print{display:table-row!important}.factory-bootstrap-412 td.visible-print,.factory-bootstrap-412 th.visible-print{display:table-cell!important}.factory-bootstrap-412 .hidden-print,.factory-bootstrap-412 td.hidden-print,.factory-bootstrap-412 th.hidden-print,.factory-bootstrap-412 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-412 .btn-danger,.factory-bootstrap-412 .btn-default,.factory-bootstrap-412 .btn-info,.factory-bootstrap-412 .btn-primary,.factory-bootstrap-412 .btn-success,.factory-bootstrap-412 .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-412 .btn-danger.active,.factory-bootstrap-412 .btn-danger:active,.factory-bootstrap-412 .btn-default.active,.factory-bootstrap-412 .btn-default:active,.factory-bootstrap-412 .btn-info.active,.factory-bootstrap-412 .btn-info:active,.factory-bootstrap-412 .btn-primary.active,.factory-bootstrap-412 .btn-primary:active,.factory-bootstrap-412 .btn-success.active,.factory-bootstrap-412 .btn-success:active,.factory-bootstrap-412 .btn-warning.active,.factory-bootstrap-412 .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-412 .btn.active,.factory-bootstrap-412 .btn:active{background-image:none}.factory-bootstrap-412 .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-412 .btn-default.active,.factory-bootstrap-412 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-412 .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-412 .btn-gold:focus,.factory-bootstrap-412 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-412 .btn-gold.active,.factory-bootstrap-412 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .btn-primary.active,.factory-bootstrap-412 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-412 .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-412 .btn-success:focus,.factory-bootstrap-412 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-412 .btn-success.active,.factory-bootstrap-412 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-412 .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-412 .btn-warning:focus,.factory-bootstrap-412 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-412 .btn-warning.active,.factory-bootstrap-412 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-412 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-412 .btn-danger.active,.factory-bootstrap-412 .btn-danger:active,.factory-bootstrap-412 .btn-danger:focus,.factory-bootstrap-412 .btn-danger:hover,.factory-bootstrap-412 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-412 .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-412 .btn-info:focus,.factory-bootstrap-412 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-412 .btn-info.active,.factory-bootstrap-412 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-412 .img-thumbnail,.factory-bootstrap-412 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-412 .dropdown-menu>li>a:focus,.factory-bootstrap-412 .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-412 .dropdown-menu>.active>a,.factory-bootstrap-412 .dropdown-menu>.active>a:focus,.factory-bootstrap-412 .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-412 .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-412 .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-412 .navbar-brand,.factory-bootstrap-412 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-412 .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-412 .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-412 .navbar-inverse .navbar-brand,.factory-bootstrap-412 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-412 .navbar-fixed-bottom,.factory-bootstrap-412 .navbar-fixed-top,.factory-bootstrap-412 .navbar-static-top{border-radius:0}.factory-bootstrap-412 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-412 .alert .actions{padding-top:10px}.factory-bootstrap-412 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-412 .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-412 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-412 .alert-normal,.factory-bootstrap-412 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-412 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-412 .alert-danger a:not(.btn),.factory-bootstrap-412 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-412 .list-group-item.active,.factory-bootstrap-412 .list-group-item.active:focus,.factory-bootstrap-412 .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-412 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-412 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-412 .factory-hidden{display:none}.factory-bootstrap-412 .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-414 article,.factory-bootstrap-414 aside,.factory-bootstrap-414 details,.factory-bootstrap-414 figcaption,.factory-bootstrap-414 figure,.factory-bootstrap-414 footer,.factory-bootstrap-414 header,.factory-bootstrap-414 hgroup,.factory-bootstrap-414 main,.factory-bootstrap-414 nav,.factory-bootstrap-414 section,.factory-bootstrap-414 summary{display:block}.factory-bootstrap-414 audio,.factory-bootstrap-414 canvas,.factory-bootstrap-414 video{display:inline-block}.factory-bootstrap-414 audio:not([controls]){display:none;height:0}.factory-bootstrap-414 [hidden],.factory-bootstrap-414 template{display:none}.factory-bootstrap-414 body{margin:0}.factory-bootstrap-414 a{background:0 0}.factory-bootstrap-414 a:focus{outline:thin dotted}.factory-bootstrap-414 a:active,.factory-bootstrap-414 a:hover{outline:0}.factory-bootstrap-414 h1{margin:.67em 0}.factory-bootstrap-414 b,.factory-bootstrap-414 strong{font-weight:700}.factory-bootstrap-414 dfn{font-style:italic}.factory-bootstrap-414 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-414 mark{color:#000;background:#ff0}.factory-bootstrap-414 code,.factory-bootstrap-414 kbd,.factory-bootstrap-414 pre,.factory-bootstrap-414 samp{font-size:1em}.factory-bootstrap-414 pre{white-space:pre-wrap}.factory-bootstrap-414 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-414 sub,.factory-bootstrap-414 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-414 sup{top:-.5em}.factory-bootstrap-414 sub{bottom:-.25em}.factory-bootstrap-414 img{border:0}.factory-bootstrap-414 svg:not(:root){overflow:hidden}.factory-bootstrap-414 figure{margin:0}.factory-bootstrap-414 button,.factory-bootstrap-414 input,.factory-bootstrap-414 select,.factory-bootstrap-414 textarea{margin:0}.factory-bootstrap-414 button,.factory-bootstrap-414 select{text-transform:none}.factory-bootstrap-414 select{padding-right:4px!important}.factory-bootstrap-414 button,.factory-bootstrap-414 input[type=reset],.factory-bootstrap-414 input[type=submit],html .factory-bootstrap-414 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-414 button[disabled],html .factory-bootstrap-414 input[disabled]{cursor:default}.factory-bootstrap-414 input[type=checkbox],.factory-bootstrap-414 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-414 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-414 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-414 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-414 button::-moz-focus-inner,.factory-bootstrap-414 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-414 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-414 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-414 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-414 a,.factory-bootstrap-414 a:visited{text-decoration:underline}.factory-bootstrap-414 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-414 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-414 a[href^="javascript:"]:after,.factory-bootstrap-414 a[href^="#"]:after{content:""}.factory-bootstrap-414 blockquote,.factory-bootstrap-414 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-414 thead{display:table-header-group}.factory-bootstrap-414 img,.factory-bootstrap-414 tr{page-break-inside:avoid}.factory-bootstrap-414 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-414 h2,.factory-bootstrap-414 h3,.factory-bootstrap-414 p{orphans:3;widows:3}.factory-bootstrap-414 h2,.factory-bootstrap-414 h3{page-break-after:avoid}.factory-bootstrap-414 select{background:#fff!important}.factory-bootstrap-414 .navbar{display:none}.factory-bootstrap-414 .table td,.factory-bootstrap-414 .table th{background-color:#fff!important}.factory-bootstrap-414 .btn>.caret,.factory-bootstrap-414 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-414 .label{border:1px solid #000}.factory-bootstrap-414 .table{border-collapse:collapse!important}.factory-bootstrap-414 .table-bordered td,.factory-bootstrap-414 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-414 *,.factory-bootstrap-414 :after,.factory-bootstrap-414 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-414{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-414 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-414 button,.factory-bootstrap-414 input,.factory-bootstrap-414 select,.factory-bootstrap-414 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-414 img{vertical-align:middle}.factory-bootstrap-414 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-414 .img-rounded{border-radius:6px}.factory-bootstrap-414 .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-414 .img-circle{border-radius:50%}.factory-bootstrap-414 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-414 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-414 .h1,.factory-bootstrap-414 .h2,.factory-bootstrap-414 .h3,.factory-bootstrap-414 .h4,.factory-bootstrap-414 .h5,.factory-bootstrap-414 .h6,.factory-bootstrap-414 h1,.factory-bootstrap-414 h2,.factory-bootstrap-414 h3,.factory-bootstrap-414 h4,.factory-bootstrap-414 h5,.factory-bootstrap-414 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-414 .h1 .small,.factory-bootstrap-414 .h1 small,.factory-bootstrap-414 .h2 .small,.factory-bootstrap-414 .h2 small,.factory-bootstrap-414 .h3 .small,.factory-bootstrap-414 .h3 small,.factory-bootstrap-414 .h4 .small,.factory-bootstrap-414 .h4 small,.factory-bootstrap-414 .h5 .small,.factory-bootstrap-414 .h5 small,.factory-bootstrap-414 .h6 .small,.factory-bootstrap-414 .h6 small,.factory-bootstrap-414 h1 .small,.factory-bootstrap-414 h1 small,.factory-bootstrap-414 h2 .small,.factory-bootstrap-414 h2 small,.factory-bootstrap-414 h3 .small,.factory-bootstrap-414 h3 small,.factory-bootstrap-414 h4 .small,.factory-bootstrap-414 h4 small,.factory-bootstrap-414 h5 .small,.factory-bootstrap-414 h5 small,.factory-bootstrap-414 h6 .small,.factory-bootstrap-414 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-414 h1,.factory-bootstrap-414 h2,.factory-bootstrap-414 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-414 h1 .small,.factory-bootstrap-414 h1 small,.factory-bootstrap-414 h2 .small,.factory-bootstrap-414 h2 small,.factory-bootstrap-414 h3 .small,.factory-bootstrap-414 h3 small{font-size:65%}.factory-bootstrap-414 h4,.factory-bootstrap-414 h5,.factory-bootstrap-414 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-414 h4 .small,.factory-bootstrap-414 h4 small,.factory-bootstrap-414 h5 .small,.factory-bootstrap-414 h5 small,.factory-bootstrap-414 h6 .small,.factory-bootstrap-414 h6 small{font-size:75%}.factory-bootstrap-414 .h1,.factory-bootstrap-414 h1{font-size:36px}.factory-bootstrap-414 .h2,.factory-bootstrap-414 h2{font-size:30px}.factory-bootstrap-414 .h3,.factory-bootstrap-414 h3{font-size:24px}.factory-bootstrap-414 .h4,.factory-bootstrap-414 h4{font-size:18px}.factory-bootstrap-414 .h5,.factory-bootstrap-414 h5{font-size:14px}.factory-bootstrap-414 .h6,.factory-bootstrap-414 h6{font-size:12px}.factory-bootstrap-414 p{margin:0 0 10px}.factory-bootstrap-414 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-414 .small,.factory-bootstrap-414 small{font-size:85%}.factory-bootstrap-414 cite{font-style:normal}.factory-bootstrap-414 .text-muted{color:#999}.factory-bootstrap-414 .text-primary{color:#428bca}.factory-bootstrap-414 .text-primary:hover{color:#3071a9}.factory-bootstrap-414 .text-warning{color:#8a6d3b}.factory-bootstrap-414 .text-warning:hover{color:#66512c}.factory-bootstrap-414 .text-danger{color:#a94442}.factory-bootstrap-414 .text-danger:hover{color:#843534}.factory-bootstrap-414 .text-success{color:#3c763d}.factory-bootstrap-414 .text-success:hover{color:#2b542c}.factory-bootstrap-414 .text-info{color:#31708f}.factory-bootstrap-414 .text-info:hover{color:#245269}.factory-bootstrap-414 .text-left{text-align:left}.factory-bootstrap-414 .text-right{text-align:right}.factory-bootstrap-414 .text-center{text-align:center}.factory-bootstrap-414 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-414 ol,.factory-bootstrap-414 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-414 ol ol,.factory-bootstrap-414 ol ul,.factory-bootstrap-414 ul ol,.factory-bootstrap-414 ul ul{margin-bottom:0}.factory-bootstrap-414 .list-inline,.factory-bootstrap-414 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-414 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-414 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-414 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-414 dd,.factory-bootstrap-414 dt{line-height:1.428571429}.factory-bootstrap-414 dt{font-weight:700}.factory-bootstrap-414 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-414 abbr[data-original-title],.factory-bootstrap-414 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-414 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-414 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-414 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-414 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-414 blockquote .small,.factory-bootstrap-414 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-414 blockquote .small:before,.factory-bootstrap-414 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-414 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-414 blockquote.pull-right .small,.factory-bootstrap-414 blockquote.pull-right p,.factory-bootstrap-414 blockquote.pull-right small{text-align:right}.factory-bootstrap-414 blockquote.pull-right .small:before,.factory-bootstrap-414 blockquote.pull-right small:before{content:''}.factory-bootstrap-414 blockquote.pull-right .small:after,.factory-bootstrap-414 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-414 blockquote:after,.factory-bootstrap-414 blockquote:before{content:""}.factory-bootstrap-414 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-414 code,.factory-bootstrap-414 kbd,.factory-bootstrap-414 pre,.factory-bootstrap-414 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-414 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-414 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-414 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-414 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-414 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-414 .container:after,.factory-bootstrap-414 .container:before{display:table;content:" "}.factory-bootstrap-414 .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-414 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-414 .row:after,.factory-bootstrap-414 .row:before{display:table;content:" "}.factory-bootstrap-414 .row:after{clear:both}.factory-bootstrap-414 .col-lg-1,.factory-bootstrap-414 .col-lg-10,.factory-bootstrap-414 .col-lg-11,.factory-bootstrap-414 .col-lg-12,.factory-bootstrap-414 .col-lg-2,.factory-bootstrap-414 .col-lg-3,.factory-bootstrap-414 .col-lg-4,.factory-bootstrap-414 .col-lg-5,.factory-bootstrap-414 .col-lg-6,.factory-bootstrap-414 .col-lg-7,.factory-bootstrap-414 .col-lg-8,.factory-bootstrap-414 .col-lg-9,.factory-bootstrap-414 .col-md-1,.factory-bootstrap-414 .col-md-10,.factory-bootstrap-414 .col-md-11,.factory-bootstrap-414 .col-md-12,.factory-bootstrap-414 .col-md-2,.factory-bootstrap-414 .col-md-3,.factory-bootstrap-414 .col-md-4,.factory-bootstrap-414 .col-md-5,.factory-bootstrap-414 .col-md-6,.factory-bootstrap-414 .col-md-7,.factory-bootstrap-414 .col-md-8,.factory-bootstrap-414 .col-md-9,.factory-bootstrap-414 .col-sm-1,.factory-bootstrap-414 .col-sm-10,.factory-bootstrap-414 .col-sm-11,.factory-bootstrap-414 .col-sm-12,.factory-bootstrap-414 .col-sm-2,.factory-bootstrap-414 .col-sm-3,.factory-bootstrap-414 .col-sm-4,.factory-bootstrap-414 .col-sm-5,.factory-bootstrap-414 .col-sm-6,.factory-bootstrap-414 .col-sm-7,.factory-bootstrap-414 .col-sm-8,.factory-bootstrap-414 .col-sm-9,.factory-bootstrap-414 .col-xs-1,.factory-bootstrap-414 .col-xs-10,.factory-bootstrap-414 .col-xs-11,.factory-bootstrap-414 .col-xs-12,.factory-bootstrap-414 .col-xs-2,.factory-bootstrap-414 .col-xs-3,.factory-bootstrap-414 .col-xs-4,.factory-bootstrap-414 .col-xs-5,.factory-bootstrap-414 .col-xs-6,.factory-bootstrap-414 .col-xs-7,.factory-bootstrap-414 .col-xs-8,.factory-bootstrap-414 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-414 .col-xs-1,.factory-bootstrap-414 .col-xs-10,.factory-bootstrap-414 .col-xs-11,.factory-bootstrap-414 .col-xs-12,.factory-bootstrap-414 .col-xs-2,.factory-bootstrap-414 .col-xs-3,.factory-bootstrap-414 .col-xs-4,.factory-bootstrap-414 .col-xs-5,.factory-bootstrap-414 .col-xs-6,.factory-bootstrap-414 .col-xs-7,.factory-bootstrap-414 .col-xs-8,.factory-bootstrap-414 .col-xs-9{float:left}.factory-bootstrap-414 .col-xs-12{width:100%}.factory-bootstrap-414 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-414 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-414 .col-xs-9{width:75%}.factory-bootstrap-414 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-414 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-414 .col-xs-6{width:50%}.factory-bootstrap-414 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-414 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-414 .col-xs-3{width:25%}.factory-bootstrap-414 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-414 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-414 .col-xs-pull-12{right:100%}.factory-bootstrap-414 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-414 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-414 .col-xs-pull-9{right:75%}.factory-bootstrap-414 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-414 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-414 .col-xs-pull-6{right:50%}.factory-bootstrap-414 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-414 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-414 .col-xs-pull-3{right:25%}.factory-bootstrap-414 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-414 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-414 .col-xs-pull-0{right:0}.factory-bootstrap-414 .col-xs-push-12{left:100%}.factory-bootstrap-414 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-414 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-414 .col-xs-push-9{left:75%}.factory-bootstrap-414 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-414 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-414 .col-xs-push-6{left:50%}.factory-bootstrap-414 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-414 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-414 .col-xs-push-3{left:25%}.factory-bootstrap-414 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-414 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-414 .col-xs-push-0{left:0}.factory-bootstrap-414 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-414 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-414 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-414 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-414 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-414 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-414 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-414 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-414 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-414 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-414 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-414 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-414 .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-414 table{max-width:100%;background-color:transparent}.factory-bootstrap-414 th{text-align:left}.factory-bootstrap-414 .table{width:100%;margin-bottom:20px}.factory-bootstrap-414 .table>tbody>tr>td,.factory-bootstrap-414 .table>tbody>tr>th,.factory-bootstrap-414 .table>tfoot>tr>td,.factory-bootstrap-414 .table>tfoot>tr>th,.factory-bootstrap-414 .table>thead>tr>td,.factory-bootstrap-414 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-414 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-414 .table>caption+thead>tr:first-child>td,.factory-bootstrap-414 .table>caption+thead>tr:first-child>th,.factory-bootstrap-414 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-414 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-414 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-414 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-414 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-414 .table .table{background-color:#fff}.factory-bootstrap-414 .table-condensed>tbody>tr>td,.factory-bootstrap-414 .table-condensed>tbody>tr>th,.factory-bootstrap-414 .table-condensed>tfoot>tr>td,.factory-bootstrap-414 .table-condensed>tfoot>tr>th,.factory-bootstrap-414 .table-condensed>thead>tr>td,.factory-bootstrap-414 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-414 .table-bordered,.factory-bootstrap-414 .table-bordered>tbody>tr>td,.factory-bootstrap-414 .table-bordered>tbody>tr>th,.factory-bootstrap-414 .table-bordered>tfoot>tr>td,.factory-bootstrap-414 .table-bordered>tfoot>tr>th,.factory-bootstrap-414 .table-bordered>thead>tr>td,.factory-bootstrap-414 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-414 .table-bordered>thead>tr>td,.factory-bootstrap-414 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-414 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-414 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-414 .table-hover>tbody>tr:hover>td,.factory-bootstrap-414 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-414 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-414 table td[class*=col-],.factory-bootstrap-414 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-414 .table>tbody>.active>td,.factory-bootstrap-414 .table>tbody>.active>th,.factory-bootstrap-414 .table>tbody>tr>.active,.factory-bootstrap-414 .table>tfoot>.active>td,.factory-bootstrap-414 .table>tfoot>.active>th,.factory-bootstrap-414 .table>tfoot>tr>.active,.factory-bootstrap-414 .table>thead>.active>td,.factory-bootstrap-414 .table>thead>.active>th,.factory-bootstrap-414 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-414 .table-hover>tbody>.active:hover>td,.factory-bootstrap-414 .table-hover>tbody>.active:hover>th,.factory-bootstrap-414 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-414 .table>tbody>.success>td,.factory-bootstrap-414 .table>tbody>.success>th,.factory-bootstrap-414 .table>tbody>tr>.success,.factory-bootstrap-414 .table>tfoot>.success>td,.factory-bootstrap-414 .table>tfoot>.success>th,.factory-bootstrap-414 .table>tfoot>tr>.success,.factory-bootstrap-414 .table>thead>.success>td,.factory-bootstrap-414 .table>thead>.success>th,.factory-bootstrap-414 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-414 .table-hover>tbody>.success:hover>td,.factory-bootstrap-414 .table-hover>tbody>.success:hover>th,.factory-bootstrap-414 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-414 .table>tbody>.danger>td,.factory-bootstrap-414 .table>tbody>.danger>th,.factory-bootstrap-414 .table>tbody>tr>.danger,.factory-bootstrap-414 .table>tfoot>.danger>td,.factory-bootstrap-414 .table>tfoot>.danger>th,.factory-bootstrap-414 .table>tfoot>tr>.danger,.factory-bootstrap-414 .table>thead>.danger>td,.factory-bootstrap-414 .table>thead>.danger>th,.factory-bootstrap-414 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-414 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-414 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-414 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-414 .table>tbody>.warning>td,.factory-bootstrap-414 .table>tbody>.warning>th,.factory-bootstrap-414 .table>tbody>tr>.warning,.factory-bootstrap-414 .table>tfoot>.warning>td,.factory-bootstrap-414 .table>tfoot>.warning>th,.factory-bootstrap-414 .table>tfoot>tr>.warning,.factory-bootstrap-414 .table>thead>.warning>td,.factory-bootstrap-414 .table>thead>.warning>th,.factory-bootstrap-414 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-414 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-414 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-414 .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-414 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-414 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-414 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-414 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-414 input[type=checkbox],.factory-bootstrap-414 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-414 input[type=file]{display:block}.factory-bootstrap-414 select[multiple],.factory-bootstrap-414 select[size]{height:auto}.factory-bootstrap-414 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-414 input[type=checkbox]:focus,.factory-bootstrap-414 input[type=file]:focus,.factory-bootstrap-414 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-414 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-414 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-414 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-414 .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-414 .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-414 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-414 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-414 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-414 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-414 .form-control[disabled],.factory-bootstrap-414 .form-control[readonly],.factory-bootstrap-414 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-414 textarea.form-control{height:auto}.factory-bootstrap-414 .form-group{margin-bottom:15px}.factory-bootstrap-414 .checkbox,.factory-bootstrap-414 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-414 .checkbox label,.factory-bootstrap-414 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-414 .checkbox input[type=checkbox],.factory-bootstrap-414 .checkbox-inline input[type=checkbox],.factory-bootstrap-414 .radio input[type=radio],.factory-bootstrap-414 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-414 .checkbox+.checkbox,.factory-bootstrap-414 .radio+.radio{margin-top:-5px}.factory-bootstrap-414 .checkbox-inline,.factory-bootstrap-414 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-414 .checkbox-inline+.checkbox-inline,.factory-bootstrap-414 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-414 .checkbox-inline[disabled],.factory-bootstrap-414 .checkbox[disabled],.factory-bootstrap-414 .radio-inline[disabled],.factory-bootstrap-414 .radio[disabled],.factory-bootstrap-414 fieldset[disabled] .checkbox,.factory-bootstrap-414 fieldset[disabled] .checkbox-inline,.factory-bootstrap-414 fieldset[disabled] .radio,.factory-bootstrap-414 fieldset[disabled] .radio-inline,.factory-bootstrap-414 fieldset[disabled] input[type=checkbox],.factory-bootstrap-414 fieldset[disabled] input[type=radio],.factory-bootstrap-414 input[type=checkbox][disabled],.factory-bootstrap-414 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-414 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-414 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-414 textarea.input-sm{height:auto}.factory-bootstrap-414 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-414 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-414 textarea.input-lg{height:auto}.factory-bootstrap-414 .has-warning .checkbox,.factory-bootstrap-414 .has-warning .checkbox-inline,.factory-bootstrap-414 .has-warning .control-label,.factory-bootstrap-414 .has-warning .help-block,.factory-bootstrap-414 .has-warning .radio,.factory-bootstrap-414 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-414 .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-414 .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-414 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-414 .has-error .checkbox,.factory-bootstrap-414 .has-error .checkbox-inline,.factory-bootstrap-414 .has-error .control-label,.factory-bootstrap-414 .has-error .help-block,.factory-bootstrap-414 .has-error .radio,.factory-bootstrap-414 .has-error .radio-inline{color:#a94442}.factory-bootstrap-414 .controls{display:block}.factory-bootstrap-414 .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-414 .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-414 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-414 .has-success .checkbox,.factory-bootstrap-414 .has-success .checkbox-inline,.factory-bootstrap-414 .has-success .control-label,.factory-bootstrap-414 .has-success .help-block,.factory-bootstrap-414 .has-success .radio,.factory-bootstrap-414 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-414 .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-414 .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-414 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-414 .form-control-static{margin-bottom:0}.factory-bootstrap-414 .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-414 .form-horizontal .checkbox,.factory-bootstrap-414 .form-horizontal .checkbox-inline,.factory-bootstrap-414 .form-horizontal .control-label,.factory-bootstrap-414 .form-horizontal .radio,.factory-bootstrap-414 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-414 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-414 .form-horizontal .checkbox,.factory-bootstrap-414 .form-horizontal .radio{min-height:27px}.factory-bootstrap-414 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-414 .form-horizontal .form-group:after,.factory-bootstrap-414 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-414 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-414 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-414 .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-414 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-414 .btn{text-decoration:none}.factory-bootstrap-414 .btn:focus,.factory-bootstrap-414 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-414 .btn.disabled,.factory-bootstrap-414 .btn[disabled],.factory-bootstrap-414 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-414 .btn-default.active,.factory-bootstrap-414 .btn-default:active,.factory-bootstrap-414 .btn-default:focus,.factory-bootstrap-414 .btn-default:hover,.factory-bootstrap-414 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-414 .btn-default.active,.factory-bootstrap-414 .btn-default:active,.factory-bootstrap-414 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-414 .btn-default.disabled,.factory-bootstrap-414 .btn-default.disabled.active,.factory-bootstrap-414 .btn-default.disabled:active,.factory-bootstrap-414 .btn-default.disabled:focus,.factory-bootstrap-414 .btn-default.disabled:hover,.factory-bootstrap-414 .btn-default[disabled],.factory-bootstrap-414 .btn-default[disabled].active,.factory-bootstrap-414 .btn-default[disabled]:active,.factory-bootstrap-414 .btn-default[disabled]:focus,.factory-bootstrap-414 .btn-default[disabled]:hover,.factory-bootstrap-414 fieldset[disabled] .btn-default,.factory-bootstrap-414 fieldset[disabled] .btn-default.active,.factory-bootstrap-414 fieldset[disabled] .btn-default:active,.factory-bootstrap-414 fieldset[disabled] .btn-default:focus,.factory-bootstrap-414 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-414 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-414 .btn-primary.active,.factory-bootstrap-414 .btn-primary:active,.factory-bootstrap-414 .btn-primary:focus,.factory-bootstrap-414 .btn-primary:hover,.factory-bootstrap-414 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-414 .btn-primary.active,.factory-bootstrap-414 .btn-primary:active,.factory-bootstrap-414 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-414 .btn-primary.disabled,.factory-bootstrap-414 .btn-primary.disabled.active,.factory-bootstrap-414 .btn-primary.disabled:active,.factory-bootstrap-414 .btn-primary.disabled:focus,.factory-bootstrap-414 .btn-primary.disabled:hover,.factory-bootstrap-414 .btn-primary[disabled],.factory-bootstrap-414 .btn-primary[disabled].active,.factory-bootstrap-414 .btn-primary[disabled]:active,.factory-bootstrap-414 .btn-primary[disabled]:focus,.factory-bootstrap-414 .btn-primary[disabled]:hover,.factory-bootstrap-414 fieldset[disabled] .btn-primary,.factory-bootstrap-414 fieldset[disabled] .btn-primary.active,.factory-bootstrap-414 fieldset[disabled] .btn-primary:active,.factory-bootstrap-414 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-414 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-414 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-414 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-414 .btn-warning.active,.factory-bootstrap-414 .btn-warning:active,.factory-bootstrap-414 .btn-warning:focus,.factory-bootstrap-414 .btn-warning:hover,.factory-bootstrap-414 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-414 .btn-warning.active,.factory-bootstrap-414 .btn-warning:active,.factory-bootstrap-414 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-414 .btn-warning.disabled,.factory-bootstrap-414 .btn-warning.disabled.active,.factory-bootstrap-414 .btn-warning.disabled:active,.factory-bootstrap-414 .btn-warning.disabled:focus,.factory-bootstrap-414 .btn-warning.disabled:hover,.factory-bootstrap-414 .btn-warning[disabled],.factory-bootstrap-414 .btn-warning[disabled].active,.factory-bootstrap-414 .btn-warning[disabled]:active,.factory-bootstrap-414 .btn-warning[disabled]:focus,.factory-bootstrap-414 .btn-warning[disabled]:hover,.factory-bootstrap-414 fieldset[disabled] .btn-warning,.factory-bootstrap-414 fieldset[disabled] .btn-warning.active,.factory-bootstrap-414 fieldset[disabled] .btn-warning:active,.factory-bootstrap-414 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-414 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-414 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-414 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-414 .btn-success.active,.factory-bootstrap-414 .btn-success:active,.factory-bootstrap-414 .btn-success:focus,.factory-bootstrap-414 .btn-success:hover,.factory-bootstrap-414 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-414 .btn-success.active,.factory-bootstrap-414 .btn-success:active,.factory-bootstrap-414 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-414 .btn-success.disabled,.factory-bootstrap-414 .btn-success.disabled.active,.factory-bootstrap-414 .btn-success.disabled:active,.factory-bootstrap-414 .btn-success.disabled:focus,.factory-bootstrap-414 .btn-success.disabled:hover,.factory-bootstrap-414 .btn-success[disabled],.factory-bootstrap-414 .btn-success[disabled].active,.factory-bootstrap-414 .btn-success[disabled]:active,.factory-bootstrap-414 .btn-success[disabled]:focus,.factory-bootstrap-414 .btn-success[disabled]:hover,.factory-bootstrap-414 fieldset[disabled] .btn-success,.factory-bootstrap-414 fieldset[disabled] .btn-success.active,.factory-bootstrap-414 fieldset[disabled] .btn-success:active,.factory-bootstrap-414 fieldset[disabled] .btn-success:focus,.factory-bootstrap-414 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-414 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-414 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-414 .btn-info.active,.factory-bootstrap-414 .btn-info:active,.factory-bootstrap-414 .btn-info:focus,.factory-bootstrap-414 .btn-info:hover,.factory-bootstrap-414 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-414 .btn-info.active,.factory-bootstrap-414 .btn-info:active,.factory-bootstrap-414 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-414 .btn-info.disabled,.factory-bootstrap-414 .btn-info.disabled.active,.factory-bootstrap-414 .btn-info.disabled:active,.factory-bootstrap-414 .btn-info.disabled:focus,.factory-bootstrap-414 .btn-info.disabled:hover,.factory-bootstrap-414 .btn-info[disabled],.factory-bootstrap-414 .btn-info[disabled].active,.factory-bootstrap-414 .btn-info[disabled]:active,.factory-bootstrap-414 .btn-info[disabled]:focus,.factory-bootstrap-414 .btn-info[disabled]:hover,.factory-bootstrap-414 fieldset[disabled] .btn-info,.factory-bootstrap-414 fieldset[disabled] .btn-info.active,.factory-bootstrap-414 fieldset[disabled] .btn-info:active,.factory-bootstrap-414 fieldset[disabled] .btn-info:focus,.factory-bootstrap-414 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-414 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-414 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-414 .btn-link,.factory-bootstrap-414 .btn-link:active,.factory-bootstrap-414 .btn-link[disabled],.factory-bootstrap-414 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-414 .btn-link,.factory-bootstrap-414 .btn-link:active,.factory-bootstrap-414 .btn-link:focus,.factory-bootstrap-414 .btn-link:hover{border-color:transparent}.factory-bootstrap-414 .btn-link:focus,.factory-bootstrap-414 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-414 .btn-link[disabled]:focus,.factory-bootstrap-414 .btn-link[disabled]:hover,.factory-bootstrap-414 fieldset[disabled] .btn-link:focus,.factory-bootstrap-414 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-414 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-414 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-414 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-414 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-414 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-414 input[type=button].btn-block,.factory-bootstrap-414 input[type=reset].btn-block,.factory-bootstrap-414 input[type=submit].btn-block{width:100%}.factory-bootstrap-414 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-414 .fade.in{opacity:1}.factory-bootstrap-414 .collapse{display:none}.factory-bootstrap-414 .collapse.in{display:block}.factory-bootstrap-414 .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-414 .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-414 .glyphicon:empty{width:1em}.factory-bootstrap-414 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-414 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-414 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-414 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-414 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-414 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-414 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-414 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-414 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-414 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-414 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-414 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-414 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-414 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-414 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-414 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-414 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-414 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-414 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-414 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-414 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-414 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-414 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-414 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-414 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-414 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-414 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-414 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-414 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-414 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-414 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-414 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-414 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-414 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-414 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-414 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-414 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-414 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-414 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-414 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-414 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-414 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-414 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-414 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-414 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-414 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-414 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-414 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-414 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-414 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-414 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-414 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-414 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-414 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-414 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-414 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-414 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-414 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-414 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-414 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-414 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-414 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-414 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-414 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-414 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-414 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-414 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-414 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-414 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-414 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-414 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-414 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-414 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-414 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-414 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-414 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-414 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-414 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-414 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-414 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-414 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-414 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-414 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-414 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-414 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-414 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-414 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-414 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-414 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-414 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-414 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-414 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-414 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-414 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-414 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-414 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-414 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-414 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-414 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-414 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-414 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-414 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-414 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-414 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-414 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-414 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-414 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-414 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-414 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-414 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-414 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-414 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-414 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-414 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-414 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-414 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-414 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-414 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-414 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-414 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-414 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-414 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-414 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-414 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-414 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-414 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-414 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-414 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-414 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-414 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-414 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-414 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-414 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-414 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-414 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-414 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-414 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-414 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-414 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-414 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-414 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-414 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-414 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-414 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-414 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-414 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-414 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-414 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-414 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-414 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-414 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-414 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-414 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-414 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-414 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-414 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-414 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-414 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-414 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-414 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-414 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-414 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-414 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-414 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-414 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-414 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-414 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-414 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-414 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-414 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-414 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-414 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-414 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-414 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-414 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-414 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-414 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-414 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-414 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-414 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-414 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-414 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-414 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-414 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-414 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-414 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-414 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-414 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-414 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-414 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-414 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-414 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-414 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-414 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-414 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-414 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-414 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-414 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-414 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-414 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-414 .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-414 .dropdown{position:relative}.factory-bootstrap-414 .dropdown-toggle:focus{outline:0}.factory-bootstrap-414 .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-414 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-414 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-414 .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-414 .dropdown-menu>li>a:focus,.factory-bootstrap-414 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-414 .dropdown-menu>.active>a,.factory-bootstrap-414 .dropdown-menu>.active>a:focus,.factory-bootstrap-414 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-414 .dropdown-menu>.disabled>a,.factory-bootstrap-414 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-414 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-414 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-414 .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-414 .open>.dropdown-menu{display:block}.factory-bootstrap-414 .open>a{outline:0}.factory-bootstrap-414 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-414 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-414 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-414 .dropup .caret,.factory-bootstrap-414 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-414 .dropup .dropdown-menu,.factory-bootstrap-414 .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-414 .btn-group,.factory-bootstrap-414 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-414 .btn-group-vertical>.btn,.factory-bootstrap-414 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-414 .btn-group-vertical>.btn.active,.factory-bootstrap-414 .btn-group-vertical>.btn:active,.factory-bootstrap-414 .btn-group-vertical>.btn:focus,.factory-bootstrap-414 .btn-group-vertical>.btn:hover,.factory-bootstrap-414 .btn-group>.btn.active,.factory-bootstrap-414 .btn-group>.btn:active,.factory-bootstrap-414 .btn-group>.btn:focus,.factory-bootstrap-414 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-414 .btn-group-vertical>.btn:focus,.factory-bootstrap-414 .btn-group>.btn:focus{outline:0}.factory-bootstrap-414 .btn-group .btn+.btn,.factory-bootstrap-414 .btn-group .btn+.btn-group,.factory-bootstrap-414 .btn-group .btn-group+.btn,.factory-bootstrap-414 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-414 .btn-toolbar:after,.factory-bootstrap-414 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-414 .btn-toolbar:after{clear:both}.factory-bootstrap-414 .btn-toolbar .btn-group{float:left}.factory-bootstrap-414 .btn-toolbar>.btn+.btn,.factory-bootstrap-414 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-414 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-414 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-414 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-414 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-414 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-414 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-414 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-414 .btn-group>.btn-group{float:left}.factory-bootstrap-414 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-414 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-414 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-414 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-414 .btn-group .dropdown-toggle:active,.factory-bootstrap-414 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-414 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-414 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-414 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-414 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-414 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-414 .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-414 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-414 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-414 .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-414 .btn .caret{margin-left:0}.factory-bootstrap-414 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-414 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-414 .btn-group-vertical>.btn,.factory-bootstrap-414 .btn-group-vertical>.btn-group,.factory-bootstrap-414 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-414 .btn-group-vertical>.btn-group:after,.factory-bootstrap-414 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-414 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-414 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-414 .btn-group-vertical>.btn+.btn,.factory-bootstrap-414 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-414 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-414 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-414 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-414 .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-414 .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-414 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-414 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-414 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-414 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-414 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-414 .btn-group-justified>.btn,.factory-bootstrap-414 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-414 .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-414 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-414 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-414 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-414 .input-group-lg>.form-control,.factory-bootstrap-414 .input-group-lg>.input-group-addon,.factory-bootstrap-414 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-414 select.input-group-lg>.form-control,.factory-bootstrap-414 select.input-group-lg>.input-group-addon,.factory-bootstrap-414 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-414 textarea.input-group-lg>.form-control,.factory-bootstrap-414 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-414 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-414 .input-group-sm>.form-control,.factory-bootstrap-414 .input-group-sm>.input-group-addon,.factory-bootstrap-414 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-414 select.input-group-sm>.form-control,.factory-bootstrap-414 select.input-group-sm>.input-group-addon,.factory-bootstrap-414 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-414 textarea.input-group-sm>.form-control,.factory-bootstrap-414 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-414 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-414 .input-group .form-control,.factory-bootstrap-414 .input-group-addon,.factory-bootstrap-414 .input-group-btn{display:table-cell}.factory-bootstrap-414 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-414 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-414 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-414 .input-group-addon,.factory-bootstrap-414 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-414 .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-414 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-414 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-414 .input-group-addon input[type=checkbox],.factory-bootstrap-414 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-414 .input-group .form-control:first-child,.factory-bootstrap-414 .input-group-addon:first-child,.factory-bootstrap-414 .input-group-btn:first-child>.btn,.factory-bootstrap-414 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-414 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-414 .input-group-addon:first-child{border-right:0}.factory-bootstrap-414 .input-group .form-control:last-child,.factory-bootstrap-414 .input-group-addon:last-child,.factory-bootstrap-414 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-414 .input-group-btn:last-child>.btn,.factory-bootstrap-414 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-414 .input-group-addon:last-child{border-left:0}.factory-bootstrap-414 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-414 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-414 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-414 .input-group-btn>.btn{position:relative}.factory-bootstrap-414 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-414 .input-group-btn>.btn:active,.factory-bootstrap-414 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-414 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-414 .nav:after,.factory-bootstrap-414 .nav:before{display:table;content:" "}.factory-bootstrap-414 .nav:after{clear:both}.factory-bootstrap-414 .nav>li{position:relative;display:block}.factory-bootstrap-414 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-414 .nav>li>a:focus,.factory-bootstrap-414 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-414 .nav>li.disabled>a{color:#999}.factory-bootstrap-414 .nav>li.disabled>a:focus,.factory-bootstrap-414 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-414 .nav .open>a,.factory-bootstrap-414 .nav .open>a:focus,.factory-bootstrap-414 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-414 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-414 .nav>li>a>img{max-width:none}.factory-bootstrap-414 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-414 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-414 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-414 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-414 .nav-tabs>li.active>a,.factory-bootstrap-414 .nav-tabs>li.active>a:focus,.factory-bootstrap-414 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-414 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-414 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-414 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-414 .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-414 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-414 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-414 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-414 .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-414 .nav-pills>li{float:left}.factory-bootstrap-414 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-414 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-414 .nav-pills>li.active>a,.factory-bootstrap-414 .nav-pills>li.active>a:focus,.factory-bootstrap-414 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-414 .nav-stacked>li{float:none}.factory-bootstrap-414 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-414 .nav-justified{width:100%}.factory-bootstrap-414 .nav-justified>li{float:none}.factory-bootstrap-414 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-414 .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-414 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-414 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-414 .nav-tabs-justified>.active>a,.factory-bootstrap-414 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-414 .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-414 .tab-content>.tab-pane{display:none}.factory-bootstrap-414 .tab-content>.active{display:block}.factory-bootstrap-414 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-414 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-414 .navbar:after,.factory-bootstrap-414 .navbar:before{display:table;content:" "}.factory-bootstrap-414 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-414 .navbar-header:after,.factory-bootstrap-414 .navbar-header:before{display:table;content:" "}.factory-bootstrap-414 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-414 .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-414 .navbar-collapse:after,.factory-bootstrap-414 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-414 .navbar-collapse:after{clear:both}.factory-bootstrap-414 .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-414 .container>.navbar-collapse,.factory-bootstrap-414 .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-414 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-414 .navbar-fixed-bottom,.factory-bootstrap-414 .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-414 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-414 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-414 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-414 .navbar-brand:focus,.factory-bootstrap-414 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-414 .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-414 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-414 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-414 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-414 .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-414 .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-414 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-414 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-414 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-414 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-414 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-414 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-414 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-414 .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-414 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-414 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-414 .navbar-default .navbar-brand:focus,.factory-bootstrap-414 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-414 .navbar-default .navbar-nav>li>a,.factory-bootstrap-414 .navbar-default .navbar-text{color:#777}.factory-bootstrap-414 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-414 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-414 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-414 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-414 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-414 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-414 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-414 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-414 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-414 .navbar-default .navbar-toggle:focus,.factory-bootstrap-414 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-414 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-414 .navbar-default .navbar-collapse,.factory-bootstrap-414 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-414 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-414 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-414 .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-414 .navbar-default .navbar-link{color:#777}.factory-bootstrap-414 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-414 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-414 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-414 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-414 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-414 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-414 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-414 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-414 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-414 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-414 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-414 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-414 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-414 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-414 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-414 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-414 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-414 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-414 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-414 .navbar-inverse .navbar-collapse,.factory-bootstrap-414 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-414 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-414 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-414 .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-414 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-414 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-414 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-414 .breadcrumb>li{display:inline-block}.factory-bootstrap-414 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-414 .breadcrumb>.active{color:#999}.factory-bootstrap-414 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-414 .pagination>li{display:inline}.factory-bootstrap-414 .pagination>li>a,.factory-bootstrap-414 .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-414 .pagination>li:first-child>a,.factory-bootstrap-414 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-414 .pagination>li:last-child>a,.factory-bootstrap-414 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-414 .pagination>li>a:focus,.factory-bootstrap-414 .pagination>li>a:hover,.factory-bootstrap-414 .pagination>li>span:focus,.factory-bootstrap-414 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-414 .pagination>.disabled>a,.factory-bootstrap-414 .pagination>.disabled>a:focus,.factory-bootstrap-414 .pagination>.disabled>a:hover,.factory-bootstrap-414 .pagination>.disabled>span,.factory-bootstrap-414 .pagination>.disabled>span:focus,.factory-bootstrap-414 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-414 .pagination-lg>li>a,.factory-bootstrap-414 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-414 .pagination-lg>li:first-child>a,.factory-bootstrap-414 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-414 .pagination-lg>li:last-child>a,.factory-bootstrap-414 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-414 .pagination-sm>li>a,.factory-bootstrap-414 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-414 .pagination-sm>li:first-child>a,.factory-bootstrap-414 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-414 .pagination-sm>li:last-child>a,.factory-bootstrap-414 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-414 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-414 .pager:after,.factory-bootstrap-414 .pager:before{display:table;content:" "}.factory-bootstrap-414 .pager:after{clear:both}.factory-bootstrap-414 .pager li{display:inline}.factory-bootstrap-414 .pager li>a,.factory-bootstrap-414 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-414 .pager li>a:focus,.factory-bootstrap-414 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-414 .pager .next>a,.factory-bootstrap-414 .pager .next>span{float:right}.factory-bootstrap-414 .pager .previous>a,.factory-bootstrap-414 .pager .previous>span{float:left}.factory-bootstrap-414 .pager .disabled>a,.factory-bootstrap-414 .pager .disabled>a:focus,.factory-bootstrap-414 .pager .disabled>a:hover,.factory-bootstrap-414 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-414 .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-414 .label[href]:focus,.factory-bootstrap-414 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-414 .label:empty{display:none}.factory-bootstrap-414 .btn .label{position:relative;top:-1px}.factory-bootstrap-414 .label-default{background-color:#999}.factory-bootstrap-414 .label-default[href]:focus,.factory-bootstrap-414 .label-default[href]:hover{background-color:gray}.factory-bootstrap-414 .label-primary{background-color:#428bca}.factory-bootstrap-414 .label-primary[href]:focus,.factory-bootstrap-414 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-414 .label-success{background-color:#5cb85c}.factory-bootstrap-414 .label-success[href]:focus,.factory-bootstrap-414 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-414 .label-info{background-color:#5bc0de}.factory-bootstrap-414 .label-info[href]:focus,.factory-bootstrap-414 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-414 .label-warning{background-color:#f0ad4e}.factory-bootstrap-414 .label-warning[href]:focus,.factory-bootstrap-414 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-414 .label-danger{background-color:#d9534f}.factory-bootstrap-414 .label-danger[href]:focus,.factory-bootstrap-414 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-414 .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-414 .badge:empty{display:none}.factory-bootstrap-414 .btn .badge{position:relative;top:-1px}.factory-bootstrap-414 a.badge:focus,.factory-bootstrap-414 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-414 .nav-pills>.active>a>.badge,.factory-bootstrap-414 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-414 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-414 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-414 .jumbotron .h1,.factory-bootstrap-414 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-414 .jumbotron p{line-height:1.4}.factory-bootstrap-414 .container .jumbotron{border-radius:6px}.factory-bootstrap-414 .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-414 .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-414 .thumbnail a>img,.factory-bootstrap-414 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-414 a.thumbnail.active,.factory-bootstrap-414 a.thumbnail:focus,.factory-bootstrap-414 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-414 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-414 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-414 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-414 .alert .alert-link{font-weight:700}.factory-bootstrap-414 .alert>p,.factory-bootstrap-414 .alert>ul{margin-bottom:0}.factory-bootstrap-414 .alert>p+p{margin-top:5px}.factory-bootstrap-414 .alert-dismissable{padding-right:35px}.factory-bootstrap-414 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-414 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-414 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-414 .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-414 .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-414 .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-414 .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-414 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-414 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-414 .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-414 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-414 .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-414 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-414 .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-414 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-414 .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-414 .media,.factory-bootstrap-414 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-414 .media,.factory-bootstrap-414 .media .media{margin-top:15px}.factory-bootstrap-414 .media:first-child{margin-top:0}.factory-bootstrap-414 .media-object{display:block}.factory-bootstrap-414 .media-heading{margin:0 0 5px}.factory-bootstrap-414 .media>.pull-left{margin-right:10px}.factory-bootstrap-414 .media>.pull-right{margin-left:10px}.factory-bootstrap-414 .media-list{padding-left:0;list-style:none}.factory-bootstrap-414 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-414 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-414 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-414 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-414 .list-group-item>.badge{float:right}.factory-bootstrap-414 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-414 a.list-group-item{color:#555}.factory-bootstrap-414 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-414 a.list-group-item:focus,.factory-bootstrap-414 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-414 a.list-group-item.active,.factory-bootstrap-414 a.list-group-item.active:focus,.factory-bootstrap-414 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-414 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-414 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-414 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-414 a.list-group-item.active .list-group-item-text,.factory-bootstrap-414 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-414 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-414 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-414 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-414 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-414 .panel-body{padding:15px}.factory-bootstrap-414 .panel-body:after,.factory-bootstrap-414 .panel-body:before{display:table;content:" "}.factory-bootstrap-414 .panel-body:after{clear:both}.factory-bootstrap-414 .panel>.list-group{margin-bottom:0}.factory-bootstrap-414 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-414 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-414 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-414 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-414 .panel>.table,.factory-bootstrap-414 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-414 .panel>.panel-body+.table,.factory-bootstrap-414 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-414 .panel>.table>tbody:first-child td,.factory-bootstrap-414 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-414 .panel>.table-bordered,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-414 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-414 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-414 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-414 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-414 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-414 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-414 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-414 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-414 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-414 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-414 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-414 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-414 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-414 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-414 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-414 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-414 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-414 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-414 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-414 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-414 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-414 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-414 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-414 .panel-title>a{color:inherit}.factory-bootstrap-414 .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-414 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-414 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-414 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-414 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-414 .panel-group .panel-footer{border-top:0}.factory-bootstrap-414 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-414 .panel-default{border-color:#ddd}.factory-bootstrap-414 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-414 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-414 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-414 .panel-primary{border-color:#428bca}.factory-bootstrap-414 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-414 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-414 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-414 .panel-success{border-color:#d6e9c6}.factory-bootstrap-414 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-414 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-414 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-414 .panel-warning{border-color:#faebcc}.factory-bootstrap-414 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-414 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-414 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-414 .panel-danger{border-color:#ebccd1}.factory-bootstrap-414 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-414 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-414 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-414 .panel-info{border-color:#bce8f1}.factory-bootstrap-414 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-414 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-414 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-414 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-414 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-414 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-414 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-414 .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-414 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-414 .close:focus,.factory-bootstrap-414 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-414 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-414 .modal-open{overflow:hidden}.factory-bootstrap-414 .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-414 .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-414 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-414 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-414 .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-414 .modal-backdrop,.factory-bootstrap-414-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-414 .modal-backdrop.fade,.factory-bootstrap-414-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-414 .modal-backdrop.in,.factory-bootstrap-414-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-414 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-414 .modal-header .close{margin-top:-2px}.factory-bootstrap-414 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-414 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-414 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-414 .modal-footer:after,.factory-bootstrap-414 .modal-footer:before{display:table;content:" "}.factory-bootstrap-414 .modal-footer:after{clear:both}.factory-bootstrap-414 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-414 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-414 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-414 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-414 .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-414 .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-414 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-414 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-414 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-414 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-414 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-414 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-414 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-414 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-414 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-414 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-414 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-414 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-414 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-414 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-414 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-414 .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-414 .popover.top{margin-top:-10px}.factory-bootstrap-414 .popover.right{margin-left:10px}.factory-bootstrap-414 .popover.bottom{margin-top:10px}.factory-bootstrap-414 .popover.left{margin-left:-10px}.factory-bootstrap-414 .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-414 .popover-content{padding:9px 14px}.factory-bootstrap-414 .popover .arrow,.factory-bootstrap-414 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-414 .popover .arrow{border-width:11px}.factory-bootstrap-414 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-414 .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-414 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-414 .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-414 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-414 .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-414 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-414 .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-414 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-414 .carousel{position:relative}.factory-bootstrap-414 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-414 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-414 .carousel-inner>.item>a>img,.factory-bootstrap-414 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-414 .carousel-inner>.active,.factory-bootstrap-414 .carousel-inner>.next,.factory-bootstrap-414 .carousel-inner>.prev{display:block}.factory-bootstrap-414 .carousel-inner>.active{left:0}.factory-bootstrap-414 .carousel-inner>.next,.factory-bootstrap-414 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-414 .carousel-inner>.next{left:100%}.factory-bootstrap-414 .carousel-inner>.prev{left:-100%}.factory-bootstrap-414 .carousel-inner>.next.left,.factory-bootstrap-414 .carousel-inner>.prev.right{left:0}.factory-bootstrap-414 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-414 .carousel-inner>.active.right{left:100%}.factory-bootstrap-414 .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-414 .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-414 .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-414 .carousel-control:focus,.factory-bootstrap-414 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-414 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-414 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-414 .carousel-control .icon-next,.factory-bootstrap-414 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-414 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-414 .carousel-control .icon-prev{left:50%}.factory-bootstrap-414 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-414 .carousel-control .icon-next{right:50%}.factory-bootstrap-414 .carousel-control .icon-next,.factory-bootstrap-414 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-414 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-414 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-414 .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-414 .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-414 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-414 .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-414 .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-414 .clearfix:after,.factory-bootstrap-414 .clearfix:before{display:table;content:" "}.factory-bootstrap-414 .clearfix:after{clear:both}.factory-bootstrap-414 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-414 .pull-right{float:right!important}.factory-bootstrap-414 .pull-left{float:left!important}.factory-bootstrap-414 .hide{display:none!important}.factory-bootstrap-414 .show{display:block!important}.factory-bootstrap-414 .invisible{visibility:hidden}.factory-bootstrap-414 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-414 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-414 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-414 .visible-lg,.factory-bootstrap-414 .visible-md,.factory-bootstrap-414 .visible-sm,.factory-bootstrap-414 .visible-xs,.factory-bootstrap-414 td.visible-lg,.factory-bootstrap-414 td.visible-md,.factory-bootstrap-414 td.visible-sm,.factory-bootstrap-414 td.visible-xs,.factory-bootstrap-414 th.visible-lg,.factory-bootstrap-414 th.visible-md,.factory-bootstrap-414 th.visible-sm,.factory-bootstrap-414 th.visible-xs,.factory-bootstrap-414 tr.visible-lg,.factory-bootstrap-414 tr.visible-md,.factory-bootstrap-414 tr.visible-sm,.factory-bootstrap-414 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-414 .hidden-xs{display:block!important}.factory-bootstrap-414 table.hidden-xs{display:table}.factory-bootstrap-414 tr.hidden-xs{display:table-row!important}.factory-bootstrap-414 td.hidden-xs,.factory-bootstrap-414 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-414 .hidden-sm{display:block!important}.factory-bootstrap-414 table.hidden-sm{display:table}.factory-bootstrap-414 tr.hidden-sm{display:table-row!important}.factory-bootstrap-414 td.hidden-sm,.factory-bootstrap-414 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-414 .hidden-md{display:block!important}.factory-bootstrap-414 table.hidden-md{display:table}.factory-bootstrap-414 tr.hidden-md{display:table-row!important}.factory-bootstrap-414 td.hidden-md,.factory-bootstrap-414 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-414 .hidden-lg{display:block!important}.factory-bootstrap-414 table.hidden-lg{display:table}.factory-bootstrap-414 tr.hidden-lg{display:table-row!important}.factory-bootstrap-414 td.hidden-lg,.factory-bootstrap-414 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-414 .hidden-lg.hidden-xs,.factory-bootstrap-414 td.hidden-lg.hidden-xs,.factory-bootstrap-414 th.hidden-lg.hidden-xs,.factory-bootstrap-414 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-414 .hidden-lg.hidden-sm,.factory-bootstrap-414 td.hidden-lg.hidden-sm,.factory-bootstrap-414 th.hidden-lg.hidden-sm,.factory-bootstrap-414 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-414 .hidden-lg.hidden-md,.factory-bootstrap-414 td.hidden-lg.hidden-md,.factory-bootstrap-414 th.hidden-lg.hidden-md,.factory-bootstrap-414 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-414 .hidden-lg,.factory-bootstrap-414 td.hidden-lg,.factory-bootstrap-414 th.hidden-lg,.factory-bootstrap-414 tr.hidden-lg{display:none!important}}.factory-bootstrap-414 .visible-print,.factory-bootstrap-414 td.visible-print,.factory-bootstrap-414 th.visible-print,.factory-bootstrap-414 tr.visible-print{display:none!important}@media print{.factory-bootstrap-414 .visible-print{display:block!important}.factory-bootstrap-414 table.visible-print{display:table}.factory-bootstrap-414 tr.visible-print{display:table-row!important}.factory-bootstrap-414 td.visible-print,.factory-bootstrap-414 th.visible-print{display:table-cell!important}.factory-bootstrap-414 .hidden-print,.factory-bootstrap-414 td.hidden-print,.factory-bootstrap-414 th.hidden-print,.factory-bootstrap-414 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-414 .btn-danger,.factory-bootstrap-414 .btn-default,.factory-bootstrap-414 .btn-info,.factory-bootstrap-414 .btn-primary,.factory-bootstrap-414 .btn-success,.factory-bootstrap-414 .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-414 .btn-danger.active,.factory-bootstrap-414 .btn-danger:active,.factory-bootstrap-414 .btn-default.active,.factory-bootstrap-414 .btn-default:active,.factory-bootstrap-414 .btn-info.active,.factory-bootstrap-414 .btn-info:active,.factory-bootstrap-414 .btn-primary.active,.factory-bootstrap-414 .btn-primary:active,.factory-bootstrap-414 .btn-success.active,.factory-bootstrap-414 .btn-success:active,.factory-bootstrap-414 .btn-warning.active,.factory-bootstrap-414 .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-414 .btn.active,.factory-bootstrap-414 .btn:active{background-image:none}.factory-bootstrap-414 .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-414 .btn-default.active,.factory-bootstrap-414 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-414 .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-414 .btn-gold:focus,.factory-bootstrap-414 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-414 .btn-gold.active,.factory-bootstrap-414 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .btn-primary.active,.factory-bootstrap-414 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-414 .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-414 .btn-success:focus,.factory-bootstrap-414 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-414 .btn-success.active,.factory-bootstrap-414 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-414 .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-414 .btn-warning:focus,.factory-bootstrap-414 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-414 .btn-warning.active,.factory-bootstrap-414 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-414 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-414 .btn-danger.active,.factory-bootstrap-414 .btn-danger:active,.factory-bootstrap-414 .btn-danger:focus,.factory-bootstrap-414 .btn-danger:hover,.factory-bootstrap-414 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-414 .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-414 .btn-info:focus,.factory-bootstrap-414 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-414 .btn-info.active,.factory-bootstrap-414 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-414 .img-thumbnail,.factory-bootstrap-414 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-414 .dropdown-menu>li>a:focus,.factory-bootstrap-414 .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-414 .dropdown-menu>.active>a,.factory-bootstrap-414 .dropdown-menu>.active>a:focus,.factory-bootstrap-414 .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-414 .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-414 .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-414 .navbar-brand,.factory-bootstrap-414 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-414 .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-414 .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-414 .navbar-inverse .navbar-brand,.factory-bootstrap-414 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-414 .navbar-fixed-bottom,.factory-bootstrap-414 .navbar-fixed-top,.factory-bootstrap-414 .navbar-static-top{border-radius:0}.factory-bootstrap-414 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-414 .alert .actions{padding-top:10px}.factory-bootstrap-414 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-414 .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-414 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-414 .alert-normal,.factory-bootstrap-414 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-414 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-414 .alert-danger a:not(.btn),.factory-bootstrap-414 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-414 .list-group-item.active,.factory-bootstrap-414 .list-group-item.active:focus,.factory-bootstrap-414 .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-414 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-414 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-414 .factory-hidden{display:none}.factory-bootstrap-414 .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-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .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-412 .btn-primary:disabled,.factory-bootstrap-412 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-412 .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-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{background-color:#a3b745;border-color:#839237}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .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-414 .btn-primary:disabled,.factory-bootstrap-414 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-414 .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-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .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-412 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-412 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-412 .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-412 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-412 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-412 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-412 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-412 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-412 .factory-form-group legend+.control-group{margin-top:0}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-414 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-414 .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-414 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-414 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-414 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-414 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-414 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-414 .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-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .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-412 .btn-primary:disabled,.factory-bootstrap-412 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-412 .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-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{background-color:#04a4cc;border-color:#037c9a}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .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-414 .btn-primary:disabled,.factory-bootstrap-414 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-414 .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-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .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-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .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-412 .btn-primary:disabled,.factory-bootstrap-412 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-412 .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-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{background-color:#e14d43;border-color:#d02a21}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .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-414 .btn-primary:disabled,.factory-bootstrap-414 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-414 .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-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .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-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .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-412 .btn-primary:disabled,.factory-bootstrap-412 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-412 .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-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{background-color:#9ebaa0;border-color:#80a583}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .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-414 .btn-primary:disabled,.factory-bootstrap-414 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-414 .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-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .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-412 .factory-separator{border-bottom:1px solid #f9f9f9;border-top:1px solid #d1d1d1;margin-bottom:25px}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-412 .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-412 .btn-primary:focus,.factory-bootstrap-412 .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-412 .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-412 .btn-primary:disabled,.factory-bootstrap-412 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-412 .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-412 .pagination>.active>a,.factory-bootstrap-412 .pagination>.active>a:focus,.factory-bootstrap-412 .pagination>.active>a:hover,.factory-bootstrap-412 .pagination>.active>span,.factory-bootstrap-412 .pagination>.active>span:focus,.factory-bootstrap-412 .pagination>.active>span:hover{background-color:#dd823b;border-color:#c36822}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .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-414 .btn-primary:focus,.factory-bootstrap-414 .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-414 .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-414 .btn-primary:disabled,.factory-bootstrap-414 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-414 .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-414 .pagination>.active>a,.factory-bootstrap-414 .pagination>.active>a:focus,.factory-bootstrap-414 .pagination>.active>a:hover,.factory-bootstrap-414 .pagination>.active>span,.factory-bootstrap-414 .pagination>.active>span:focus,.factory-bootstrap-414 .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-412 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-412 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-412 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-412 .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-412 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-412 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-414 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-414 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-414 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-414 .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-414 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-414 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-412 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-412 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-412 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-412 .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-412 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-412 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-412 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-412 .factory-dropdown.factory-ddslick-way .dd-selected{padding:8px 12px 8px 11px!important}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-414 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-414 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-414 .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-414 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-414 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-414 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-414 .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-412 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-412 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-412 .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-412 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-412 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-412 .factory-mtextbox-add-item{display:block;margin-top:10px}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-414 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-414 .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-414 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-414 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-414 .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-412 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-412 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-412 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-412 .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-412 .factory-tab .factory-more-link-hide:hover{color:#999}
8
  */
9
 
10
 
11
+ .factory-bootstrap-414 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-414 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-414 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-414 .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-414 .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.factoryBootstrap412_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.factoryBootstrap412_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.factoryBootstrap414_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.factoryBootstrap414_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.factoryBootstrap412_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.factoryBootstrap412_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-412 .factory-checkbox.factory-buttons-way").factoryBootstrap412_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.factoryBootstrap414_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.factoryBootstrap414_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-414 .factory-checkbox.factory-buttons-way").factoryBootstrap414_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.factoryBootstrap412_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.factoryBootstrap412_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-412 .factory-dropdown").factoryBootstrap412_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.factoryBootstrap414_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.factoryBootstrap414_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-414 .factory-dropdown").factoryBootstrap414_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.factoryBootstrap412_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.factoryBootstrap412_listControl.Constructor=b,a(function(){a(".factory-bootstrap-412 .factory-list").factoryBootstrap412_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.factoryBootstrap414_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.factoryBootstrap414_listControl.Constructor=b,a(function(){a(".factory-bootstrap-414 .factory-list").factoryBootstrap414_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.factoryBootstrap412_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-412 .factory-multiple-textbox-group").factoryBootstrap412_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.factoryBootstrap414_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-414 .factory-multiple-textbox-group").factoryBootstrap414_MultipleTextboxControl()})}(jQuery);
libs/factory/bootstrap/boot.php CHANGED
@@ -19,19 +19,19 @@
19
  return;
20
  }
21
 
22
- if( defined('FACTORY_BOOTSTRAP_412_LOADED') ) {
23
  return;
24
  }
25
- define('FACTORY_BOOTSTRAP_412_LOADED', true);
26
 
27
- define('FACTORY_BOOTSTRAP_412_DIR', dirname(__FILE__));
28
- define('FACTORY_BOOTSTRAP_412_URL', plugins_url(null, __FILE__));
29
 
30
  // sets version of admin interface
31
- define('FACTORY_BOOTSTRAP_412_VERSION', 'FACTORY_BOOTSTRAP_412');
32
 
33
  if( !defined('FACTORY_FLAT_ADMIN') ) {
34
  define('FACTORY_FLAT_ADMIN', true);
35
  }
36
 
37
- include_once(FACTORY_BOOTSTRAP_412_DIR . '/includes/functions.php');
19
  return;
20
  }
21
 
22
+ if( defined('FACTORY_BOOTSTRAP_414_LOADED') ) {
23
  return;
24
  }
25
+ define('FACTORY_BOOTSTRAP_414_LOADED', true);
26
 
27
+ define('FACTORY_BOOTSTRAP_414_DIR', dirname(__FILE__));
28
+ define('FACTORY_BOOTSTRAP_414_URL', plugins_url(null, __FILE__));
29
 
30
  // sets version of admin interface
31
+ define('FACTORY_BOOTSTRAP_414_VERSION', 'FACTORY_BOOTSTRAP_414');
32
 
33
  if( !defined('FACTORY_FLAT_ADMIN') ) {
34
  define('FACTORY_FLAT_ADMIN', true);
35
  }
36
 
37
+ include_once(FACTORY_BOOTSTRAP_414_DIR . '/includes/functions.php');
libs/factory/bootstrap/includes/functions.php CHANGED
@@ -1,292 +1,294 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
3
- * This file manages assets of the Factory Bootstap.
4
  *
5
- * @author Alex Kovalev <alex@byonepress.com>
6
- * @author Paul Kashtanoff <paul@byonepress.com>
7
- * @copyright (c) 2018, OnePress Ltd
8
- *
9
- * @package factory-bootstrap
10
- * @since 1.0.0
11
- */
12
-
13
- add_action('wbcr_factory_bootstrap_412_plugin_created', 'wbcr_factory_bootstrap_412_plugin_created');
14
-
15
- /**
16
- * @param Wbcr_Factory412_Plugin $plugin
17
  */
18
- function wbcr_factory_bootstrap_412_plugin_created($plugin)
19
- {
20
- $manager = new Wbcr_FactoryBootstrap412_Manager($plugin);
21
- $plugin->setBootstap($manager);
22
- }
23
-
24
- if( !class_exists('Wbcr_FactoryBootstrap412_Manager') ) {
25
-
26
  /**
27
- * The Bootstrap Manager class.
28
  *
29
  * @since 3.2.0
 
30
  */
31
- class Wbcr_FactoryBootstrap412_Manager {
32
-
33
- /**
34
- * A plugin for which the manager was created.
35
- *
36
- * @since 3.2.0
37
- * @var Wbcr_Factory412_Plugin
38
- */
39
- public $plugin;
40
-
41
- /**
42
- * Contains scripts to include.
43
- *
44
- * @since 3.2.0
45
- * @var string[]
46
- */
47
- public $scripts = array();
48
-
49
- /**
50
- * Contains styles to include.
51
- *
52
- * @since 3.2.0
53
- * @var string[]
54
- */
55
- public $styles = array();
56
-
57
- /**
58
- * Createas a new instance of the license api for a given plugin.
59
- *
60
- * @since 1.0.0
61
- */
62
- public function __construct(Wbcr_Factory412_Plugin $plugin)
63
- {
64
- $this->plugin = $plugin;
65
-
66
- add_action('admin_enqueue_scripts', array($this, 'loadAssets'));
67
- add_filter('admin_body_class', array($this, 'adminBodyClass'));
68
- }
69
-
70
- /**
71
- * Includes the Bootstrap scripts.
72
- * @since 3.2.0
73
- * @param array|string $scripts
74
- */
75
- public function enqueueScript($scripts)
76
- {
77
- if( is_array($scripts) ) {
78
- foreach($scripts as $script) {
79
- if( !in_array($script, $this->scripts) ) {
80
- $this->scripts[] = $script;
81
- }
82
- }
83
- } else {
84
- if( !in_array($scripts, $this->scripts) ) {
85
- $this->scripts[] = $scripts;
86
  }
87
  }
88
- }
89
-
90
- /**
91
- * * Includes the Bootstrap styles.
92
- *
93
- * @since 3.2.0
94
- * @param array|string $styles
95
- */
96
- public function enqueueStyle($styles)
97
- {
98
-
99
- if( is_array($styles) ) {
100
- foreach($styles as $style) {
101
- if( !in_array($style, $this->styles) ) {
102
- $this->styles[] = $style;
103
- }
104
- }
105
- } else {
106
- if( !in_array($styles, $this->styles) ) {
107
- $this->styles[] = $styles;
108
- }
109
  }
110
  }
111
-
112
- /**
113
- * Loads Bootstrap assets.
114
- *
115
- * @see admin_enqueue_scripts
116
- *
117
- * @since 3.2.0
118
- * @return void
119
- */
120
- public function loadAssets($hook)
121
- {
122
-
123
- do_action('wbcr_factory_412_bootstrap_enqueue_scripts', $hook);
124
- do_action('wbcr_factory_412_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook);
125
-
126
- $dependencies = array();
127
- if( !empty($this->scripts) ) {
128
- $dependencies[] = 'jquery';
129
- $dependencies[] = 'jquery-ui-core';
130
- $dependencies[] = 'jquery-ui-widget';
131
- }
132
-
133
- foreach($this->scripts as $script) {
134
- switch( $script ) {
135
- case 'plugin.iris':
136
- $dependencies[] = 'jquery-ui-widget';
137
- $dependencies[] = 'jquery-ui-slider';
138
- $dependencies[] = 'jquery-ui-draggable';
139
- break;
140
  }
141
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
- if( !empty($this->scripts) ) {
144
- $this->enqueueScripts($this->scripts, 'js', $dependencies);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  }
146
- if( !empty($this->styles) ) {
147
- $this->enqueueScripts($this->styles, 'css', $dependencies);
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  }
 
149
 
150
- $user_id = get_current_user_id();
151
- $color_name = get_user_meta($user_id, 'admin_color', true);
152
-
153
- if( $color_name !== 'fresh' ) {
154
- if( file_exists(FACTORY_BOOTSTRAP_412_DIR . '/assets/flat/css/bootstrap.' . $color_name . '.css') ) {
155
- wp_enqueue_style('wbcr-factory-bootstrap-412-colors', FACTORY_BOOTSTRAP_412_URL . '/assets/flat/css/bootstrap.' . $color_name . '.css');
156
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  }
158
-
159
- if( $color_name == 'light' ) {
160
- $primary_dark = '#037c9a';
161
- $primary_light = '#04a4cc';
162
- } elseif( $color_name == 'blue' ) {
163
- $primary_dark = '#d39323';
164
- $primary_light = '#e1a948';
165
- } elseif( $color_name == 'coffee' ) {
166
- $primary_dark = '#b78a66';
167
- $primary_light = '#c7a589';
168
- } elseif( $color_name == 'ectoplasm' ) {
169
- $primary_dark = '#839237';
170
- $primary_light = '#a3b745';
171
- } elseif( $color_name == 'ocean' ) {
172
- $primary_dark = '#80a583';
173
- $primary_light = '#9ebaa0';
174
- } elseif( $color_name == 'midnight' ) {
175
- $primary_dark = '#d02a21';
176
- $primary_light = '#e14d43';
177
- } elseif( $color_name == 'sunrise' ) {
178
- $primary_dark = '#c36822';
179
- $primary_light = '#dd823b';
180
- } else {
181
- $primary_dark = '#0074a2';
182
- $primary_light = '#2ea2cc';
183
  }
184
-
185
- ?>
186
-
187
- <script>
188
- if( !window.factory ) {
189
- window.factory = {};
190
- }
191
- if( !window.factory.factoryBootstrap412 ) {
192
- window.factory.factoryBootstrap412 = {};
193
- }
194
- window.factory.factoryBootstrap412.colors = {
195
- primaryDark: '<?php echo $primary_dark ?>',
196
- primaryLight: '<?php echo $primary_light ?>'
197
- };
198
- </script>
199
  <?php
200
- }
 
 
 
 
 
 
 
 
 
201
 
202
  /**
203
- * @param array $sripts
204
- * @param string $type
205
- * @param array $dependencies
206
  */
207
- protected function enqueueScripts(array $sripts, $type = 'js', array $dependencies)
208
- {
209
 
210
- $is_first = true;
211
- $cache_id = md5(implode(',', $this->scripts) . $type . $this->plugin->getPluginVersion());
212
- $cache_dir_path = FACTORY_BOOTSTRAP_412_DIR . '/assets/cache/';
213
- $cache_dir_url = FACTORY_BOOTSTRAP_412_URL . '/assets/cache/';
214
 
215
- $cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
216
- $cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
217
 
218
- if( file_exists($cache_filepath) ) {
219
- if( $type == 'js' ) {
220
- wp_enqueue_script('wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion());
221
- } else {
222
- wp_enqueue_style('wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, array(), $this->plugin->getPluginVersion());
 
 
 
 
 
 
223
  }
224
  } else {
225
- $cache_dir_exists = false;
226
- if( !file_exists($cache_dir_path) ) {
227
- if( @mkdir($cache_dir_path, 0777) && wp_is_writable($cache_dir_path) ) {
228
- $cache_dir_exists = true;
229
- }
230
- } else {
231
- if( wp_is_writable($cache_dir_path) ) {
232
- $cache_dir_exists = true;
233
- }
234
  }
 
235
 
236
- $concat_files = array();
237
- foreach($sripts as $script_to_load) {
238
- $script_to_load = sanitize_text_field($script_to_load);
239
- if( $cache_dir_exists ) {
240
- $fname = FACTORY_BOOTSTRAP_412_DIR . "/assets/$type-min/$script_to_load.min." . $type;
241
- if( file_exists($fname) ) {
242
- $f = @fopen($fname, 'r');
243
- $concat_files[] = @fread($f, filesize($fname));
244
- @fclose($f);
245
- }
 
 
 
246
  } else {
247
- if( $type == 'js' ) {
248
- wp_enqueue_script(md5($script_to_load), FACTORY_BOOTSTRAP_412_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first
249
- ? $dependencies
250
- : false, $this->plugin->getPluginVersion());
251
- } else {
252
- wp_enqueue_style(md5($script_to_load), FACTORY_BOOTSTRAP_412_URL . "/assets/$type-min/$script_to_load.min." . $type, array(), $this->plugin->getPluginVersion());
253
- }
254
- $is_first = false;
255
  }
 
256
  }
 
257
 
258
- if( $cache_dir_exists && !empty($concat_files) ) {
259
 
260
- $cf = @fopen($cache_filepath, 'w');
261
- $write_content = implode(PHP_EOL, $concat_files);
262
- @fwrite($cf, $write_content);
263
- @fclose($cf);
 
264
 
265
- if( file_exists($cache_filepath) ) {
266
- if( $type == 'js' ) {
267
- wp_enqueue_script('wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion());
268
- } else {
269
- wp_enqueue_style('wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, array(), $this->plugin->getPluginVersion());
270
- }
271
  }
272
  }
273
  }
274
  }
 
275
 
276
- /**
277
- * Adds the body classes: 'factory-flat or 'factory-volumetric'.
278
- *
279
- * @since 3.2.0
280
- * @param string $classes
281
- * @return string
282
- */
283
- public function adminBodyClass($classes)
284
- {
285
- $classes .= FACTORY_FLAT_ADMIN
286
- ? ' factory-flat '
287
- : ' factory-volumetric ';
288
 
289
- return $classes;
290
- }
291
  }
292
- }
 
1
  <?php
2
+ /**
3
+ * This file manages assets of the Factory Bootstap.
4
+ *
5
+ * @author Alex Kovalev <alex@byonepress.com>
6
+ * @author Paul Kashtanoff <paul@byonepress.com>
7
+ * @since 1.0.0
8
+ * @package factory-bootstrap
9
+ * @copyright (c) 2018, OnePress Ltd
10
+ *
11
+ */
12
+
13
+ add_action( 'wbcr_factory_bootstrap_414_plugin_created', 'wbcr_factory_bootstrap_414_plugin_created' );
14
+
15
+ /**
16
+ * @param Wbcr_Factory414_Plugin $plugin
17
+ */
18
+ function wbcr_factory_bootstrap_414_plugin_created( $plugin ) {
19
+ $manager = new Wbcr_FactoryBootstrap414_Manager( $plugin );
20
+ $plugin->setBootstap( $manager );
21
+ }
22
+
23
+ if ( ! class_exists( 'Wbcr_FactoryBootstrap414_Manager' ) ) {
24
+
25
  /**
26
+ * The Bootstrap Manager class.
27
  *
28
+ * @since 3.2.0
 
 
 
 
 
 
 
 
 
 
 
29
  */
30
+ class Wbcr_FactoryBootstrap414_Manager {
31
+
 
 
 
 
 
 
32
  /**
33
+ * A plugin for which the manager was created.
34
  *
35
  * @since 3.2.0
36
+ * @var Wbcr_Factory414_Plugin
37
  */
38
+ public $plugin;
39
+
40
+ /**
41
+ * Contains scripts to include.
42
+ *
43
+ * @since 3.2.0
44
+ * @var string[]
45
+ */
46
+ public $scripts = [];
47
+
48
+ /**
49
+ * Contains styles to include.
50
+ *
51
+ * @since 3.2.0
52
+ * @var string[]
53
+ */
54
+ public $styles = [];
55
+
56
+ /**
57
+ * Createas a new instance of the license api for a given plugin.
58
+ *
59
+ * @since 1.0.0
60
+ */
61
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
62
+ $this->plugin = $plugin;
63
+
64
+ add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
65
+ add_filter( 'admin_body_class', [ $this, 'adminBodyClass' ] );
66
+ }
67
+
68
+ /**
69
+ * Includes the Bootstrap scripts.
70
+ *
71
+ * @since 3.2.0
72
+ *
73
+ * @param array|string $scripts
74
+ */
75
+ public function enqueueScript( $scripts ) {
76
+ if ( is_array( $scripts ) ) {
77
+ foreach ( $scripts as $script ) {
78
+ if ( ! in_array( $script, $this->scripts ) ) {
79
+ $this->scripts[] = $script;
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  }
81
  }
82
+ } else {
83
+ if ( ! in_array( $scripts, $this->scripts ) ) {
84
+ $this->scripts[] = $scripts;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
  }
87
+ }
88
+
89
+ /**
90
+ * * Includes the Bootstrap styles.
91
+ *
92
+ * @since 3.2.0
93
+ *
94
+ * @param array|string $styles
95
+ */
96
+ public function enqueueStyle( $styles ) {
97
+
98
+ if ( is_array( $styles ) ) {
99
+ foreach ( $styles as $style ) {
100
+ if ( ! in_array( $style, $this->styles ) ) {
101
+ $this->styles[] = $style;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  }
103
  }
104
+ } else {
105
+ if ( ! in_array( $styles, $this->styles ) ) {
106
+ $this->styles[] = $styles;
107
+ }
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Loads Bootstrap assets.
113
+ *
114
+ * @since 3.2.0
115
+ * @return void
116
+ * @see admin_enqueue_scripts
117
+ *
118
+ */
119
+ public function loadAssets( $hook ) {
120
 
121
+ do_action( 'wbcr_factory_414_bootstrap_enqueue_scripts', $hook );
122
+ do_action( 'wbcr_factory_414_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook );
123
+
124
+ $dependencies = [];
125
+ if ( ! empty( $this->scripts ) ) {
126
+ $dependencies[] = 'jquery';
127
+ $dependencies[] = 'jquery-ui-core';
128
+ $dependencies[] = 'jquery-ui-widget';
129
+ }
130
+
131
+ foreach ( $this->scripts as $script ) {
132
+ switch ( $script ) {
133
+ case 'plugin.iris':
134
+ $dependencies[] = 'jquery-ui-widget';
135
+ $dependencies[] = 'jquery-ui-slider';
136
+ $dependencies[] = 'jquery-ui-draggable';
137
+ break;
138
  }
139
+ }
140
+
141
+ if ( ! empty( $this->scripts ) ) {
142
+ $this->enqueueScripts( $this->scripts, 'js', $dependencies );
143
+ }
144
+ if ( ! empty( $this->styles ) ) {
145
+ $this->enqueueScripts( $this->styles, 'css', $dependencies );
146
+ }
147
+
148
+ $user_id = get_current_user_id();
149
+ $color_name = get_user_meta( $user_id, 'admin_color', true );
150
+
151
+ if ( $color_name !== 'fresh' ) {
152
+ if ( file_exists( FACTORY_BOOTSTRAP_414_DIR . '/assets/flat/css/bootstrap.' . $color_name . '.css' ) ) {
153
+ wp_enqueue_style( 'wbcr-factory-bootstrap-414-colors', FACTORY_BOOTSTRAP_414_URL . '/assets/flat/css/bootstrap.' . $color_name . '.css' );
154
  }
155
+ }
156
 
157
+ if ( $color_name == 'light' ) {
158
+ $primary_dark = '#037c9a';
159
+ $primary_light = '#04a4cc';
160
+ } else if ( $color_name == 'blue' ) {
161
+ $primary_dark = '#d39323';
162
+ $primary_light = '#e1a948';
163
+ } else if ( $color_name == 'coffee' ) {
164
+ $primary_dark = '#b78a66';
165
+ $primary_light = '#c7a589';
166
+ } else if ( $color_name == 'ectoplasm' ) {
167
+ $primary_dark = '#839237';
168
+ $primary_light = '#a3b745';
169
+ } else if ( $color_name == 'ocean' ) {
170
+ $primary_dark = '#80a583';
171
+ $primary_light = '#9ebaa0';
172
+ } else if ( $color_name == 'midnight' ) {
173
+ $primary_dark = '#d02a21';
174
+ $primary_light = '#e14d43';
175
+ } else if ( $color_name == 'sunrise' ) {
176
+ $primary_dark = '#c36822';
177
+ $primary_light = '#dd823b';
178
+ } else {
179
+ $primary_dark = '#0074a2';
180
+ $primary_light = '#2ea2cc';
181
+ }
182
+
183
+ ?>
184
+ <script>
185
+ if( !window.factory ) {
186
+ window.factory = {};
187
  }
188
+ if( !window.factory.factoryBootstrap414 ) {
189
+ window.factory.factoryBootstrap414 = {};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  }
191
+ window.factory.factoryBootstrap414.colors = {
192
+ primaryDark: '<?php echo $primary_dark ?>',
193
+ primaryLight: '<?php echo $primary_light ?>'
194
+ };
195
+ </script>
 
 
 
 
 
 
 
 
 
 
196
  <?php
197
+ }
198
+
199
+ /**
200
+ * @param array $sripts
201
+ * @param string $type
202
+ * @param array $dependencies
203
+ */
204
+ protected function enqueueScripts( array $sripts, $type = 'js', array $dependencies ) {
205
+
206
+ $is_first = true;
207
 
208
  /**
209
+ * Sets permission for file caching and combining into one file.
210
+ *
211
+ * @since 4.1.0
212
  */
213
+ $cache_enable = apply_filters( 'wbcr/factory/bootstrap/cache_enable', true );
 
214
 
215
+ $cache_id = md5( implode( ',', $this->scripts ) . $type . $this->plugin->getPluginVersion() );
216
+ $cache_dir_path = FACTORY_BOOTSTRAP_414_DIR . '/assets/cache/';
217
+ $cache_dir_url = FACTORY_BOOTSTRAP_414_URL . '/assets/cache/';
 
218
 
219
+ $cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
220
+ $cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
221
 
222
+ if ( $cache_enable && file_exists( $cache_filepath ) ) {
223
+ if ( $type == 'js' ) {
224
+ wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
225
+ } else {
226
+ wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
227
+ }
228
+ } else {
229
+ $cache_dir_exists = false;
230
+ if ( ! file_exists( $cache_dir_path ) ) {
231
+ if ( @mkdir( $cache_dir_path, 0755 ) && wp_is_writable( $cache_dir_path ) ) {
232
+ $cache_dir_exists = true;
233
  }
234
  } else {
235
+ if ( wp_is_writable( $cache_dir_path ) ) {
236
+ $cache_dir_exists = true;
 
 
 
 
 
 
 
237
  }
238
+ }
239
 
240
+ $concat_files = [];
241
+ foreach ( $sripts as $script_to_load ) {
242
+ $script_to_load = sanitize_text_field( $script_to_load );
243
+ if ( $cache_enable && $cache_dir_exists ) {
244
+ $fname = FACTORY_BOOTSTRAP_414_DIR . "/assets/$type-min/$script_to_load.min." . $type;
245
+ if ( file_exists( $fname ) ) {
246
+ $f = @fopen( $fname, 'r' );
247
+ $concat_files[] = @fread( $f, filesize( $fname ) );
248
+ @fclose( $f );
249
+ }
250
+ } else {
251
+ if ( $type == 'js' ) {
252
+ wp_enqueue_script( md5( $script_to_load ), FACTORY_BOOTSTRAP_414_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first ? $dependencies : false, $this->plugin->getPluginVersion() );
253
  } else {
254
+ wp_enqueue_style( md5( $script_to_load ), FACTORY_BOOTSTRAP_414_URL . "/assets/$type-min/$script_to_load.min." . $type, [], $this->plugin->getPluginVersion() );
 
 
 
 
 
 
 
255
  }
256
+ $is_first = false;
257
  }
258
+ }
259
 
260
+ if ( $cache_enable && $cache_dir_exists && ! empty( $concat_files ) ) {
261
 
262
+ $cf = @fopen( $cache_filepath, 'w' );
263
+ $write_content = implode( PHP_EOL, $concat_files );
264
+ @fwrite( $cf, $write_content );
265
+ @fclose( $cf );
266
+ chmod( $cache_filepath, 0755 );
267
 
268
+ if ( file_exists( $cache_filepath ) ) {
269
+ if ( $type == 'js' ) {
270
+ wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
271
+ } else {
272
+ wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
 
273
  }
274
  }
275
  }
276
  }
277
+ }
278
 
279
+ /**
280
+ * Adds the body classes: 'factory-flat or 'factory-volumetric'.
281
+ *
282
+ * @since 3.2.0
283
+ *
284
+ * @param string $classes
285
+ *
286
+ * @return string
287
+ */
288
+ public function adminBodyClass( $classes ) {
289
+ $classes .= FACTORY_FLAT_ADMIN ? ' factory-flat ' : ' factory-volumetric ';
 
290
 
291
+ return $classes;
 
292
  }
293
+ }
294
+ }
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-412-impressive-page-template .wbcr-factory-clearfy-208-multisite-suggetion {
9
  padding: 30px 80px;
10
  }
11
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-clearfy-208-multisite-suggetion h3 {
12
  margin: 0 0 20px;
13
  }
14
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-clearfy-208-multisite-suggetion .wbcr-factory-inner-contanier {
15
  border: 2px dashed #8bc34a;
16
  background: #fff;
17
  padding: 20px;
18
  }
19
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-clearfy-208-multisite-suggetion .wbcr-factory-activate-premium:focus {
44
  outline: none;
45
  border: 0;
46
  }
47
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-clearfy-208-multisite-suggetion .wbcr-factory-purchase-premium:focus {
72
  outline: none;
73
  border: 0;
74
  }
75
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-pro-suggettion {
76
  background: #fff;
77
  color: #353535;
78
  font-weight: 600;
79
  border: 2px dashed #8bc34a;
80
  }
81
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-pro-suggettion ul {
93
  position: relative;
94
  margin-bottom: 20px;
95
  }
96
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-pro-suggettion ul li {
97
  font-size: 15px;
98
  padding: 7px;
99
  padding-left: 20px;
100
  }
101
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-clearfy-208-multisite-pro-suggetion {
145
  padding: 10px 80px;
146
  }
147
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-pro-suggettion {
148
  padding: 10px;
149
  }
150
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-pro-suggettion ul {
157
  margin-bottom: 20px;
158
  }
159
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-pro-suggettion ul li {
160
  font-size: 13px;
161
  padding: 2px;
162
  padding-left: 10px;
163
  }
164
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-208-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-414-impressive-page-template .wbcr-factory-clearfy-209-multisite-suggetion {
9
  padding: 30px 80px;
10
  }
11
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-clearfy-209-multisite-suggetion h3 {
12
  margin: 0 0 20px;
13
  }
14
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-clearfy-209-multisite-suggetion .wbcr-factory-inner-contanier {
15
  border: 2px dashed #8bc34a;
16
  background: #fff;
17
  padding: 20px;
18
  }
19
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-clearfy-209-multisite-suggetion .wbcr-factory-activate-premium:focus {
44
  outline: none;
45
  border: 0;
46
  }
47
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-clearfy-209-multisite-suggetion .wbcr-factory-purchase-premium:focus {
72
  outline: none;
73
  border: 0;
74
  }
75
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-pro-suggettion {
76
  background: #fff;
77
  color: #353535;
78
  font-weight: 600;
79
  border: 2px dashed #8bc34a;
80
  }
81
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-pro-suggettion ul {
93
  position: relative;
94
  margin-bottom: 20px;
95
  }
96
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-pro-suggettion ul li {
97
  font-size: 15px;
98
  padding: 7px;
99
  padding-left: 20px;
100
  }
101
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-clearfy-209-multisite-pro-suggetion {
145
  padding: 10px 80px;
146
  }
147
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-pro-suggettion {
148
  padding: 10px;
149
  }
150
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-pro-suggettion ul {
157
  margin-bottom: 20px;
158
  }
159
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-pro-suggettion ul li {
160
  font-size: 13px;
161
  padding: 2px;
162
  padding-left: 10px;
163
  }
164
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-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-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-209-pro-suggettion .wbcr-factory-purchase-premium {
172
  font-weight: 700;
173
  line-height: 16px;
174
  font-size: 12px;
libs/factory/clearfy/assets/js/globals.js CHANGED
@@ -2,8 +2,8 @@
2
  * Глобальный JS файл, который регистрирует глобальные переменные с общими методами для всех компонентов Clearfy
3
  * и самого Clearfy.
4
  *
5
- * $.wbcr_factory_clearfy_208.app - методы для работы с приложением. Скрыть, показать уведомления.
6
- * $.wbcr_factory_clearfy_208.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_208 ) {
17
- $.wbcr_factory_clearfy_208 = {};
18
  }
19
 
20
- $.wbcr_factory_clearfy_208.app = $.wbcr_factory_clearfy_208.app || {
21
  /**
22
  * Создает и показывает уведомление внутри интерфейса Clearfy
23
  *
@@ -63,12 +63,12 @@
63
  /**
64
  * Хук выполняет проивольную функцию, после того как уведомление отображено
65
  * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
66
- * Пример регистрации хука $.wbcr_factory_clearfy_208.hooks.add('wbcr/factory_clearfy_208/updated',
67
  * function(noticeId) {});
68
  * @param {string} noticeId - id уведомления
69
  */
70
- $.wbcr_factory_clearfy_208.hooks.run('wbcr/factory_clearfy_208/showed_notice', [noticeId]);
71
- $.wbcr_factory_clearfy_208.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_208.hooks.add('wbcr/factory_clearfy_208/updated',
97
  * function(noticeId)
98
  * {});
99
  * @param {string} noticeId - id уведомления
100
  */
101
- $.wbcr_factory_clearfy_208.hooks.run('wbcr/factory_clearfy_208/hidded_notice', [noticeId]);
102
- $.wbcr_factory_clearfy_208.hooks.run('wbcr/clearfy/hidded_notice', [noticeId]);
103
  });
104
  },
105
 
@@ -116,7 +116,7 @@
116
 
117
  };
118
 
119
- $.wbcr_factory_clearfy_208.filters = $.wbcr_factory_clearfy_208.filters || {
120
 
121
  /**
122
  * A set of registered filters.
@@ -183,20 +183,20 @@
183
  }
184
  };
185
 
186
- $.wbcr_factory_clearfy_208.hooks = $.wbcr_factory_clearfy_208.hooks || {
187
 
188
  /**
189
  * Applies filters to a given input value.
190
  */
191
  run: function(filterName, args) {
192
- $.wbcr_factory_clearfy_208.filters.run(filterName, args);
193
  },
194
 
195
  /**
196
  * Registers a new filter.
197
  */
198
  add: function(filterName, callback, priority) {
199
- $.wbcr_factory_clearfy_208.filters.add(filterName, callback, priority);
200
  }
201
  };
202
 
2
  * Глобальный JS файл, который регистрирует глобальные переменные с общими методами для всех компонентов Clearfy
3
  * и самого Clearfy.
4
  *
5
+ * $.wbcr_factory_clearfy_209.app - методы для работы с приложением. Скрыть, показать уведомления.
6
+ * $.wbcr_factory_clearfy_209.hooks - это иммитация хуков и фильтров аналогично тем, что используются в Wordpress
7
  *
8
  * Copyright 2018, Webcraftic, http://webcraftic.com
9
  *
13
  (function($) {
14
  'use strict';
15
 
16
+ if( !$.wbcr_factory_clearfy_209 ) {
17
+ $.wbcr_factory_clearfy_209 = {};
18
  }
19
 
20
+ $.wbcr_factory_clearfy_209.app = $.wbcr_factory_clearfy_209.app || {
21
  /**
22
  * Создает и показывает уведомление внутри интерфейса Clearfy
23
  *
63
  /**
64
  * Хук выполняет проивольную функцию, после того как уведомление отображено
65
  * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
66
+ * Пример регистрации хука $.wbcr_factory_clearfy_209.hooks.add('wbcr/factory_clearfy_209/updated',
67
  * function(noticeId) {});
68
  * @param {string} noticeId - id уведомления
69
  */
70
+ $.wbcr_factory_clearfy_209.hooks.run('wbcr/factory_clearfy_209/showed_notice', [noticeId]);
71
+ $.wbcr_factory_clearfy_209.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_209.hooks.add('wbcr/factory_clearfy_209/updated',
97
  * function(noticeId)
98
  * {});
99
  * @param {string} noticeId - id уведомления
100
  */
101
+ $.wbcr_factory_clearfy_209.hooks.run('wbcr/factory_clearfy_209/hidded_notice', [noticeId]);
102
+ $.wbcr_factory_clearfy_209.hooks.run('wbcr/clearfy/hidded_notice', [noticeId]);
103
  });
104
  },
105
 
116
 
117
  };
118
 
119
+ $.wbcr_factory_clearfy_209.filters = $.wbcr_factory_clearfy_209.filters || {
120
 
121
  /**
122
  * A set of registered filters.
183
  }
184
  };
185
 
186
+ $.wbcr_factory_clearfy_209.hooks = $.wbcr_factory_clearfy_209.hooks || {
187
 
188
  /**
189
  * Applies filters to a given input value.
190
  */
191
  run: function(filterName, args) {
192
+ $.wbcr_factory_clearfy_209.filters.run(filterName, args);
193
  },
194
 
195
  /**
196
  * Registers a new filter.
197
  */
198
  add: function(filterName, callback, priority) {
199
+ $.wbcr_factory_clearfy_209.filters.add(filterName, callback, priority);
200
  }
201
  };
202
 
libs/factory/clearfy/assets/js/license-manager.js CHANGED
@@ -20,7 +20,7 @@ jQuery(function($) {
20
  // Глобальные уведомления не трогаем
21
 
22
  for( i = 0; i < allNotices.length; i++ ) {
23
- $.wbcr_factory_clearfy_208.app.hideNotice(allNotices[i]);
24
  }
25
 
26
  $('.wcl-control-btn').hide();
@@ -57,7 +57,7 @@ jQuery(function($) {
57
 
58
  if( response.data ) {
59
  console.log(response.data.error_message);
60
- noticeId = $.wbcr_factory_clearfy_208.app.showNotice('Error: [' + response.data.error_message + ']', 'danger');
61
  allNotices.push(noticeId);
62
  } else {
63
  console.log(response);
@@ -67,7 +67,7 @@ jQuery(function($) {
67
  }
68
 
69
  if( response.data && response.data.message ) {
70
- noticeId = $.wbcr_factory_clearfy_208.app.showNotice(response.data.message, 'success');
71
  allNotices.push(noticeId);
72
 
73
  // todo: доработать генерацию формы, вместо перезагрузки страницы
@@ -84,7 +84,7 @@ jQuery(function($) {
84
  console.log(xhr.responseText);
85
  console.log(thrownError);
86
 
87
- var noticeId = $.wbcr_factory_clearfy_208.app.showNotice('Error: [' + thrownError + '] Status: [' + xhr.status + '] Error massage: [' + xhr.responseText + ']', 'danger');
88
 
89
  allNotices.push(noticeId);
90
  }
20
  // Глобальные уведомления не трогаем
21
 
22
  for( i = 0; i < allNotices.length; i++ ) {
23
+ $.wbcr_factory_clearfy_209.app.hideNotice(allNotices[i]);
24
  }
25
 
26
  $('.wcl-control-btn').hide();
57
 
58
  if( response.data ) {
59
  console.log(response.data.error_message);
60
+ noticeId = $.wbcr_factory_clearfy_209.app.showNotice('Error: [' + response.data.error_message + ']', 'danger');
61
  allNotices.push(noticeId);
62
  } else {
63
  console.log(response);
67
  }
68
 
69
  if( response.data && response.data.message ) {
70
+ noticeId = $.wbcr_factory_clearfy_209.app.showNotice(response.data.message, 'success');
71
  allNotices.push(noticeId);
72
 
73
  // todo: доработать генерацию формы, вместо перезагрузки страницы
84
  console.log(xhr.responseText);
85
  console.log(thrownError);
86
 
87
+ var noticeId = $.wbcr_factory_clearfy_209.app.showNotice('Error: [' + thrownError + '] Status: [' + xhr.status + '] Error massage: [' + xhr.responseText + ']', 'danger');
88
 
89
  allNotices.push(noticeId);
90
  }
libs/factory/clearfy/boot.php CHANGED
@@ -14,22 +14,22 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( defined( 'FACTORY_CLEARFY_208_LOADED' ) ) {
18
  return;
19
  }
20
 
21
- define( 'FACTORY_CLEARFY_208_LOADED', true );
22
 
23
- define( 'FACTORY_CLEARFY_208', '2.0.7' );
24
 
25
- define( 'FACTORY_CLEARFY_208_DIR', dirname( __FILE__ ) );
26
- define( 'FACTORY_CLEARFY_208_URL', plugins_url( null, __FILE__ ) );
27
 
28
- load_plugin_textdomain( 'wbcr_factory_clearfy_208', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
 
30
- require( FACTORY_CLEARFY_208_DIR . '/includes/ajax-handlers.php' );
31
- require( FACTORY_CLEARFY_208_DIR . '/includes/class-clearfy-helpers.php' );
32
- require( FACTORY_CLEARFY_208_DIR . '/includes/class-clearfy-configurate.php' );
33
 
34
  // module provides function only for the admin area
35
  if ( is_admin() ) {
@@ -38,11 +38,11 @@ if ( is_admin() ) {
38
  * на все страницы админпанели
39
  */
40
  add_action( 'admin_enqueue_scripts', function () {
41
- wp_enqueue_script( 'wbcr-factory-clearfy-208-global', FACTORY_CLEARFY_208_URL . '/assets/js/globals.js', array( 'jquery' ), FACTORY_CLEARFY_208 );
42
  } );
43
 
44
  // TODO: Предполагается, что загрузка модуля pages будет раньше этого модуля.
45
- require( FACTORY_CLEARFY_208_DIR . '/pages/class-clearfy-more-features.php' );
46
- require( FACTORY_CLEARFY_208_DIR . '/pages/class-clearfy-pages.php' );
47
- require( FACTORY_CLEARFY_208_DIR . '/pages/class-clearfy-license.php' );
48
  }
14
  exit;
15
  }
16
 
17
+ if ( defined( 'FACTORY_CLEARFY_209_LOADED' ) ) {
18
  return;
19
  }
20
 
21
+ define( 'FACTORY_CLEARFY_209_LOADED', true );
22
 
23
+ define( 'FACTORY_CLEARFY_209', '2.0.7' );
24
 
25
+ define( 'FACTORY_CLEARFY_209_DIR', dirname( __FILE__ ) );
26
+ define( 'FACTORY_CLEARFY_209_URL', plugins_url( null, __FILE__ ) );
27
 
28
+ load_plugin_textdomain( 'wbcr_factory_clearfy_209', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
 
30
+ require( FACTORY_CLEARFY_209_DIR . '/includes/ajax-handlers.php' );
31
+ require( FACTORY_CLEARFY_209_DIR . '/includes/class-clearfy-helpers.php' );
32
+ require( FACTORY_CLEARFY_209_DIR . '/includes/class-clearfy-configurate.php' );
33
 
34
  // module provides function only for the admin area
35
  if ( is_admin() ) {
38
  * на все страницы админпанели
39
  */
40
  add_action( 'admin_enqueue_scripts', function () {
41
+ wp_enqueue_script( 'wbcr-factory-clearfy-209-global', FACTORY_CLEARFY_209_URL . '/assets/js/globals.js', array( 'jquery' ), FACTORY_CLEARFY_209 );
42
  } );
43
 
44
  // TODO: Предполагается, что загрузка модуля pages будет раньше этого модуля.
45
+ require( FACTORY_CLEARFY_209_DIR . '/pages/class-clearfy-more-features.php' );
46
+ require( FACTORY_CLEARFY_209_DIR . '/pages/class-clearfy-pages.php' );
47
+ require( FACTORY_CLEARFY_209_DIR . '/pages/class-clearfy-license.php' );
48
  }
libs/factory/clearfy/includes/ajax-handlers.php CHANGED
@@ -14,19 +14,19 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  /**
15
  * Обработчик ajax запросов для проверки, активации, деактивации лицензионного ключа
16
  *
17
- * @param Wbcr_Factory412_Plugin $plugin_instance
18
  *
19
  * @since 2.0.7
20
  *
21
  */
22
- function wbcr_factory_clearfy_208_check_license( $plugin_instance ) {
23
  check_admin_referer( 'license' );
24
 
25
  $action = $plugin_instance->request->post( 'license_action', false, true );
26
  $license_key = $plugin_instance->request->post( 'licensekey', null );
27
 
28
  if ( empty( $action ) || ! in_array( $action, array( 'activate', 'deactivate', 'sync', 'unsubscribe' ) ) ) {
29
- wp_send_json_error( array( 'error_message' => __( 'Licensing action not passed or this action is prohibited!', 'wbcr_factory_clearfy_208' ) ) );
30
  die();
31
  }
32
 
@@ -37,23 +37,23 @@ function wbcr_factory_clearfy_208_check_license( $plugin_instance ) {
37
  switch ( $action ) {
38
  case 'activate':
39
  if ( empty( $license_key ) || strlen( $license_key ) > 32 ) {
40
- wp_send_json_error( array( 'error_message' => __( 'License key is empty or license key too long (license key is 32 characters long)', 'wbcr_factory_clearfy_208' ) ) );
41
  } else {
42
  $plugin_instance->premium->activate( $license_key );
43
- $success_message = __( 'Your license has been successfully activated', 'wbcr_factory_clearfy_208' );
44
  }
45
  break;
46
  case 'deactivate':
47
  $plugin_instance->premium->deactivate();
48
- $success_message = __( 'The license is deactivated', 'wbcr_factory_clearfy_208' );
49
  break;
50
  case 'sync':
51
  $plugin_instance->premium->sync();
52
- $success_message = __( 'The license has been updated', 'wbcr_factory_clearfy_208' );
53
  break;
54
  case 'unsubscribe':
55
  $plugin_instance->premium->cancel_paid_subscription();
56
- $success_message = __( 'Subscription success cancelled', 'wbcr_factory_clearfy_208' );
57
  break;
58
  }
59
  } catch( Exception $e ) {
14
  /**
15
  * Обработчик ajax запросов для проверки, активации, деактивации лицензионного ключа
16
  *
17
+ * @param Wbcr_Factory414_Plugin $plugin_instance
18
  *
19
  * @since 2.0.7
20
  *
21
  */
22
+ function wbcr_factory_clearfy_209_check_license( $plugin_instance ) {
23
  check_admin_referer( 'license' );
24
 
25
  $action = $plugin_instance->request->post( 'license_action', false, true );
26
  $license_key = $plugin_instance->request->post( 'licensekey', null );
27
 
28
  if ( empty( $action ) || ! in_array( $action, array( 'activate', 'deactivate', 'sync', 'unsubscribe' ) ) ) {
29
+ wp_send_json_error( array( 'error_message' => __( 'Licensing action not passed or this action is prohibited!', 'wbcr_factory_clearfy_209' ) ) );
30
  die();
31
  }
32
 
37
  switch ( $action ) {
38
  case 'activate':
39
  if ( empty( $license_key ) || strlen( $license_key ) > 32 ) {
40
+ wp_send_json_error( array( 'error_message' => __( 'License key is empty or license key too long (license key is 32 characters long)', 'wbcr_factory_clearfy_209' ) ) );
41
  } else {
42
  $plugin_instance->premium->activate( $license_key );
43
+ $success_message = __( 'Your license has been successfully activated', 'wbcr_factory_clearfy_209' );
44
  }
45
  break;
46
  case 'deactivate':
47
  $plugin_instance->premium->deactivate();
48
+ $success_message = __( 'The license is deactivated', 'wbcr_factory_clearfy_209' );
49
  break;
50
  case 'sync':
51
  $plugin_instance->premium->sync();
52
+ $success_message = __( 'The license has been updated', 'wbcr_factory_clearfy_209' );
53
  break;
54
  case 'unsubscribe':
55
  $plugin_instance->premium->cancel_paid_subscription();
56
+ $success_message = __( 'Subscription success cancelled', 'wbcr_factory_clearfy_209' );
57
  break;
58
  }
59
  } catch( Exception $e ) {
libs/factory/clearfy/includes/check-clearfy-compatibility.php CHANGED
@@ -259,41 +259,41 @@
259
  $notice_text = $notice_default_text = '';
260
 
261
  if( self::isClearfyActivate() ) {
262
- $notice_default_text .= '<b>' . __('Clearfy warning', 'wbcr_factory_clearfy_208') . ':</b>' . '<br>';
263
- $phrase = sprintf(__('The %s component', 'wbcr_factory_clearfy_208'), $this->plugin_title);
264
  } else {
265
- $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __('warning', 'wbcr_factory_clearfy_208') . ':</b>' . '<br>';
266
- $phrase = sprintf(__('The %s plugin', 'wbcr_factory_clearfy_208'), $this->plugin_title);
267
  }
268
 
269
- $notice_default_text .= $phrase . ' ' . __('has stopped.', 'wbcr_factory_clearfy_208');
270
- $notice_default_text .= __('Possible reasons:', 'wbcr_factory_clearfy_208') . ' <br>';
271
 
272
  $has_one = false;
273
 
274
  if( !$this->isPhpCompatibility() ) {
275
  $has_one = true;
276
- $notice_text .= '- ' . sprintf(__('You need to update the PHP version to %s or higher!', 'wbcr_factory_clearfy_208'), $this->required_php_version) . '<br>';
277
  }
278
 
279
  if( !$this->isWpCompatibility() ) {
280
  $has_one = true;
281
- $notice_text .= '- ' . sprintf(__('You need to update WordPress to %s or higher!', 'wbcr_factory_clearfy_208'), $this->required_wp_version) . '<br>';
282
  }
283
 
284
  if( $this->required_clearfy_version_compatibility && !$this->checkClearfyVersionCompatibility() ) {
285
  $has_one = true;
286
- $notice_text .= '- ' . sprintf(__('You need to update the Clearfy plugin version to %s or higher!', 'wbcr_factory_clearfy_208'), $this->required_clearfy_version) . '<br>';
287
  }
288
 
289
  if( $this->plugin_already_activate ) {
290
  $has_one = true;
291
- $notice_text = '- ' . sprintf(__('This plugin is already activated, you are trying to activate it again.', 'wbcr_factory_clearfy_208'), $this->required_php_version) . '<br>';
292
  }
293
 
294
  if( $this->required_clearfy_check_component && $this->isPluginActiveAsComponent() ) {
295
  $has_one = true;
296
- $notice_text = '- ' . sprintf(__('Clearfy has the features of the %s plugin. Please, deactivate %s to avoid conflicts of plugins!', 'wbcr_factory_clearfy_208'), $this->plugin_title, $this->plugin_title) . '<br>';
297
  }
298
 
299
  if( $has_one ) {
259
  $notice_text = $notice_default_text = '';
260
 
261
  if( self::isClearfyActivate() ) {
262
+ $notice_default_text .= '<b>' . __('Clearfy warning', 'wbcr_factory_clearfy_209') . ':</b>' . '<br>';
263
+ $phrase = sprintf(__('The %s component', 'wbcr_factory_clearfy_209'), $this->plugin_title);
264
  } else {
265
+ $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __('warning', 'wbcr_factory_clearfy_209') . ':</b>' . '<br>';
266
+ $phrase = sprintf(__('The %s plugin', 'wbcr_factory_clearfy_209'), $this->plugin_title);
267
  }
268
 
269
+ $notice_default_text .= $phrase . ' ' . __('has stopped.', 'wbcr_factory_clearfy_209');
270
+ $notice_default_text .= __('Possible reasons:', 'wbcr_factory_clearfy_209') . ' <br>';
271
 
272
  $has_one = false;
273
 
274
  if( !$this->isPhpCompatibility() ) {
275
  $has_one = true;
276
+ $notice_text .= '- ' . sprintf(__('You need to update the PHP version to %s or higher!', 'wbcr_factory_clearfy_209'), $this->required_php_version) . '<br>';
277
  }
278
 
279
  if( !$this->isWpCompatibility() ) {
280
  $has_one = true;
281
+ $notice_text .= '- ' . sprintf(__('You need to update WordPress to %s or higher!', 'wbcr_factory_clearfy_209'), $this->required_wp_version) . '<br>';
282
  }
283
 
284
  if( $this->required_clearfy_version_compatibility && !$this->checkClearfyVersionCompatibility() ) {
285
  $has_one = true;
286
+ $notice_text .= '- ' . sprintf(__('You need to update the Clearfy plugin version to %s or higher!', 'wbcr_factory_clearfy_209'), $this->required_clearfy_version) . '<br>';
287
  }
288
 
289
  if( $this->plugin_already_activate ) {
290
  $has_one = true;
291
+ $notice_text = '- ' . sprintf(__('This plugin is already activated, you are trying to activate it again.', 'wbcr_factory_clearfy_209'), $this->required_php_version) . '<br>';
292
  }
293
 
294
  if( $this->required_clearfy_check_component && $this->isPluginActiveAsComponent() ) {
295
  $has_one = true;
296
+ $notice_text = '- ' . sprintf(__('Clearfy has the features of the %s plugin. Please, deactivate %s to avoid conflicts of plugins!', 'wbcr_factory_clearfy_209'), $this->plugin_title, $this->plugin_title) . '<br>';
297
  }
298
 
299
  if( $has_one ) {
libs/factory/clearfy/includes/class-clearfy-configurate.php CHANGED
@@ -14,14 +14,14 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryClearfy208_Configurate') ) {
18
 
19
- abstract class Wbcr_FactoryClearfy208_Configurate {
20
 
21
  /**
22
- * @param Wbcr_Factory412_Plugin $plugin
23
  */
24
- public function __construct(Wbcr_Factory412_Plugin $plugin)
25
  {
26
  $this->plugin = $plugin;
27
  $this->registerActionsAndFilters();
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryClearfy209_Configurate') ) {
18
 
19
+ abstract class Wbcr_FactoryClearfy209_Configurate {
20
 
21
  /**
22
+ * @param Wbcr_Factory414_Plugin $plugin
23
  */
24
+ public function __construct(Wbcr_Factory414_Plugin $plugin)
25
  {
26
  $this->plugin = $plugin;
27
  $this->registerActionsAndFilters();
libs/factory/clearfy/includes/class-clearfy-helpers.php CHANGED
@@ -15,8 +15,8 @@
15
  exit;
16
  }
17
 
18
- if( !class_exists('WbcrFactoryClearfy208_Helpers') ) {
19
- class WbcrFactoryClearfy208_Helpers {
20
 
21
  /**
22
  * Ссылка по умолчанию (анг)
15
  exit;
16
  }
17
 
18
+ if( !class_exists('WbcrFactoryClearfy209_Helpers') ) {
19
+ class WbcrFactoryClearfy209_Helpers {
20
 
21
  /**
22
  * Ссылка по умолчанию (анг)
libs/factory/clearfy/langs/{wbcr_factory_clearfy_208-ru_RU.mo → wbcr_factory_clearfy_209-ru_RU.mo} RENAMED
File without changes
libs/factory/clearfy/langs/{wbcr_factory_clearfy_208-ru_RU.po → wbcr_factory_clearfy_209-ru_RU.po} RENAMED
File without changes
libs/factory/clearfy/pages/class-clearfy-license.php CHANGED
@@ -10,7 +10,7 @@ if ( ! defined( 'ABSPATH' ) ) {
10
  *
11
  * @since 2.0.7
12
  */
13
- class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase {
14
 
15
  /**
16
  * {@inheritdoc}
@@ -52,7 +52,7 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
52
 
53
  /**
54
  * @since 2.0.7
55
- * @var \WBCR\Factory_412\Premium\Provider
56
  */
57
  protected $premium;
58
 
@@ -70,7 +70,7 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
70
 
71
  /**
72
  * @since 2.0.7
73
- * @var \WBCR\Factory_412\Premium\Interfaces\License
74
  */
75
  protected $premium_license;
76
 
@@ -79,9 +79,9 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
79
 
80
  /**
81
  * {@inheritdoc}
82
- * @param Wbcr_Factory412_Plugin $plugin
83
  */
84
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
85
  $this->plugin = $plugin;
86
 
87
  parent::__construct( $plugin );
@@ -104,8 +104,8 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
104
  public function assets( $scripts, $styles ) {
105
  parent::assets( $scripts, $styles );
106
 
107
- $this->styles->add( FACTORY_CLEARFY_208_URL . '/assets/css/license-manager.css' );
108
- $this->scripts->add( FACTORY_CLEARFY_208_URL . '/assets/js/license-manager.js' );
109
  }
110
 
111
  /**
@@ -113,7 +113,7 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
113
  * @since 2.0.7
114
  */
115
  public function ajax_handler() {
116
- wbcr_factory_clearfy_208_check_license( $this->plugin );
117
  }
118
 
119
  /**
@@ -123,7 +123,7 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
123
  ?>
124
  <?php wp_nonce_field( 'license' ); ?>
125
  <div id="wcl-license-wrapper"
126
- data-loader="<?php echo FACTORY_CLEARFY_208_URL . '/assets/img/loader.gif'; ?>"
127
  data-plugin="<?php echo get_class( $this->plugin ) ?>">
128
  <?php $this->show_license_form(); ?>
129
  </div>
@@ -218,17 +218,17 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
218
  */
219
  public function show_license_form( $notice = false ) {
220
  ?>
221
- <div class="factory-bootstrap-412 onp-page-wrap <?= $this->get_license_type() ?>-license-manager-content"
222
  id="license-manager">
223
  <div>
224
- <h3><?php printf( __( 'Activate %s', 'wbcr_factory_clearfy_208' ), $this->plan_name ) ?></h3>
225
  <?php echo $this->get_plan_description() ?>
226
  </div>
227
  <br>
228
  <?php if ( is_wp_error( $notice ) ) : ?>
229
  <div class="license-message <?= $this->get_license_type() ?>-license-message">
230
  <div class="alert <?php echo esc_attr( $notice->get_error_code() ); ?>">
231
- <h4 class="alert-heading"><?php _e( $notice->get_error_message(), 'wbcr_factory_clearfy_208' ) ?></h4>
232
  </div>
233
  </div>
234
  <?php endif; ?>
@@ -238,20 +238,20 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
238
  <a href="<?php echo $this->plugin->get_support()->get_pricing_url( true, 'license_page' ); ?>"
239
  class="purchase-premium" target="_blank" rel="noopener">
240
  <span class="btn btn-gold btn-inner-wrap">
241
- <?php printf( __( 'Upgrade to Premium for $%s', 'wbcr_factory_clearfy_208' ), $this->premium->get_price() ) ?>
242
  </span>
243
  </a>
244
- <p><?php printf( __( 'Your current license for %1$s:', 'wbcr_factory_clearfy_208' ), $this->plugin->getPluginTitle() ) ?></p>
245
  <?php endif; ?>
246
  <div class="license-details-block <?= $this->get_license_type() ?>-details-block">
247
  <?php if ( $this->is_premium ): ?>
248
  <a data-action="deactivate" href="#"
249
  class="btn btn-default btn-small license-delete-button wcl-control-btn">
250
- <?php _e( 'Delete Key', 'wbcr_factory_clearfy_208' ) ?>
251
  </a>
252
  <a data-action="sync" href="#"
253
  class="btn btn-default btn-small license-synchronization-button wcl-control-btn">
254
- <?php _e( 'Synchronization', 'wbcr_factory_clearfy_208' ) ?>
255
  </a>
256
  <?php endif; ?>
257
  <h3>
@@ -269,17 +269,17 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
269
  </div>
270
  <?php endif; ?>
271
  <div class="license-key-description">
272
- <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_208' ) ?>
273
  </p>
274
  <?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
275
  <p class="activate-trial-hint">
276
- <?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_208' ) ?>
277
  </p>
278
  <?php endif; ?>
279
 
280
  <?php if ( $this->get_license_type() == 'trial' ): ?>
281
  <p class="activate-error-hint">
282
- <?php printf( __( 'Your license has expired, please extend the license to get updates and support.', 'wbcr_factory_clearfy_208' ), '' ) ?>
283
  </p>
284
  <?php endif; ?>
285
  </div>
@@ -287,19 +287,19 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
287
  <tr>
288
  <!--<td class="license-param license-param-domain">
289
  <span class="license-value"><?php echo esc_attr( $_SERVER['SERVER_NAME'] ); ?></span>
290
- <span class="license-value-name"><?php _e( 'domain', 'wbcr_factory_clearfy_208' ) ?></span>
291
  </td>-->
292
  <td class="license-param license-param-days">
293
  <span class="license-value"><?= $this->get_plan() ?></span>
294
- <span class="license-value-name"><?php _e( 'plan', 'wbcr_factory_clearfy_208' ) ?></span>
295
  </td>
296
  <?php if ( $this->is_premium ) : ?>
297
  <td class="license-param license-param-sites">
298
  <span class="license-value">
299
  <?php echo esc_attr( $this->premium_license->get_count_active_sites() ); ?>
300
- <?php _e( 'of', 'wbcr_factory_clearfy_208' ) ?>
301
  <?php echo esc_attr( $this->premium_license->get_sites_quota() ); ?></span>
302
- <span class="license-value-name"><?php _e( 'active sites', 'wbcr_factory_clearfy_208' ) ?></span>
303
  </td>
304
  <?php endif; ?>
305
  <td class="license-param license-param-version">
@@ -309,8 +309,8 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
309
  <?php if ( $this->is_premium ): ?>
310
  <td class="license-param license-param-days">
311
  <?php if ( $this->get_license_type() == 'trial' ): ?>
312
- <span class="license-value"><?php _e( 'EXPIRED!', 'wbcr_factory_clearfy_208' ) ?></span>
313
- <span class="license-value-name"><?php _e( 'please update the key', 'wbcr_factory_clearfy_208' ) ?></span>
314
  <?php else: ?>
315
  <span class="license-value">
316
  <?php
@@ -320,9 +320,9 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
320
  echo $this->get_expiration_days();
321
  }
322
  ?>
323
- <small> <?php _e( 'day(s)', 'wbcr_factory_clearfy_208' ) ?></small>
324
  </span>
325
- <span class="license-value-name"><?php _e( 'remained', 'wbcr_factory_clearfy_208' ) ?></span>
326
  <?php endif; ?>
327
  </td>
328
  <?php endif; ?>
@@ -333,25 +333,25 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
333
  <div class="license-input">
334
  <form action="" method="post">
335
  <?php if ( $this->is_premium ): ?>
336
- <p><?php _e( 'Have a key to activate the premium version? Paste it here:', 'wbcr_factory_clearfy_208' ) ?><p>
337
  <?php else: ?>
338
- <p><?php _e( 'Have a key to activate the plugin? Paste it here:', 'wbcr_factory_clearfy_208' ) ?>
339
  <p>
340
  <?php endif; ?>
341
  <button data-action="activate" class="btn btn-default wcl-control-btn" type="button"
342
  id="license-submit">
343
- <?php _e( 'Submit Key', 'wbcr_factory_clearfy_208' ) ?>
344
  </button>
345
  <div class="license-key-wrap">
346
  <input type="text" id="license-key" name="licensekey" value="" class="form-control"/>
347
  </div>
348
  <?php if ( $this->is_premium ): ?>
349
  <p style="margin-top: 10px;">
350
- <?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_208' ), $this->plugin->get_support()->get_pricing_url( true, 'license_page' ) ); ?>
351
  </p>
352
  <?php else: ?>
353
  <p style="margin-top: 10px;">
354
- <?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_208' ), $this->plugin->get_support()->get_contacts_url( true, 'license_page' ) ) ?>
355
  </p>
356
  <?php endif; ?>
357
  </form>
10
  *
11
  * @since 2.0.7
12
  */
13
+ class Wbcr_FactoryClearfy209_LicensePage extends Wbcr_FactoryClearfy209_PageBase {
14
 
15
  /**
16
  * {@inheritdoc}
52
 
53
  /**
54
  * @since 2.0.7
55
+ * @var \WBCR\Factory_414\Premium\Provider
56
  */
57
  protected $premium;
58
 
70
 
71
  /**
72
  * @since 2.0.7
73
+ * @var \WBCR\Factory_414\Premium\Interfaces\License
74
  */
75
  protected $premium_license;
76
 
79
 
80
  /**
81
  * {@inheritdoc}
82
+ * @param Wbcr_Factory414_Plugin $plugin
83
  */
84
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
85
  $this->plugin = $plugin;
86
 
87
  parent::__construct( $plugin );
104
  public function assets( $scripts, $styles ) {
105
  parent::assets( $scripts, $styles );
106
 
107
+ $this->styles->add( FACTORY_CLEARFY_209_URL . '/assets/css/license-manager.css' );
108
+ $this->scripts->add( FACTORY_CLEARFY_209_URL . '/assets/js/license-manager.js' );
109
  }
110
 
111
  /**
113
  * @since 2.0.7
114
  */
115
  public function ajax_handler() {
116
+ wbcr_factory_clearfy_209_check_license( $this->plugin );
117
  }
118
 
119
  /**
123
  ?>
124
  <?php wp_nonce_field( 'license' ); ?>
125
  <div id="wcl-license-wrapper"
126
+ data-loader="<?php echo FACTORY_CLEARFY_209_URL . '/assets/img/loader.gif'; ?>"
127
  data-plugin="<?php echo get_class( $this->plugin ) ?>">
128
  <?php $this->show_license_form(); ?>
129
  </div>
218
  */
219
  public function show_license_form( $notice = false ) {
220
  ?>
221
+ <div class="factory-bootstrap-414 onp-page-wrap <?= $this->get_license_type() ?>-license-manager-content"
222
  id="license-manager">
223
  <div>
224
+ <h3><?php printf( __( 'Activate %s', 'wbcr_factory_clearfy_209' ), $this->plan_name ) ?></h3>
225
  <?php echo $this->get_plan_description() ?>
226
  </div>
227
  <br>
228
  <?php if ( is_wp_error( $notice ) ) : ?>
229
  <div class="license-message <?= $this->get_license_type() ?>-license-message">
230
  <div class="alert <?php echo esc_attr( $notice->get_error_code() ); ?>">
231
+ <h4 class="alert-heading"><?php _e( $notice->get_error_message(), 'wbcr_factory_clearfy_209' ) ?></h4>
232
  </div>
233
  </div>
234
  <?php endif; ?>
238
  <a href="<?php echo $this->plugin->get_support()->get_pricing_url( true, 'license_page' ); ?>"
239
  class="purchase-premium" target="_blank" rel="noopener">
240
  <span class="btn btn-gold btn-inner-wrap">
241
+ <?php printf( __( 'Upgrade to Premium for $%s', 'wbcr_factory_clearfy_209' ), $this->premium->get_price() ) ?>
242
  </span>
243
  </a>
244
+ <p><?php printf( __( 'Your current license for %1$s:', 'wbcr_factory_clearfy_209' ), $this->plugin->getPluginTitle() ) ?></p>
245
  <?php endif; ?>
246
  <div class="license-details-block <?= $this->get_license_type() ?>-details-block">
247
  <?php if ( $this->is_premium ): ?>
248
  <a data-action="deactivate" href="#"
249
  class="btn btn-default btn-small license-delete-button wcl-control-btn">
250
+ <?php _e( 'Delete Key', 'wbcr_factory_clearfy_209' ) ?>
251
  </a>
252
  <a data-action="sync" href="#"
253
  class="btn btn-default btn-small license-synchronization-button wcl-control-btn">
254
+ <?php _e( 'Synchronization', 'wbcr_factory_clearfy_209' ) ?>
255
  </a>
256
  <?php endif; ?>
257
  <h3>
269
  </div>
270
  <?php endif; ?>
271
  <div class="license-key-description">
272
+ <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_209' ) ?>
273
  </p>
274
  <?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
275
  <p class="activate-trial-hint">
276
+ <?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_209' ) ?>
277
  </p>
278
  <?php endif; ?>
279
 
280
  <?php if ( $this->get_license_type() == 'trial' ): ?>
281
  <p class="activate-error-hint">
282
+ <?php printf( __( 'Your license has expired, please extend the license to get updates and support.', 'wbcr_factory_clearfy_209' ), '' ) ?>
283
  </p>
284
  <?php endif; ?>
285
  </div>
287
  <tr>
288
  <!--<td class="license-param license-param-domain">
289
  <span class="license-value"><?php echo esc_attr( $_SERVER['SERVER_NAME'] ); ?></span>
290
+ <span class="license-value-name"><?php _e( 'domain', 'wbcr_factory_clearfy_209' ) ?></span>
291
  </td>-->
292
  <td class="license-param license-param-days">
293
  <span class="license-value"><?= $this->get_plan() ?></span>
294
+ <span class="license-value-name"><?php _e( 'plan', 'wbcr_factory_clearfy_209' ) ?></span>
295
  </td>
296
  <?php if ( $this->is_premium ) : ?>
297
  <td class="license-param license-param-sites">
298
  <span class="license-value">
299
  <?php echo esc_attr( $this->premium_license->get_count_active_sites() ); ?>
300
+ <?php _e( 'of', 'wbcr_factory_clearfy_209' ) ?>
301
  <?php echo esc_attr( $this->premium_license->get_sites_quota() ); ?></span>
302
+ <span class="license-value-name"><?php _e( 'active sites', 'wbcr_factory_clearfy_209' ) ?></span>
303
  </td>
304
  <?php endif; ?>
305
  <td class="license-param license-param-version">
309
  <?php if ( $this->is_premium ): ?>
310
  <td class="license-param license-param-days">
311
  <?php if ( $this->get_license_type() == 'trial' ): ?>
312
+ <span class="license-value"><?php _e( 'EXPIRED!', 'wbcr_factory_clearfy_209' ) ?></span>
313
+ <span class="license-value-name"><?php _e( 'please update the key', 'wbcr_factory_clearfy_209' ) ?></span>
314
  <?php else: ?>
315
  <span class="license-value">
316
  <?php
320
  echo $this->get_expiration_days();
321
  }
322
  ?>
323
+ <small> <?php _e( 'day(s)', 'wbcr_factory_clearfy_209' ) ?></small>
324
  </span>
325
+ <span class="license-value-name"><?php _e( 'remained', 'wbcr_factory_clearfy_209' ) ?></span>
326
  <?php endif; ?>
327
  </td>
328
  <?php endif; ?>
333
  <div class="license-input">
334
  <form action="" method="post">
335
  <?php if ( $this->is_premium ): ?>
336
+ <p><?php _e( 'Have a key to activate the premium version? Paste it here:', 'wbcr_factory_clearfy_209' ) ?><p>
337
  <?php else: ?>
338
+ <p><?php _e( 'Have a key to activate the plugin? Paste it here:', 'wbcr_factory_clearfy_209' ) ?>
339
  <p>
340
  <?php endif; ?>
341
  <button data-action="activate" class="btn btn-default wcl-control-btn" type="button"
342
  id="license-submit">
343
+ <?php _e( 'Submit Key', 'wbcr_factory_clearfy_209' ) ?>
344
  </button>
345
  <div class="license-key-wrap">
346
  <input type="text" id="license-key" name="licensekey" value="" class="form-control"/>
347
  </div>
348
  <?php if ( $this->is_premium ): ?>
349
  <p style="margin-top: 10px;">
350
+ <?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_209' ), $this->plugin->get_support()->get_pricing_url( true, 'license_page' ) ); ?>
351
  </p>
352
  <?php else: ?>
353
  <p style="margin-top: 10px;">
354
+ <?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_209' ), $this->plugin->get_support()->get_contacts_url( true, 'license_page' ) ) ?>
355
  </p>
356
  <?php endif; ?>
357
  </form>
libs/factory/clearfy/pages/class-clearfy-more-features.php CHANGED
@@ -14,9 +14,9 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryClearfy208_MoreFeaturesPage') && class_exists('Wbcr_FactoryPages412_ImpressiveThemplate') ) {
18
 
19
- class Wbcr_FactoryClearfy208_MoreFeaturesPage extends Wbcr_FactoryPages412_ImpressiveThemplate {
20
 
21
  public $id = "more_features";
22
 
@@ -26,9 +26,9 @@
26
 
27
  public $type = 'page';
28
 
29
- public function __construct(Wbcr_Factory412_Plugin $plugin)
30
  {
31
- $this->menu_title = __('More features (<b>free</b>)', 'wbcr_factory_clearfy_208');
32
 
33
  parent::__construct($plugin);
34
 
@@ -37,7 +37,7 @@
37
 
38
  public function getPageTitle()
39
  {
40
- return __('More features', 'wbcr_factory_clearfy_208');
41
  }
42
 
43
  public function showPageContent()
@@ -48,83 +48,83 @@
48
  <div class="wbcr-factory-feature-box">
49
  <span class="dashicons dashicons-yes"></span>
50
 
51
- <h3><?php _e('Code cleaning', 'wbcr_factory_clearfy_208')?></h3>
52
 
53
- <p><?php _e('Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_208')?></p>
54
  </div>
55
  </div>
56
  <div class="col-sm-4">
57
  <div class="wbcr-factory-feature-box">
58
  <span class="dashicons dashicons-chart-bar"></span>
59
 
60
- <h3><?php _e('Improve SEO', 'wbcr_factory_clearfy_208')?></h3>
61
 
62
- <p><?php _e('Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_208')?></p>
63
  </div>
64
  </div>
65
  <div class="col-sm-4">
66
  <div class="wbcr-factory-feature-box">
67
  <span class="dashicons dashicons-shield-alt"></span>
68
 
69
- <h3><?php _e('Site protection', 'wbcr_factory_clearfy_208')?></h3>
70
 
71
- <p><?php _e('Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_208')?></p>
72
  </div>
73
  </div>
74
  <div class="col-sm-4">
75
  <div class="wbcr-factory-feature-box">
76
  <span class="dashicons dashicons-welcome-comments"></span>
77
 
78
- <h3><?php _e('Disable comments', 'wbcr_factory_clearfy_208')?></h3>
79
 
80
- <p><?php _e('Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_208')?></p>
81
  </div>
82
  </div>
83
  <div class="col-sm-4">
84
  <div class="wbcr-factory-feature-box">
85
  <span class="dashicons dashicons-update"></span>
86
 
87
- <h3><?php _e('Manage updates', 'wbcr_factory_clearfy_208')?></h3>
88
 
89
  <p><?php _e('Enables or disables automatically updates for plugins, themes and core. It is also possible
90
- to disable all updates.', 'wbcr_factory_clearfy_208')?></p>
91
  </div>
92
  </div>
93
  <div class="col-sm-4">
94
  <div class="wbcr-factory-feature-box">
95
  <span class="dashicons dashicons-admin-plugins"></span>
96
 
97
- <h3><?php _e('Manage widgets', 'wbcr_factory_clearfy_208')?></h3>
98
 
99
- <p><?php _e('Allows you to remove unused widgets.', 'wbcr_factory_clearfy_208')?></p>
100
  </div>
101
  </div>
102
  <div class="col-sm-4">
103
  <div class="wbcr-factory-feature-box">
104
  <span class="dashicons dashicons-dashboard"></span>
105
 
106
- <h3><?php _e('Speed Optimization', 'wbcr_factory_clearfy_208')?></h3>
107
 
108
- <p><?php _e('Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_208')?></p>
109
  </div>
110
  </div>
111
  <div class="col-sm-4">
112
  <div class="wbcr-factory-feature-box">
113
  <span class="dashicons dashicons-visibility"></span>
114
 
115
- <h3><?php _e('Site privacy', 'wbcr_factory_clearfy_208')?></h3>
116
 
117
  <p><?php _e('Allows you to hide the version of the site and plugins. Allows you to hide your
118
- WordPress.', 'wbcr_factory_clearfy_208')?></p>
119
  </div>
120
  </div>
121
  <div class="col-sm-4">
122
  <div class="wbcr-factory-feature-box">
123
  <span class="dashicons dashicons-admin-settings"></span>
124
 
125
- <h3><?php _e('Easy setup', 'wbcr_factory_clearfy_208')?></h3>
126
 
127
- <p><?php _e('In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_208')?></p>
128
  </div>
129
  </div>
130
  </div>
@@ -139,7 +139,7 @@
139
  $url .= '?utm_source=wordpress.org&utm_campaign=' . $this->plugin->getPluginName();
140
  ?>
141
  <a href="<?= $url ?>" class="wbcr-factory-premium-button" target="_blank">
142
- <?php _e('Get the ultimate plugin 100% FREE', 'wbcr_factory_clearfy_208')?>
143
  </a>
144
  </div>
145
  <?php
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryClearfy209_MoreFeaturesPage') && class_exists('Wbcr_FactoryPages414_ImpressiveThemplate') ) {
18
 
19
+ class Wbcr_FactoryClearfy209_MoreFeaturesPage extends Wbcr_FactoryPages414_ImpressiveThemplate {
20
 
21
  public $id = "more_features";
22
 
26
 
27
  public $type = 'page';
28
 
29
+ public function __construct(Wbcr_Factory414_Plugin $plugin)
30
  {
31
+ $this->menu_title = __('More features (<b>free</b>)', 'wbcr_factory_clearfy_209');
32
 
33
  parent::__construct($plugin);
34
 
37
 
38
  public function getPageTitle()
39
  {
40
+ return __('More features', 'wbcr_factory_clearfy_209');
41
  }
42
 
43
  public function showPageContent()
48
  <div class="wbcr-factory-feature-box">
49
  <span class="dashicons dashicons-yes"></span>
50
 
51
+ <h3><?php _e('Code cleaning', 'wbcr_factory_clearfy_209')?></h3>
52
 
53
+ <p><?php _e('Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_209')?></p>
54
  </div>
55
  </div>
56
  <div class="col-sm-4">
57
  <div class="wbcr-factory-feature-box">
58
  <span class="dashicons dashicons-chart-bar"></span>
59
 
60
+ <h3><?php _e('Improve SEO', 'wbcr_factory_clearfy_209')?></h3>
61
 
62
+ <p><?php _e('Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_209')?></p>
63
  </div>
64
  </div>
65
  <div class="col-sm-4">
66
  <div class="wbcr-factory-feature-box">
67
  <span class="dashicons dashicons-shield-alt"></span>
68
 
69
+ <h3><?php _e('Site protection', 'wbcr_factory_clearfy_209')?></h3>
70
 
71
+ <p><?php _e('Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_209')?></p>
72
  </div>
73
  </div>
74
  <div class="col-sm-4">
75
  <div class="wbcr-factory-feature-box">
76
  <span class="dashicons dashicons-welcome-comments"></span>
77
 
78
+ <h3><?php _e('Disable comments', 'wbcr_factory_clearfy_209')?></h3>
79
 
80
+ <p><?php _e('Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_209')?></p>
81
  </div>
82
  </div>
83
  <div class="col-sm-4">
84
  <div class="wbcr-factory-feature-box">
85
  <span class="dashicons dashicons-update"></span>
86
 
87
+ <h3><?php _e('Manage updates', 'wbcr_factory_clearfy_209')?></h3>
88
 
89
  <p><?php _e('Enables or disables automatically updates for plugins, themes and core. It is also possible
90
+ to disable all updates.', 'wbcr_factory_clearfy_209')?></p>
91
  </div>
92
  </div>
93
  <div class="col-sm-4">
94
  <div class="wbcr-factory-feature-box">
95
  <span class="dashicons dashicons-admin-plugins"></span>
96
 
97
+ <h3><?php _e('Manage widgets', 'wbcr_factory_clearfy_209')?></h3>
98
 
99
+ <p><?php _e('Allows you to remove unused widgets.', 'wbcr_factory_clearfy_209')?></p>
100
  </div>
101
  </div>
102
  <div class="col-sm-4">
103
  <div class="wbcr-factory-feature-box">
104
  <span class="dashicons dashicons-dashboard"></span>
105
 
106
+ <h3><?php _e('Speed Optimization', 'wbcr_factory_clearfy_209')?></h3>
107
 
108
+ <p><?php _e('Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_209')?></p>
109
  </div>
110
  </div>
111
  <div class="col-sm-4">
112
  <div class="wbcr-factory-feature-box">
113
  <span class="dashicons dashicons-visibility"></span>
114
 
115
+ <h3><?php _e('Site privacy', 'wbcr_factory_clearfy_209')?></h3>
116
 
117
  <p><?php _e('Allows you to hide the version of the site and plugins. Allows you to hide your
118
+ WordPress.', 'wbcr_factory_clearfy_209')?></p>
119
  </div>
120
  </div>
121
  <div class="col-sm-4">
122
  <div class="wbcr-factory-feature-box">
123
  <span class="dashicons dashicons-admin-settings"></span>
124
 
125
+ <h3><?php _e('Easy setup', 'wbcr_factory_clearfy_209')?></h3>
126
 
127
+ <p><?php _e('In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_209')?></p>
128
  </div>
129
  </div>
130
  </div>
139
  $url .= '?utm_source=wordpress.org&utm_campaign=' . $this->plugin->getPluginName();
140
  ?>
141
  <a href="<?= $url ?>" class="wbcr-factory-premium-button" target="_blank">
142
+ <?php _e('Get the ultimate plugin 100% FREE', 'wbcr_factory_clearfy_209')?>
143
  </a>
144
  </div>
145
  <?php
libs/factory/clearfy/pages/class-clearfy-pages.php CHANGED
@@ -15,7 +15,7 @@ if ( ! defined( 'ABSPATH' ) ) {
15
  }
16
 
17
  /**
18
- * Class Wbcr_FactoryPages412_ImpressiveThemplate
19
  *
20
  * @method string getInfoWidget() - get widget content information
21
  * @method string getRatingWidget( array $args = array() ) - get widget content rating
@@ -23,9 +23,9 @@ if ( ! defined( 'ABSPATH' ) ) {
23
  * @method string getBusinessSuggetionWidget()
24
  */
25
 
26
- if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_FactoryPages412_ImpressiveThemplate' ) ) {
27
 
28
- class Wbcr_FactoryClearfy208_PageBase extends Wbcr_FactoryPages412_ImpressiveThemplate {
29
 
30
  /**
31
  * Показывать правый сайдбар?
@@ -51,9 +51,9 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
51
  //public $show_bottom_sidebar = false;
52
 
53
  /**
54
- * @param Wbcr_Factory412_Plugin $plugin
55
  */
56
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
57
  parent::__construct( $plugin );
58
  }
59
 
@@ -83,24 +83,24 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
83
  /**
84
  * Requests assets (js and css) for the page.
85
  *
86
- * @see Wbcr_FactoryPages412_AdminPage
87
  *
88
- * @param Wbcr_Factory412_ScriptList $scripts
89
- * @param Wbcr_Factory412_StyleList $styles
90
  *
91
  * @return void
92
  */
93
  public function assets( $scripts, $styles ) {
94
  parent::assets( $scripts, $styles );
95
 
96
- $this->styles->add( FACTORY_CLEARFY_208_URL . '/assets/css/clearfy-base.css' );
97
 
98
  // todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
99
  if ( defined( 'WCL_PLUGIN_URL' ) ) {
100
  $this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
101
  }
102
 
103
- wbcr_factory_412_do_action_deprecated( 'wbcr_clearfy_page_enqueue_scripts', array(
104
  $this->getResultId(),
105
  $scripts,
106
  $styles
@@ -115,7 +115,7 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
115
  }
116
 
117
  /**
118
- * @return Wbcr_Factory412_Request
119
  */
120
  public function request() {
121
  return $this->plugin->request;
@@ -190,18 +190,18 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
190
  if ( is_multisite() && $this->plugin->isNetworkActive() ) {
191
 
192
  $license_page_url = $this->getBaseUrl( 'license' );
193
- $upgrade_url = WbcrFactoryClearfy208_Helpers::getWebcrafticSitePageUrl( $this->plugin->getPluginName(), 'pricing', 'multisite_save_settings' );
194
- $upgrade_price = WbcrFactoryClearfy208_Helpers::getClearfyBusinessPrice();
195
 
196
- $html = '<div class="wbcr-factory-clearfy-208-multisite-suggetion">';
197
  $html .= '<div class="wbcr-factory-inner-contanier">';
198
- $html .= '<h3>' . __( 'Upgrade to Clearfy Business', 'wbcr_factory_clearfy_208' ) . '</h3>';
199
- $html .= '<p>' . __( 'Oops... Sorry for the inconvenience caused!', 'wbcr_factory_clearfy_208' ) . '</p>';
200
- $html .= '<p>' . __( 'Complete multisite support is available in Clearfy Business and Clearfy Business Revolution packages only!', 'wbcr_factory_clearfy_208' ) . '</p>';
201
- $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_208' ) . '</p>';
202
  $html .= '<p style="margin-top:20px">';
203
- $html .= '<a href="' . $license_page_url . '" class="wbcr-factory-activate-premium" rel="noopener">' . __( 'Activate license ', 'wbcr_factory_clearfy_208' ) . '</a> ';
204
- $html .= '<a href="' . $upgrade_url . '" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">' . sprintf( __( 'Upgrade to Clearfy Business for $%d', 'wbcr_factory_clearfy_208' ), $upgrade_price ) . '</a>';
205
  $html .= '</p>';
206
  $html .= '</div>';
207
  $html .= '</div>';
@@ -235,7 +235,7 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
235
  /**
236
  * @since 4.0.9 - является устаревшим
237
  */
238
- $widgets = wbcr_factory_412_apply_filters_deprecated( 'wbcr_factory_pages_412_imppage_get_widgets', array(
239
  $widgets,
240
  $position,
241
  $this->plugin,
@@ -257,24 +257,24 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
257
  $purchase_url = $this->plugin->get_support()->get_pricing_url( true, 'right_sidebar_ads' );
258
 
259
  $default_features = array(
260
- '4_premium' => __( '4 premium components now;', 'wbcr_factory_clearfy_208' ),
261
- '40_premium' => __( '40 new premium components within a year for the single price;', 'wbcr_factory_clearfy_208' ),
262
- 'multisite_support' => __( 'Multisite support;', 'wbcr_factory_clearfy_208' ),
263
- 'advance_settings' => __( 'Advanced settings;', 'wbcr_factory_clearfy_208' ),
264
- 'no_ads' => __( 'No ads;', 'wbcr_factory_clearfy_208' ),
265
- 'perfect_support' => __( 'Perfect support.', 'wbcr_factory_clearfy_208' )
266
  );
267
 
268
  /**
269
  * @since 2.0.8 - added
270
  */
271
- $suggetion_title = __( 'MORE IN CLEARFY <span>BUSINESS</span>', 'wbcr_factory_clearfy_208' );
272
  $suggetion_title = apply_filters( 'wbcr/clearfy/pages/suggetion_title', $suggetion_title, $plugin_name, $this->id );
273
 
274
  /**
275
  * @since 2.0.8 - deprecated
276
  */
277
- $suggetion_features = wbcr_factory_412_apply_filters_deprecated( 'wbcr/clearfy/page_bussines_suggetion_features', array(
278
  $default_features,
279
  $this->plugin->getPluginName(),
280
  $this->id
@@ -290,7 +290,7 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
290
  $suggetion_features = $default_features;
291
  }
292
  ?>
293
- <div class="wbcr-factory-sidebar-widget wbcr-factory-clearfy-208-pro-suggettion">
294
  <h3><?php echo $suggetion_title; ?></h3>
295
  <ul>
296
  <?php if ( ! empty( $suggetion_features ) ): ?>
@@ -300,7 +300,7 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
300
  <?php endif; ?>
301
  </ul>
302
  <a href="<?php echo $purchase_url ?>" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">
303
- <?php printf( __( 'Upgrade for $%s', 'wbcr_factory_clearfy_208' ), $upgrade_price ) ?>
304
  </a>
305
  </div>
306
  <?php
@@ -314,23 +314,23 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
314
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
315
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
316
  </span>
317
- - <?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_208' ); ?>
318
  </li>
319
  <li>
320
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
321
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
322
  </span>
323
- - <?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_208' ); ?>
324
  </li>
325
  <li>
326
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
327
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
328
  </span>
329
- - <?php _e( 'Absolutely safe setting, We recommend to use.', 'wbcr_factory_clearfy_208' ); ?>
330
  </li>
331
  </ul>
332
  ----------<br>
333
- <p><?php _e( 'Hover to the icon to get help for the feature you selected.', 'wbcr_factory_clearfy_208' ); ?></p>
334
  </div>
335
  <?php
336
  }
@@ -342,19 +342,19 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
342
  $page_url = $args[0];
343
  }
344
 
345
- $page_url = apply_filters( 'wbcr_factory_pages_412_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId() );
346
 
347
  ?>
348
  <div class="wbcr-factory-sidebar-widget">
349
  <p>
350
- <strong><?php _e( 'Do you want the plugin to improved and update?', 'wbcr_factory_clearfy_208' ); ?></strong>
351
  </p>
352
- <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_208' ); ?></p>
353
- <p><?php _e( 'And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_clearfy_208' ); ?></p>
354
  <p>
355
  <i class="wbcr-factory-icon-5stars"></i>
356
  <a href="<?= $page_url ?>" title="Go rate us" target="_blank">
357
- <strong><?php _e( 'Go rate us and push ideas', 'wbcr_factory_clearfy_208' ); ?></strong>
358
  </a>
359
  </p>
360
  </div>
@@ -365,14 +365,14 @@ if ( ! class_exists( 'Wbcr_FactoryClearfy208_PageBase' ) && class_exists( 'Wbcr_
365
  ?>
366
  <div class="wbcr-factory-sidebar-widget">
367
  <p>
368
- <strong><?php _e( 'Donation for plugin development', 'wbcr_factory_clearfy_208' ); ?></strong>
369
  </p>
370
  <?php if ( get_locale() !== 'ru_RU' ): ?>
371
  <form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
372
  <input type="hidden" name="cmd" value="_s-xclick">
373
  <input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
374
  <div class="wbcr-factory-donation-price">5$</div>
375
- <input type="image" src="<?= FACTORY_PAGES_412_URL ?>/templates/assets/img/paypal-donate.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
376
  </form>
377
  <?php else: ?>
378
  <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>
15
  }
16
 
17
  /**
18
+ * Class Wbcr_FactoryPages414_ImpressiveThemplate
19
  *
20
  * @method string getInfoWidget() - get widget content information
21
  * @method string getRatingWidget( array $args = array() ) - get widget content rating
23
  * @method string getBusinessSuggetionWidget()
24
  */
25
 
26
+ if ( ! class_exists( 'Wbcr_FactoryClearfy209_PageBase' ) && class_exists( 'Wbcr_FactoryPages414_ImpressiveThemplate' ) ) {
27
 
28
+ class Wbcr_FactoryClearfy209_PageBase extends Wbcr_FactoryPages414_ImpressiveThemplate {
29
 
30
  /**
31
  * Показывать правый сайдбар?
51
  //public $show_bottom_sidebar = false;
52
 
53
  /**
54
+ * @param Wbcr_Factory414_Plugin $plugin
55
  */
56
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
57
  parent::__construct( $plugin );
58
  }
59
 
83
  /**
84
  * Requests assets (js and css) for the page.
85
  *
86
+ * @see Wbcr_FactoryPages414_AdminPage
87
  *
88
+ * @param Wbcr_Factory414_ScriptList $scripts
89
+ * @param Wbcr_Factory414_StyleList $styles
90
  *
91
  * @return void
92
  */
93
  public function assets( $scripts, $styles ) {
94
  parent::assets( $scripts, $styles );
95
 
96
+ $this->styles->add( FACTORY_CLEARFY_209_URL . '/assets/css/clearfy-base.css' );
97
 
98
  // todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
99
  if ( defined( 'WCL_PLUGIN_URL' ) ) {
100
  $this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
101
  }
102
 
103
+ wbcr_factory_414_do_action_deprecated( 'wbcr_clearfy_page_enqueue_scripts', array(
104
  $this->getResultId(),
105
  $scripts,
106
  $styles
115
  }
116
 
117
  /**
118
+ * @return Wbcr_Factory414_Request
119
  */
120
  public function request() {
121
  return $this->plugin->request;
190
  if ( is_multisite() && $this->plugin->isNetworkActive() ) {
191
 
192
  $license_page_url = $this->getBaseUrl( 'license' );
193
+ $upgrade_url = WbcrFactoryClearfy209_Helpers::getWebcrafticSitePageUrl( $this->plugin->getPluginName(), 'pricing', 'multisite_save_settings' );
194
+ $upgrade_price = WbcrFactoryClearfy209_Helpers::getClearfyBusinessPrice();
195
 
196
+ $html = '<div class="wbcr-factory-clearfy-209-multisite-suggetion">';
197
  $html .= '<div class="wbcr-factory-inner-contanier">';
198
+ $html .= '<h3>' . __( 'Upgrade to Clearfy Business', 'wbcr_factory_clearfy_209' ) . '</h3>';
199
+ $html .= '<p>' . __( 'Oops... Sorry for the inconvenience caused!', 'wbcr_factory_clearfy_209' ) . '</p>';
200
+ $html .= '<p>' . __( 'Complete multisite support is available in Clearfy Business and Clearfy Business Revolution packages only!', 'wbcr_factory_clearfy_209' ) . '</p>';
201
+ $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_209' ) . '</p>';
202
  $html .= '<p style="margin-top:20px">';
203
+ $html .= '<a href="' . $license_page_url . '" class="wbcr-factory-activate-premium" rel="noopener">' . __( 'Activate license ', 'wbcr_factory_clearfy_209' ) . '</a> ';
204
+ $html .= '<a href="' . $upgrade_url . '" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">' . sprintf( __( 'Upgrade to Clearfy Business for $%d', 'wbcr_factory_clearfy_209' ), $upgrade_price ) . '</a>';
205
  $html .= '</p>';
206
  $html .= '</div>';
207
  $html .= '</div>';
235
  /**
236
  * @since 4.0.9 - является устаревшим
237
  */
238
+ $widgets = wbcr_factory_414_apply_filters_deprecated( 'wbcr_factory_pages_414_imppage_get_widgets', array(
239
  $widgets,
240
  $position,
241
  $this->plugin,
257
  $purchase_url = $this->plugin->get_support()->get_pricing_url( true, 'right_sidebar_ads' );
258
 
259
  $default_features = array(
260
+ '4_premium' => __( '4 premium components now;', 'wbcr_factory_clearfy_209' ),
261
+ '40_premium' => __( '40 new premium components within a year for the single price;', 'wbcr_factory_clearfy_209' ),
262
+ 'multisite_support' => __( 'Multisite support;', 'wbcr_factory_clearfy_209' ),
263
+ 'advance_settings' => __( 'Advanced settings;', 'wbcr_factory_clearfy_209' ),
264
+ 'no_ads' => __( 'No ads;', 'wbcr_factory_clearfy_209' ),
265
+ 'perfect_support' => __( 'Perfect support.', 'wbcr_factory_clearfy_209' )
266
  );
267
 
268
  /**
269
  * @since 2.0.8 - added
270
  */
271
+ $suggetion_title = __( 'MORE IN CLEARFY <span>BUSINESS</span>', 'wbcr_factory_clearfy_209' );
272
  $suggetion_title = apply_filters( 'wbcr/clearfy/pages/suggetion_title', $suggetion_title, $plugin_name, $this->id );
273
 
274
  /**
275
  * @since 2.0.8 - deprecated
276
  */
277
+ $suggetion_features = wbcr_factory_414_apply_filters_deprecated( 'wbcr/clearfy/page_bussines_suggetion_features', array(
278
  $default_features,
279
  $this->plugin->getPluginName(),
280
  $this->id
290
  $suggetion_features = $default_features;
291
  }
292
  ?>
293
+ <div class="wbcr-factory-sidebar-widget wbcr-factory-clearfy-209-pro-suggettion">
294
  <h3><?php echo $suggetion_title; ?></h3>
295
  <ul>
296
  <?php if ( ! empty( $suggetion_features ) ): ?>
300
  <?php endif; ?>
301
  </ul>
302
  <a href="<?php echo $purchase_url ?>" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">
303
+ <?php printf( __( 'Upgrade for $%s', 'wbcr_factory_clearfy_209' ), $upgrade_price ) ?>
304
  </a>
305
  </div>
306
  <?php
314
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
315
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
316
  </span>
317
+ - <?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_209' ); ?>
318
  </li>
319
  <li>
320
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
321
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
322
  </span>
323
+ - <?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_209' ); ?>
324
  </li>
325
  <li>
326
  <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
327
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
328
  </span>
329
+ - <?php _e( 'Absolutely safe setting, We recommend to use.', 'wbcr_factory_clearfy_209' ); ?>
330
  </li>
331
  </ul>
332
  ----------<br>
333
+ <p><?php _e( 'Hover to the icon to get help for the feature you selected.', 'wbcr_factory_clearfy_209' ); ?></p>
334
  </div>
335
  <?php
336
  }
342
  $page_url = $args[0];
343
  }
344
 
345
+ $page_url = apply_filters( 'wbcr_factory_pages_414_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId() );
346
 
347
  ?>
348
  <div class="wbcr-factory-sidebar-widget">
349
  <p>
350
+ <strong><?php _e( 'Do you want the plugin to improved and update?', 'wbcr_factory_clearfy_209' ); ?></strong>
351
  </p>
352
+ <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_209' ); ?></p>
353
+ <p><?php _e( 'And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_clearfy_209' ); ?></p>
354
  <p>
355
  <i class="wbcr-factory-icon-5stars"></i>
356
  <a href="<?= $page_url ?>" title="Go rate us" target="_blank">
357
+ <strong><?php _e( 'Go rate us and push ideas', 'wbcr_factory_clearfy_209' ); ?></strong>
358
  </a>
359
  </p>
360
  </div>
365
  ?>
366
  <div class="wbcr-factory-sidebar-widget">
367
  <p>
368
+ <strong><?php _e( 'Donation for plugin development', 'wbcr_factory_clearfy_209' ); ?></strong>
369
  </p>
370
  <?php if ( get_locale() !== 'ru_RU' ): ?>
371
  <form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
372
  <input type="hidden" name="cmd" value="_s-xclick">
373
  <input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
374
  <div class="wbcr-factory-donation-price">5$</div>
375
+ <input type="image" src="<?= FACTORY_PAGES_414_URL ?>/templates/assets/img/paypal-donate.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
376
  </form>
377
  <?php else: ?>
378
  <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>
libs/factory/core/boot.php CHANGED
@@ -14,49 +14,49 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( defined( 'FACTORY_412_LOADED' ) ) {
18
  return;
19
  }
20
 
21
- define( 'FACTORY_412_LOADED', true );
22
 
23
- define( 'FACTORY_412_VERSION', '4.1.1' );
24
 
25
- define( 'FACTORY_412_DIR', dirname( __FILE__ ) );
26
- define( 'FACTORY_412_URL', plugins_url( null, __FILE__ ) );
27
 
28
- load_plugin_textdomain( 'wbcr_factory_412', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
 
30
  #comp merge
31
- require_once( FACTORY_412_DIR . '/includes/functions.php' );
32
 
33
- require_once( FACTORY_412_DIR . '/includes/entities/class-factory-paths.php' );
34
- require_once( FACTORY_412_DIR . '/includes/entities/class-factory-support.php' );
35
 
36
- require_once( FACTORY_412_DIR . '/includes/class-factory-requests.php' );
37
- require_once( FACTORY_412_DIR . '/includes/class-factory-options.php' );
38
- require_once( FACTORY_412_DIR . '/includes/class-factory-plugin-base.php' );
39
- require_once( FACTORY_412_DIR . '/includes/class-factory-migrations.php' );
40
- require_once( FACTORY_412_DIR . '/includes/class-factory-notices.php' );
41
 
42
  // ASSETS
43
- require_once( FACTORY_412_DIR . '/includes/assets-managment/class-factory-assets-list.php' );
44
- require_once( FACTORY_412_DIR . '/includes/assets-managment/class-factory-script-list.php' );
45
- require_once( FACTORY_412_DIR . '/includes/assets-managment/class-factory-style-list.php' );
46
 
47
  // PREMIUM
48
- require_once( FACTORY_412_DIR . '/includes/premium/class-factory-license-interface.php' );
49
- require_once( FACTORY_412_DIR . '/includes/premium/class-factory-provider-abstract.php' );
50
- require_once( FACTORY_412_DIR . '/includes/premium/class-factory-manager.php' );
51
 
52
  // UPDATES
53
- require_once( FACTORY_412_DIR . '/includes/updates/repositories/class-factory-repository-abstract.php' );
54
- require_once( FACTORY_412_DIR . '/includes/updates/repositories/class-factory-wordpress.php' );
55
- require_once( FACTORY_412_DIR . '/includes/updates/class-factory-upgrader.php' );
56
- require_once( FACTORY_412_DIR . '/includes/updates/class-factory-premium-upgrader.php' );
57
 
58
- require_once( FACTORY_412_DIR . '/includes/class-factory-plugin-abstract.php' );
59
 
60
- require_once( FACTORY_412_DIR . '/includes/activation/class-factory-activator.php' );
61
- require_once( FACTORY_412_DIR . '/includes/activation/class-factory-update.php' );
62
  #endcomp
14
  exit;
15
  }
16
 
17
+ if ( defined( 'FACTORY_414_LOADED' ) ) {
18
  return;
19
  }
20
 
21
+ define( 'FACTORY_414_LOADED', true );
22
 
23
+ define( 'FACTORY_414_VERSION', '4.1.1' );
24
 
25
+ define( 'FACTORY_414_DIR', dirname( __FILE__ ) );
26
+ define( 'FACTORY_414_URL', plugins_url( null, __FILE__ ) );
27
 
28
+ load_plugin_textdomain( 'wbcr_factory_414', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
 
30
  #comp merge
31
+ require_once( FACTORY_414_DIR . '/includes/functions.php' );
32
 
33
+ require_once( FACTORY_414_DIR . '/includes/entities/class-factory-paths.php' );
34
+ require_once( FACTORY_414_DIR . '/includes/entities/class-factory-support.php' );
35
 
36
+ require_once( FACTORY_414_DIR . '/includes/class-factory-requests.php' );
37
+ require_once( FACTORY_414_DIR . '/includes/class-factory-options.php' );
38
+ require_once( FACTORY_414_DIR . '/includes/class-factory-plugin-base.php' );
39
+ require_once( FACTORY_414_DIR . '/includes/class-factory-migrations.php' );
40
+ require_once( FACTORY_414_DIR . '/includes/class-factory-notices.php' );
41
 
42
  // ASSETS
43
+ require_once( FACTORY_414_DIR . '/includes/assets-managment/class-factory-assets-list.php' );
44
+ require_once( FACTORY_414_DIR . '/includes/assets-managment/class-factory-script-list.php' );
45
+ require_once( FACTORY_414_DIR . '/includes/assets-managment/class-factory-style-list.php' );
46
 
47
  // PREMIUM
48
+ require_once( FACTORY_414_DIR . '/includes/premium/class-factory-license-interface.php' );
49
+ require_once( FACTORY_414_DIR . '/includes/premium/class-factory-provider-abstract.php' );
50
+ require_once( FACTORY_414_DIR . '/includes/premium/class-factory-manager.php' );
51
 
52
  // UPDATES
53
+ require_once( FACTORY_414_DIR . '/includes/updates/repositories/class-factory-repository-abstract.php' );
54
+ require_once( FACTORY_414_DIR . '/includes/updates/repositories/class-factory-wordpress.php' );
55
+ require_once( FACTORY_414_DIR . '/includes/updates/class-factory-upgrader.php' );
56
+ require_once( FACTORY_414_DIR . '/includes/updates/class-factory-premium-upgrader.php' );
57
 
58
+ require_once( FACTORY_414_DIR . '/includes/class-factory-plugin-abstract.php' );
59
 
60
+ require_once( FACTORY_414_DIR . '/includes/activation/class-factory-activator.php' );
61
+ require_once( FACTORY_414_DIR . '/includes/activation/class-factory-update.php' );
62
  #endcomp
libs/factory/core/includes/activation/class-factory-activator.php CHANGED
@@ -19,15 +19,15 @@ if ( ! defined( 'ABSPATH' ) ) {
19
  *
20
  * @since 1.0.0
21
  */
22
- abstract class Wbcr_Factory412_Activator {
23
 
24
  /**
25
  * Curent plugin.
26
- * @var Wbcr_Factory412_Plugin
27
  */
28
  public $plugin;
29
 
30
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
31
  $this->plugin = $plugin;
32
  }
33
 
19
  *
20
  * @since 1.0.0
21
  */
22
+ abstract class Wbcr_Factory414_Activator {
23
 
24
  /**
25
  * Curent plugin.
26
+ * @var Wbcr_Factory414_Plugin
27
  */
28
  public $plugin;
29
 
30
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
31
  $this->plugin = $plugin;
32
  }
33
 
libs/factory/core/includes/activation/class-factory-update.php CHANGED
@@ -20,15 +20,15 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_Factory412_Update {
24
 
25
  /**
26
  * Current plugin
27
- * @var Wbcr_Factory412_Plugin
28
  */
29
  var $plugin;
30
 
31
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
32
  $this->plugin = $plugin;
33
  }
34
 
20
  *
21
  * @since 1.0.0
22
  */
23
+ abstract class Wbcr_Factory414_Update {
24
 
25
  /**
26
  * Current plugin
27
+ * @var Wbcr_Factory414_Plugin
28
  */
29
  var $plugin;
30
 
31
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
32
  $this->plugin = $plugin;
33
  }
34
 
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_Factory412_AssetsList {
23
 
24
  protected $all = array();
25
  public $header_place = array();
@@ -29,15 +29,15 @@ class Wbcr_Factory412_AssetsList {
29
  protected $default_place;
30
 
31
  /**
32
- * @var Wbcr_Factory412_Plugin
33
  */
34
  protected $plugin;
35
 
36
  /**
37
- * @param Wbcr_Factory412_Plugin $plugin
38
  * @param bool $defaultIsFooter
39
  */
40
- public function __construct( Wbcr_Factory412_Plugin $plugin, $defaultIsFooter = true ) {
41
  $this->plugin = $plugin;
42
 
43
  if ( $defaultIsFooter ) {
19
  *
20
  * @since 1.0.0
21
  */
22
+ class Wbcr_Factory414_AssetsList {
23
 
24
  protected $all = array();
25
  public $header_place = array();
29
  protected $default_place;
30
 
31
  /**
32
+ * @var Wbcr_Factory414_Plugin
33
  */
34
  protected $plugin;
35
 
36
  /**
37
+ * @param Wbcr_Factory414_Plugin $plugin
38
  * @param bool $defaultIsFooter
39
  */
40
+ public function __construct( Wbcr_Factory414_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_Factory412_ScriptList extends Wbcr_Factory412_AssetsList {
24
 
25
  public $localize_data = array();
26
  public $use_ajax = false;
@@ -149,7 +149,7 @@ class Wbcr_Factory412_ScriptList extends Wbcr_Factory412_AssetsList {
149
  * @param string $varname
150
  * @param string $data
151
  *
152
- * @return Wbcr_Factory412_ScriptList $this
153
  */
154
  public function localize( $varname, $data ) {
155
  $bindTo = count( $this->all ) == 0 ? null : end( $this->all );
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_Factory414_ScriptList extends Wbcr_Factory414_AssetsList {
24
 
25
  public $localize_data = array();
26
  public $use_ajax = false;
149
  * @param string $varname
150
  * @param string $data
151
  *
152
+ * @return Wbcr_Factory414_ScriptList $this
153
  */
154
  public function localize( $varname, $data ) {
155
  $bindTo = count( $this->all ) == 0 ? null : end( $this->all );
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_Factory412_StyleList extends Wbcr_Factory412_AssetsList {
24
 
25
  /**
26
  * Adds new items to the collection (default place).
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_Factory414_StyleList extends Wbcr_Factory414_AssetsList {
24
 
25
  /**
26
  * Adds new items to the collection (default place).
libs/factory/core/includes/class-check-compatibility.php CHANGED
@@ -79,19 +79,19 @@
79
  $notice_text = $notice_default_text = '';
80
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __('warning', '') . ':</b>' . '<br>';
81
 
82
- $notice_default_text .= sprintf(__('The %s plugin has stopped.', 'wbcr_factory_clearfy_208'), $this->plugin_title) . ' ';
83
  $notice_default_text .= __('Possible reasons:', '') . ' <br>';
84
 
85
  $has_one = false;
86
 
87
  if( !$this->isPhpCompatibility() ) {
88
  $has_one = true;
89
- $notice_text .= '- ' . sprintf(__('You need to update the PHP version to %s or higher!', 'wbcr_factory_412'), $this->required_php_version) . '<br>';
90
  }
91
 
92
  if( !$this->isWpCompatibility() ) {
93
  $has_one = true;
94
- $notice_text .= '- ' . sprintf(__('You need to update WordPress to %s or higher!', 'wbcr_factory_412'), $this->required_wp_version) . '<br>';
95
  }
96
 
97
  if( $has_one ) {
79
  $notice_text = $notice_default_text = '';
80
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __('warning', '') . ':</b>' . '<br>';
81
 
82
+ $notice_default_text .= sprintf(__('The %s plugin has stopped.', 'wbcr_factory_clearfy_209'), $this->plugin_title) . ' ';
83
  $notice_default_text .= __('Possible reasons:', '') . ' <br>';
84
 
85
  $has_one = false;
86
 
87
  if( !$this->isPhpCompatibility() ) {
88
  $has_one = true;
89
+ $notice_text .= '- ' . sprintf(__('You need to update the PHP version to %s or higher!', 'wbcr_factory_414'), $this->required_php_version) . '<br>';
90
  }
91
 
92
  if( !$this->isWpCompatibility() ) {
93
  $has_one = true;
94
+ $notice_text .= '- ' . sprintf(__('You need to update WordPress to %s or higher!', 'wbcr_factory_414'), $this->required_wp_version) . '<br>';
95
  }
96
 
97
  if( $has_one ) {
libs/factory/core/includes/class-factory-migrations.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412;
4
 
5
  use Exception;
6
- use Wbcr_Factory412_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
@@ -20,41 +20,56 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  * for the plugin, if constant isn't set, then the previous version is taken from
21
  * the database.
22
  *
 
23
  *
24
- * @author Webcraftic <wordpress.webraftic@gmail.com>, Alex Kovalev <alex.kovalevv@gmail.com>
25
- * @link https://webcraftic.com
 
26
  * @copyright (c) 2018 Webraftic Ltd
27
- * @since 4.1.1
28
  */
29
  class Migrations {
30
-
31
  protected $plugin;
32
-
33
  /**
34
  * Migrations constructor.
35
  *
36
- * @param Wbcr_Factory412_Plugin $plugin
37
  *
38
  * @throws Exception
39
  */
40
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
41
-
42
  $this->plugin = $plugin;
43
  $plugin_name = $plugin->getPluginName();
44
-
45
  if ( ! file_exists( $this->plugin->get_paths()->migrations ) ) {
46
  throw new Exception( 'Starting with version 4.1.1 of the Core for Factory framework module, you must create a "migrations" folder in the root of your plugin to store the migration of the plugin.' );
47
  }
48
-
49
  if ( is_admin() ) {
50
- add_action( "admin_init", array( $this, "check_migrations" ) );
51
-
52
- add_action( "wbcr/factory/plugin_{$plugin_name}_activation", array( $this, 'activation_hook' ) );
53
- add_action( "wbcr_factory_notices_000_list", array( $this, "debug_bar_notice" ) );
54
- add_action( "wbcr_factory_notices_000_list", array( $this, "migration_error_notice" ) );
55
  }
56
  }
57
-
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  /**
59
  * Check if migration is necessary for plugin and if there are errors from previous migrations.
60
  * In debug mode, migrations are not performed automatically.
@@ -65,18 +80,18 @@ class Migrations {
65
  wp_redirect( remove_query_arg( 'wbcr_factory_fix_migration_error' ) );
66
  die();
67
  }
68
-
69
  if ( $this->is_debug() && isset( $_GET['wbcr_factory_test_migration'] ) ) {
70
  $this->make_migration();
71
  wp_redirect( remove_query_arg( 'wbcr_factory_test_migration' ) );
72
  die();
73
  }
74
-
75
  if ( $this->need_migration() && ! $this->is_debug() ) {
76
  $this->make_migration();
77
  }
78
  }
79
-
80
  /**
81
  * Notification displays the errors of outstanding migrations to fix errors
82
  * you need to follow the instructions in the notification and click
@@ -95,28 +110,33 @@ class Migrations {
95
  * @return array
96
  */
97
  public function migration_error_notice( $notices ) {
98
-
99
  if ( ! $this->is_migration_error() || ! current_user_can( 'update_plugins' ) ) {
100
  return $notices;
101
  }
102
-
103
- $migration_error_text = $this->plugin->getPopulateOption( 'plugin_migration_error', '' );
 
 
 
 
 
104
  $fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
105
-
106
  $notice_text = $migration_error_text;
107
- $notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', 'wbcr_factory_412' ) . "</a>";
108
-
109
- $notices[] = array(
110
  'id' => 'migration_debug_bar',
111
  'type' => 'error',
112
  'dismissible' => false,
113
  'dismiss_expires' => 0,
114
- 'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', 'wbcr_factory_412' ) . '</b><br>' . $notice_text . '</p>'
115
- );
116
-
117
  return $notices;
118
  }
119
-
120
  /**
121
  * Debug panel, display some information from the database. Also allows
122
  * perform manual migrations to test new migrations.
@@ -126,49 +146,55 @@ class Migrations {
126
  * @return array
127
  */
128
  public function debug_bar_notice( $notices ) {
129
-
130
  if ( ! $this->is_debug() || ! current_user_can( 'update_plugins' ) ) {
131
  return $notices;
132
  }
133
-
134
  $migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
135
-
136
- $notice_text = __( "Plugin activated:", "wbcr_factory_412" ) . ' ' . date( "Y-m-d H:i:s", $this->plugin->getPopulateOption( 'plugin_activated', 0 ) ) . "<br>";
137
- $notice_text .= __( "Old plugin version (db):", "wbcr_factory_412" ) . ' ' . $this->plugin->getPopulateOption( 'plugin_version' ) . "<br>";
138
- $notice_text .= __( "Old plugin version (debug):", "wbcr_factory_412" ) . ' ' . $this->get_old_plugin_version() . "<br>";
139
- $notice_text .= __( "Current plugin version:", "wbcr_factory_412" ) . ' ' . $this->get_current_plugin_version() . "<br>";
140
- $notice_text .= __( "Need migration:", "wbcr_factory_412" ) . ' ' . ( $this->need_migration() ? "true" : "false" ) . "<br><br>";
141
- $notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "wbcr_factory_412" ) . "</a><br>";
142
-
143
- $notices[] = array(
144
  'id' => 'migration_debug_bar',
145
  'type' => 'warning',
146
  'dismissible' => false,
147
  'dismiss_expires' => 0,
148
- 'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', 'wbcr_factory_412' ) . '</b><br>' . $notice_text . '</p>'
149
- );
150
-
151
  return $notices;
152
  }
153
-
154
  /**
155
  * Runs when plugin is activated. Checks if you need to migrate
156
  * and if necessary it does it. Also adds a option when the plugin
157
  * was activated for the first time.
158
  */
159
  public function activation_hook() {
160
- if ( $this->need_migration() && ! $this->is_debug() ) {
161
  $this->make_migration();
162
- }
163
-
164
  // just time to know when the plugin was activated the first time
165
- $activated = $this->plugin->getPopulateOption( 'plugin_activated', 0 );
166
-
167
  if ( ! $activated ) {
168
- $this->plugin->updatePopulateOption( 'plugin_activated', time() );
 
 
 
 
 
 
169
  }
170
  }
171
-
172
  /**
173
  * Checks if debug mode of migrations from version x.x.x to x.x.y is enabled.
174
  *
@@ -177,44 +203,48 @@ class Migrations {
177
  protected function is_debug() {
178
  return defined( 'FACTORY_MIGRATIONS_DEBUG' ) && FACTORY_MIGRATIONS_DEBUG;
179
  }
180
-
181
  /**
182
  * Gets previous version of plugin that plugin had before updating to the new version.
183
  *
184
  * @return string|null
185
  */
186
  protected function get_old_plugin_version() {
187
-
188
  if ( $this->is_debug() && defined( 'FACTORY_MIGRATIONS_FORCE_OLD_VERSION' ) ) {
189
  return FACTORY_MIGRATIONS_FORCE_OLD_VERSION;
190
  }
191
-
192
- $plugin_version = $this->plugin->getPopulateOption( 'plugin_version', null );
193
-
 
 
 
 
194
  if ( ! empty( $plugin_version ) ) {
195
  return $plugin_version;
196
  }
197
-
198
  # TODO: Remove after few releases
199
  # This block for compatibility code with old version of framework < 4.1.1
200
  #-------------------------------------------
201
  if ( $this->plugin->isNetworkActive() ) {
202
- $plugin_versions = get_site_option( 'factory_plugin_versions', array() );
203
  } else {
204
- $plugin_versions = get_option( 'factory_plugin_versions', array() );
205
  }
206
-
207
  $plugin_version = isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ? $plugin_versions[ $this->plugin->getPluginName() ] : null;
208
-
209
  if ( ! empty( $plugin_version ) ) {
210
- $plugin_version = str_replace( array( 'free-', 'premium-', 'offline-' ), '', $plugin_version );
211
  }
212
-
213
  #-------------------------------------------
214
-
215
  return $plugin_version;
216
  }
217
-
218
  /**
219
  * Gets the current version of plugin.
220
  *
@@ -223,7 +253,7 @@ class Migrations {
223
  protected function get_current_plugin_version() {
224
  return $this->plugin->getPluginVersion();
225
  }
226
-
227
  /**
228
  * Do I need migration for plugin? If previous migration was with a error, then
229
  * method will always return false to prevent looping.
@@ -234,28 +264,38 @@ class Migrations {
234
  if ( $this->is_migration_error() ) {
235
  return false;
236
  }
237
-
238
  return version_compare( $this->get_old_plugin_version(), $this->get_current_plugin_version(), '<' );
239
  }
240
-
241
  /**
242
  * Are there errors from previous migrations?
243
  *
244
  * @return bool
245
  */
246
  protected function is_migration_error() {
247
- $error = $this->plugin->getPopulateOption( 'plugin_migration_error', false );
248
-
 
 
 
 
249
  return $error !== false;
250
  }
251
-
252
  /**
253
  * Remove an option in database, thereby fix errors of the previous migration.
254
  */
255
  protected function fix_migration_error() {
256
- $this->plugin->deletePopulateOption( 'plugin_migration_error' );
 
 
 
 
 
 
257
  }
258
-
259
  /**
260
  * Migrates the plugin from version x.x.x to x.x.y. Automatically searches for files
261
  * migrations to the plugin's root directory and executes them. Default files
@@ -265,107 +305,114 @@ class Migrations {
265
  *
266
  */
267
  protected function make_migration() {
268
-
269
  if ( ! current_user_can( 'update_plugins' ) ) {
270
  return;
271
  }
272
-
273
  $old_plugin_version = $this->get_old_plugin_version();
274
  $new_plugin_version = $this->get_current_plugin_version();
275
-
276
  if ( empty( $old_plugin_version ) ) {
277
  $this->update_plugin_version_in_db();
278
  }
279
-
280
  // converts versions like 0.0.0 to 000000
281
  $old_number = $this->get_version_number( $old_plugin_version );
282
  $new_number = $this->get_version_number( $new_plugin_version );
283
-
284
  try {
285
-
286
  $update_files = $this->plugin->get_paths()->migrations;
287
  $files = $this->find_files( $update_files );
288
-
289
  if ( empty( $files ) ) {
290
  $this->update_plugin_version_in_db();
291
-
292
  return;
293
  }
294
-
295
  // finds updates that has intermediate version
296
  foreach ( (array) $files as $item ) {
297
  if ( ! preg_match( '/^\d+$/', $item['name'] ) ) {
298
  continue;
299
  }
300
-
301
  $item_number = intval( $item['name'] );
302
-
303
  if ( $item_number > $old_number && $item_number <= $new_number ) {
304
  $classes = $this->get_classes( $item['path'] );
305
-
306
  if ( count( $classes ) == 0 ) {
307
  continue;
308
  }
309
-
310
  foreach ( $classes as $path => $class_data ) {
311
  include_once( $path );
312
  $update_class = $class_data['name'];
313
-
314
  $update = new $update_class( $this->plugin );
315
  $update->install();
316
  }
317
  }
318
  }
319
-
320
  $this->update_plugin_version_in_db();
321
  } catch( Exception $e ) {
322
- $this->plugin->updatePopulateOption( 'plugin_migration_error', $e->getMessage() );
 
 
 
 
 
323
  }
324
  }
325
-
326
  /**
327
  * Updates version of plugin in database. So that we can track which
328
  * previous version of plugin was at the user, before he updated
329
  * plugin.
330
  */
331
  protected function update_plugin_version_in_db() {
332
-
333
  # TODO: Delete after few releases
334
  # This block for compatibility code with the old version of framework.
335
  # Cleans up old data, after the transition to new version of framework.
336
  #-------------------------------------------
337
  if ( $this->plugin->isNetworkActive() ) {
338
- $plugin_versions = get_site_option( 'factory_plugin_versions', array() );
339
  } else {
340
- $plugin_versions = get_option( 'factory_plugin_versions', array() );
341
  }
342
-
343
  if ( isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ) {
344
  unset( $plugin_versions[ $this->plugin->getPluginName() ] );
345
  }
346
-
347
  if ( $this->plugin->isNetworkActive() ) {
348
  if ( empty( $plugin_versions ) ) {
349
  delete_site_option( 'factory_plugin_versions' );
350
  }
351
  update_site_option( 'factory_plugin_versions', $plugin_versions );
352
- } else {
353
- if ( empty( $plugin_versions ) ) {
354
- delete_option( 'factory_plugin_versions' );
355
- }
356
- update_option( 'factory_plugin_versions', $plugin_versions );
357
  }
358
- #-------------------------------------------
359
-
360
- $this->plugin->updatePopulateOption( 'plugin_version', $this->get_current_plugin_version() );
 
 
 
 
361
  }
362
-
363
  /**
364
  * Converts string representation of the version to the numeric.
365
  *
366
  * @since 1.0.0
367
  *
368
- * @param string $version A string version to convert.
369
  *
370
  * @return integer
371
  */
@@ -374,67 +421,67 @@ class Migrations {
374
  if ( count( $matches ) == 0 ) {
375
  return false;
376
  }
377
-
378
  $number = '';
379
  $number .= ( strlen( $matches[1] ) == 1 ) ? '0' . $matches[1] : $matches[1];
380
  $number .= ( strlen( $matches[2] ) == 1 ) ? '0' . $matches[2] : $matches[2];
381
  $number .= ( strlen( $matches[3] ) == 1 ) ? '0' . $matches[3] : $matches[3];
382
-
383
  return intval( $number );
384
  }
385
-
386
  /**
387
  * Returns a list of files at a given path.
388
  *
389
- * @param string $path path for search
390
  */
391
  private function find_files( $path ) {
392
  return $this->find_file_or_folders( $path, true );
393
  }
394
-
395
  /**
396
  * Returns a list of folders at a given path.
397
  *
398
- * @param string $path path for search
399
  */
400
  /*private function find_folders( $path ) {
401
  return $this->find_file_or_folders( $path, false );
402
  }*/
403
-
404
  /**
405
  * Returns a list of files or folders at a given path.
406
  *
407
- * @param string $path path for search
408
- * @param bool $files files or folders?
409
  */
410
  private function find_file_or_folders( $path, $areFiles = true ) {
411
  if ( ! is_dir( $path ) ) {
412
- return array();
413
  }
414
-
415
  $entries = scandir( $path );
416
  if ( empty( $entries ) ) {
417
- return array();
418
  }
419
-
420
- $files = array();
421
  foreach ( $entries as $entryName ) {
422
  if ( $entryName == '.' || $entryName == '..' ) {
423
  continue;
424
  }
425
-
426
  $filename = $path . '/' . $entryName;
427
  if ( ( $areFiles && is_file( $filename ) ) || ( ! $areFiles && is_dir( $filename ) ) ) {
428
- $files[] = array(
429
  'path' => str_replace( "\\", "/", $filename ),
430
  'name' => $areFiles ? str_replace( '.php', '', $entryName ) : $entryName
431
- );
432
  }
433
  }
434
-
435
  return $files;
436
  }
437
-
438
  /**
439
  * Gets php classes defined in a specified file.
440
  *
@@ -443,34 +490,34 @@ class Migrations {
443
  * @throws Exception
444
  */
445
  private function get_classes( $path ) {
446
-
447
  $phpCode = file_get_contents( $path );
448
-
449
- $classes = array();
450
-
451
  if ( ! function_exists( 'token_get_all' ) ) {
452
- throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', 'wbcr_factory_412' ) );
453
  }
454
-
455
  $tokens = token_get_all( $phpCode );
456
-
457
  $count = count( $tokens );
458
  for ( $i = 2; $i < $count; $i ++ ) {
459
  if ( is_array( $tokens ) && $tokens[ $i - 2 ][0] == T_CLASS && $tokens[ $i - 1 ][0] == T_WHITESPACE && $tokens[ $i ][0] == T_STRING ) {
460
-
461
  $extends = null;
462
  if ( $tokens[ $i + 2 ][0] == T_EXTENDS && $tokens[ $i + 4 ][0] == T_STRING ) {
463
  $extends = $tokens[ $i + 4 ][1];
464
  }
465
-
466
  $class_name = $tokens[ $i ][1];
467
- $classes[ $path ] = array(
468
  'name' => $class_name,
469
  'extends' => $extends
470
- );
471
  }
472
  }
473
-
474
  /**
475
  * result example:
476
  *
@@ -479,7 +526,7 @@ class Migrations {
479
  * 'extendes' => 'PluginNameItemBase'
480
  * )
481
  */
482
-
483
  return $classes;
484
  }
485
  }
1
  <?php
2
 
3
+ namespace WBCR\Factory_414;
4
 
5
  use Exception;
6
+ use Wbcr_Factory414_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
20
  * for the plugin, if constant isn't set, then the previous version is taken from
21
  * the database.
22
  *
23
+ * todo: get_option and get_site_option are used because some caching plugins caching options, which causes problems
24
  *
25
+ *
26
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, Alex Kovalev <alex.kovalevv@gmail.com>
27
+ * @since 4.1.1
28
  * @copyright (c) 2018 Webraftic Ltd
29
+ * @link https://webcraftic.com
30
  */
31
  class Migrations {
32
+
33
  protected $plugin;
34
+
35
  /**
36
  * Migrations constructor.
37
  *
38
+ * @param Wbcr_Factory414_Plugin $plugin
39
  *
40
  * @throws Exception
41
  */
42
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
43
+
44
  $this->plugin = $plugin;
45
  $plugin_name = $plugin->getPluginName();
46
+
47
  if ( ! file_exists( $this->plugin->get_paths()->migrations ) ) {
48
  throw new Exception( 'Starting with version 4.1.1 of the Core for Factory framework module, you must create a "migrations" folder in the root of your plugin to store the migration of the plugin.' );
49
  }
50
+
51
  if ( is_admin() ) {
52
+ add_action( "admin_init", [ $this, "check_migrations" ] );
53
+
54
+ add_action( "wbcr/factory/plugin_{$plugin_name}_activated", [ $this, 'activation_hook' ] );
55
+ add_action( "wbcr_factory_notices_000_list", [ $this, "debug_bar_notice" ] );
56
+ add_action( "wbcr_factory_notices_000_list", [ $this, "migration_error_notice" ] );
57
  }
58
  }
59
+
60
+ /**
61
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
62
+ * @since 4.1.1
63
+ * @return mixed|void
64
+ */
65
+ public function get_plugin_activated_time() {
66
+ if ( $this->plugin->isNetworkActive() ) {
67
+ return get_site_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
68
+ }
69
+
70
+ return get_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
71
+ }
72
+
73
  /**
74
  * Check if migration is necessary for plugin and if there are errors from previous migrations.
75
  * In debug mode, migrations are not performed automatically.
80
  wp_redirect( remove_query_arg( 'wbcr_factory_fix_migration_error' ) );
81
  die();
82
  }
83
+
84
  if ( $this->is_debug() && isset( $_GET['wbcr_factory_test_migration'] ) ) {
85
  $this->make_migration();
86
  wp_redirect( remove_query_arg( 'wbcr_factory_test_migration' ) );
87
  die();
88
  }
89
+
90
  if ( $this->need_migration() && ! $this->is_debug() ) {
91
  $this->make_migration();
92
  }
93
  }
94
+
95
  /**
96
  * Notification displays the errors of outstanding migrations to fix errors
97
  * you need to follow the instructions in the notification and click
110
  * @return array
111
  */
112
  public function migration_error_notice( $notices ) {
113
+
114
  if ( ! $this->is_migration_error() || ! current_user_can( 'update_plugins' ) ) {
115
  return $notices;
116
  }
117
+
118
+ if ( $this->plugin->isNetworkActive() ) {
119
+ $migration_error_text = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
120
+ } else {
121
+ $migration_error_text = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
122
+ }
123
+
124
  $fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
125
+
126
  $notice_text = $migration_error_text;
127
+ $notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', 'wbcr_factory_414' ) . "</a>";
128
+
129
+ $notices[] = [
130
  'id' => 'migration_debug_bar',
131
  'type' => 'error',
132
  'dismissible' => false,
133
  'dismiss_expires' => 0,
134
+ 'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', 'wbcr_factory_414' ) . '</b><br>' . $notice_text . '</p>'
135
+ ];
136
+
137
  return $notices;
138
  }
139
+
140
  /**
141
  * Debug panel, display some information from the database. Also allows
142
  * perform manual migrations to test new migrations.
146
  * @return array
147
  */
148
  public function debug_bar_notice( $notices ) {
149
+
150
  if ( ! $this->is_debug() || ! current_user_can( 'update_plugins' ) ) {
151
  return $notices;
152
  }
153
+
154
  $migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
155
+
156
+ $notice_text = __( "Plugin activated:", "wbcr_factory_414" ) . ' ' . date( "Y-m-d H:i:s", $this->get_plugin_activated_time() ) . "<br>";
157
+
158
+ $notice_text .= __( "Old plugin version (debug):", "wbcr_factory_414" ) . ' ' . $this->get_old_plugin_version() . "<br>";
159
+ $notice_text .= __( "Current plugin version:", "wbcr_factory_414" ) . ' ' . $this->get_current_plugin_version() . "<br>";
160
+ $notice_text .= __( "Need migration:", "wbcr_factory_414" ) . ' ' . ( $this->need_migration() ? "true" : "false" ) . "<br><br>";
161
+ $notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "wbcr_factory_414" ) . "</a><br>";
162
+
163
+ $notices[] = [
164
  'id' => 'migration_debug_bar',
165
  'type' => 'warning',
166
  'dismissible' => false,
167
  'dismiss_expires' => 0,
168
+ 'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', 'wbcr_factory_414' ) . '</b><br>' . $notice_text . '</p>'
169
+ ];
170
+
171
  return $notices;
172
  }
173
+
174
  /**
175
  * Runs when plugin is activated. Checks if you need to migrate
176
  * and if necessary it does it. Also adds a option when the plugin
177
  * was activated for the first time.
178
  */
179
  public function activation_hook() {
180
+ /*if ( $this->need_migration() && ! $this->is_debug() ) {
181
  $this->make_migration();
182
+ }*/
183
+
184
  // just time to know when the plugin was activated the first time
185
+ $activated = $this->get_plugin_activated_time();
186
+
187
  if ( ! $activated ) {
188
+ if ( $this->plugin->isNetworkActive() ) {
189
+ update_site_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
190
+ update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
191
+ } else {
192
+ update_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
193
+ update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
194
+ }
195
  }
196
  }
197
+
198
  /**
199
  * Checks if debug mode of migrations from version x.x.x to x.x.y is enabled.
200
  *
203
  protected function is_debug() {
204
  return defined( 'FACTORY_MIGRATIONS_DEBUG' ) && FACTORY_MIGRATIONS_DEBUG;
205
  }
206
+
207
  /**
208
  * Gets previous version of plugin that plugin had before updating to the new version.
209
  *
210
  * @return string|null
211
  */
212
  protected function get_old_plugin_version() {
213
+
214
  if ( $this->is_debug() && defined( 'FACTORY_MIGRATIONS_FORCE_OLD_VERSION' ) ) {
215
  return FACTORY_MIGRATIONS_FORCE_OLD_VERSION;
216
  }
217
+
218
+ if ( $this->plugin->isNetworkActive() ) {
219
+ $plugin_version = get_site_option( $this->plugin->getOptionName( 'plugin_version' ), null );
220
+ } else {
221
+ $plugin_version = get_option( $this->plugin->getOptionName( 'plugin_version' ), null );
222
+ }
223
+
224
  if ( ! empty( $plugin_version ) ) {
225
  return $plugin_version;
226
  }
227
+
228
  # TODO: Remove after few releases
229
  # This block for compatibility code with old version of framework < 4.1.1
230
  #-------------------------------------------
231
  if ( $this->plugin->isNetworkActive() ) {
232
+ $plugin_versions = get_site_option( 'factory_plugin_versions', [] );
233
  } else {
234
+ $plugin_versions = get_option( 'factory_plugin_versions', [] );
235
  }
236
+
237
  $plugin_version = isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ? $plugin_versions[ $this->plugin->getPluginName() ] : null;
238
+
239
  if ( ! empty( $plugin_version ) ) {
240
+ $plugin_version = str_replace( [ 'free-', 'premium-', 'offline-' ], '', $plugin_version );
241
  }
242
+
243
  #-------------------------------------------
244
+
245
  return $plugin_version;
246
  }
247
+
248
  /**
249
  * Gets the current version of plugin.
250
  *
253
  protected function get_current_plugin_version() {
254
  return $this->plugin->getPluginVersion();
255
  }
256
+
257
  /**
258
  * Do I need migration for plugin? If previous migration was with a error, then
259
  * method will always return false to prevent looping.
264
  if ( $this->is_migration_error() ) {
265
  return false;
266
  }
267
+
268
  return version_compare( $this->get_old_plugin_version(), $this->get_current_plugin_version(), '<' );
269
  }
270
+
271
  /**
272
  * Are there errors from previous migrations?
273
  *
274
  * @return bool
275
  */
276
  protected function is_migration_error() {
277
+ if ( $this->plugin->isNetworkActive() ) {
278
+ $error = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
279
+ } else {
280
+ $error = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
281
+ }
282
+
283
  return $error !== false;
284
  }
285
+
286
  /**
287
  * Remove an option in database, thereby fix errors of the previous migration.
288
  */
289
  protected function fix_migration_error() {
290
+ if ( $this->plugin->isNetworkActive() ) {
291
+ delete_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
292
+
293
+ return;
294
+ }
295
+
296
+ delete_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
297
  }
298
+
299
  /**
300
  * Migrates the plugin from version x.x.x to x.x.y. Automatically searches for files
301
  * migrations to the plugin's root directory and executes them. Default files
305
  *
306
  */
307
  protected function make_migration() {
308
+
309
  if ( ! current_user_can( 'update_plugins' ) ) {
310
  return;
311
  }
312
+
313
  $old_plugin_version = $this->get_old_plugin_version();
314
  $new_plugin_version = $this->get_current_plugin_version();
315
+
316
  if ( empty( $old_plugin_version ) ) {
317
  $this->update_plugin_version_in_db();
318
  }
319
+
320
  // converts versions like 0.0.0 to 000000
321
  $old_number = $this->get_version_number( $old_plugin_version );
322
  $new_number = $this->get_version_number( $new_plugin_version );
323
+
324
  try {
325
+
326
  $update_files = $this->plugin->get_paths()->migrations;
327
  $files = $this->find_files( $update_files );
328
+
329
  if ( empty( $files ) ) {
330
  $this->update_plugin_version_in_db();
331
+
332
  return;
333
  }
334
+
335
  // finds updates that has intermediate version
336
  foreach ( (array) $files as $item ) {
337
  if ( ! preg_match( '/^\d+$/', $item['name'] ) ) {
338
  continue;
339
  }
340
+
341
  $item_number = intval( $item['name'] );
342
+
343
  if ( $item_number > $old_number && $item_number <= $new_number ) {
344
  $classes = $this->get_classes( $item['path'] );
345
+
346
  if ( count( $classes ) == 0 ) {
347
  continue;
348
  }
349
+
350
  foreach ( $classes as $path => $class_data ) {
351
  include_once( $path );
352
  $update_class = $class_data['name'];
353
+
354
  $update = new $update_class( $this->plugin );
355
  $update->install();
356
  }
357
  }
358
  }
359
+
360
  $this->update_plugin_version_in_db();
361
  } catch( Exception $e ) {
362
+ if ( $this->plugin->isNetworkActive() ) {
363
+ update_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
364
+
365
+ return;
366
+ }
367
+ update_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
368
  }
369
  }
370
+
371
  /**
372
  * Updates version of plugin in database. So that we can track which
373
  * previous version of plugin was at the user, before he updated
374
  * plugin.
375
  */
376
  protected function update_plugin_version_in_db() {
377
+
378
  # TODO: Delete after few releases
379
  # This block for compatibility code with the old version of framework.
380
  # Cleans up old data, after the transition to new version of framework.
381
  #-------------------------------------------
382
  if ( $this->plugin->isNetworkActive() ) {
383
+ $plugin_versions = get_site_option( 'factory_plugin_versions', [] );
384
  } else {
385
+ $plugin_versions = get_option( 'factory_plugin_versions', [] );
386
  }
387
+
388
  if ( isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ) {
389
  unset( $plugin_versions[ $this->plugin->getPluginName() ] );
390
  }
391
+
392
  if ( $this->plugin->isNetworkActive() ) {
393
  if ( empty( $plugin_versions ) ) {
394
  delete_site_option( 'factory_plugin_versions' );
395
  }
396
  update_site_option( 'factory_plugin_versions', $plugin_versions );
397
+ update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
398
+
399
+ return;
 
 
400
  }
401
+
402
+ if ( empty( $plugin_versions ) ) {
403
+ delete_option( 'factory_plugin_versions' );
404
+ }
405
+
406
+ update_option( 'factory_plugin_versions', $plugin_versions );
407
+ update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
408
  }
409
+
410
  /**
411
  * Converts string representation of the version to the numeric.
412
  *
413
  * @since 1.0.0
414
  *
415
+ * @param string $version A string version to convert.
416
  *
417
  * @return integer
418
  */
421
  if ( count( $matches ) == 0 ) {
422
  return false;
423
  }
424
+
425
  $number = '';
426
  $number .= ( strlen( $matches[1] ) == 1 ) ? '0' . $matches[1] : $matches[1];
427
  $number .= ( strlen( $matches[2] ) == 1 ) ? '0' . $matches[2] : $matches[2];
428
  $number .= ( strlen( $matches[3] ) == 1 ) ? '0' . $matches[3] : $matches[3];
429
+
430
  return intval( $number );
431
  }
432
+
433
  /**
434
  * Returns a list of files at a given path.
435
  *
436
+ * @param string $path path for search
437
  */
438
  private function find_files( $path ) {
439
  return $this->find_file_or_folders( $path, true );
440
  }
441
+
442
  /**
443
  * Returns a list of folders at a given path.
444
  *
445
+ * @param string $path path for search
446
  */
447
  /*private function find_folders( $path ) {
448
  return $this->find_file_or_folders( $path, false );
449
  }*/
450
+
451
  /**
452
  * Returns a list of files or folders at a given path.
453
  *
454
+ * @param string $path path for search
455
+ * @param bool $files files or folders?
456
  */
457
  private function find_file_or_folders( $path, $areFiles = true ) {
458
  if ( ! is_dir( $path ) ) {
459
+ return [];
460
  }
461
+
462
  $entries = scandir( $path );
463
  if ( empty( $entries ) ) {
464
+ return [];
465
  }
466
+
467
+ $files = [];
468
  foreach ( $entries as $entryName ) {
469
  if ( $entryName == '.' || $entryName == '..' ) {
470
  continue;
471
  }
472
+
473
  $filename = $path . '/' . $entryName;
474
  if ( ( $areFiles && is_file( $filename ) ) || ( ! $areFiles && is_dir( $filename ) ) ) {
475
+ $files[] = [
476
  'path' => str_replace( "\\", "/", $filename ),
477
  'name' => $areFiles ? str_replace( '.php', '', $entryName ) : $entryName
478
+ ];
479
  }
480
  }
481
+
482
  return $files;
483
  }
484
+
485
  /**
486
  * Gets php classes defined in a specified file.
487
  *
490
  * @throws Exception
491
  */
492
  private function get_classes( $path ) {
493
+
494
  $phpCode = file_get_contents( $path );
495
+
496
+ $classes = [];
497
+
498
  if ( ! function_exists( 'token_get_all' ) ) {
499
+ throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', 'wbcr_factory_414' ) );
500
  }
501
+
502
  $tokens = token_get_all( $phpCode );
503
+
504
  $count = count( $tokens );
505
  for ( $i = 2; $i < $count; $i ++ ) {
506
  if ( is_array( $tokens ) && $tokens[ $i - 2 ][0] == T_CLASS && $tokens[ $i - 1 ][0] == T_WHITESPACE && $tokens[ $i ][0] == T_STRING ) {
507
+
508
  $extends = null;
509
  if ( $tokens[ $i + 2 ][0] == T_EXTENDS && $tokens[ $i + 4 ][0] == T_STRING ) {
510
  $extends = $tokens[ $i + 4 ][1];
511
  }
512
+
513
  $class_name = $tokens[ $i ][1];
514
+ $classes[ $path ] = [
515
  'name' => $class_name,
516
  'extends' => $extends
517
+ ];
518
  }
519
  }
520
+
521
  /**
522
  * result example:
523
  *
526
  * 'extendes' => 'PluginNameItemBase'
527
  * )
528
  */
529
+
530
  return $classes;
531
  }
532
  }
libs/factory/core/includes/class-factory-notices.php CHANGED
@@ -1,8 +1,8 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412;
4
 
5
- use Wbcr_Factory412_Plugin;
6
 
7
  // Exit if accessed directly
8
  if ( ! defined( 'ABSPATH' ) ) {
@@ -28,7 +28,7 @@ if ( ! defined( 'ABSPATH' ) ) {
28
  class Notices {
29
 
30
  /**
31
- * @var Wbcr_Factory412_Plugin
32
  */
33
  protected $plugin;
34
  /**
@@ -59,7 +59,7 @@ class Notices {
59
  /**
60
  * Инициализируем уведомлений сразу после загрузки модуля уведомлений
61
  *
62
- * @param Wbcr_Factory412_Plugin $plugin
63
  */
64
  public function __construct( $plugin ) {
65
  //default notices
@@ -86,7 +86,7 @@ class Notices {
86
  public function currentScreenAction() {
87
  $this->notices = apply_filters( 'wbcr_factory_notices_000_list', $this->notices, $this->plugin->getPluginName() );
88
 
89
- $this->notices = wbcr_factory_412_apply_filters_deprecated( 'wbcr_factory_admin_notices', array(
90
  $this->notices,
91
  $this->plugin->getPluginName()
92
  ), '4.0.5', 'wbcr_factory_notices_000_list' );
1
  <?php
2
 
3
+ namespace WBCR\Factory_414;
4
 
5
+ use Wbcr_Factory414_Plugin;
6
 
7
  // Exit if accessed directly
8
  if ( ! defined( 'ABSPATH' ) ) {
28
  class Notices {
29
 
30
  /**
31
+ * @var Wbcr_Factory414_Plugin
32
  */
33
  protected $plugin;
34
  /**
59
  /**
60
  * Инициализируем уведомлений сразу после загрузки модуля уведомлений
61
  *
62
+ * @param Wbcr_Factory414_Plugin $plugin
63
  */
64
  public function __construct( $plugin ) {
65
  //default notices
86
  public function currentScreenAction() {
87
  $this->notices = apply_filters( 'wbcr_factory_notices_000_list', $this->notices, $this->plugin->getPluginName() );
88
 
89
+ $this->notices = wbcr_factory_414_apply_filters_deprecated( 'wbcr_factory_admin_notices', array(
90
  $this->notices,
91
  $this->plugin->getPluginName()
92
  ), '4.0.5', 'wbcr_factory_notices_000_list' );
libs/factory/core/includes/class-factory-options.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412;
4
 
5
  // Exit if accessed directly
6
  use Exception;
1
  <?php
2
 
3
+ namespace WBCR\Factory_414;
4
 
5
  // Exit if accessed directly
6
  use Exception;
libs/factory/core/includes/class-factory-plugin-abstract.php CHANGED
@@ -14,31 +14,31 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  * @copyright (c) 2018 Webcraftic Ltd
15
  *
16
  */
17
- abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
18
 
19
  /**
20
- * Instance class Wbcr_Factory412_Request, required manages http requests
21
  *
22
- * @var Wbcr_Factory412_Request
23
  */
24
  public $request;
25
 
26
  /**
27
- * @var \WBCR\Factory_412\Premium\Provider
28
  */
29
  public $premium;
30
 
31
  /**
32
  * The Bootstrap Manager class
33
  *
34
- * @var Wbcr_FactoryBootstrap412_Manager
35
  */
36
  public $bootstrap;
37
 
38
  /**
39
  * The Bootstrap Manager class
40
  *
41
- * @var Wbcr_FactoryForms412_Manager
42
  */
43
  public $forms;
44
 
@@ -59,7 +59,7 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
59
  /**
60
  * Plugin components loaded
61
  *
62
- * @var array[] Wbcr_Factory412_Plugin
63
  */
64
  private $plugin_addons;
65
 
@@ -78,8 +78,8 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
78
 
79
  parent::__construct( $plugin_path, $data );
80
 
81
- $this->request = new Wbcr_Factory412_Request();
82
- //$this->route = new Wbcr_Factory412_Route();
83
 
84
  // INIT PLUGIN FRAMEWORK MODULES
85
  // Framework modules should always be loaded first,
@@ -108,16 +108,16 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
108
  /* -------------------------------------------------------------*/
109
 
110
  /**
111
- * @param Wbcr_FactoryBootstrap412_Manager $bootstrap
112
  */
113
- public function setBootstap( Wbcr_FactoryBootstrap412_Manager $bootstrap ) {
114
  $this->bootstrap = $bootstrap;
115
  }
116
 
117
  /**
118
- * @param Wbcr_FactoryForms412_Manager $forms
119
  */
120
- public function setForms( Wbcr_FactoryForms412_Manager $forms ) {
121
  $this->forms = $forms;
122
  }
123
 
@@ -160,11 +160,11 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
160
  throw new Exception( 'A class with this name {' . $class_name . '} does not exist.' );
161
  }
162
 
163
- if ( ! class_exists( 'Wbcr_FactoryPages412' ) ) {
164
- throw new Exception( 'The factory_pages_412 module is not included.' );
165
  }
166
 
167
- Wbcr_FactoryPages412::register( $this, $class_name );
168
  }
169
 
170
  /**
@@ -219,33 +219,59 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
219
  /**
220
  * @since 4.1.1 - change hook name
221
  */
222
- if ( apply_filters( "wbcr/factory_412/cancel_plugin_activation_{$this->plugin_name}", false ) ) {
223
  return;
224
  }
225
 
226
  /**
 
 
227
  * @since 4.1.1 - deprecated
228
  */
229
- wbcr_factory_412_do_action_deprecated( 'wbcr_factory_412_plugin_activation', [
230
  $this
231
  ], '4.1.1', "wbcr/factory/plugin_activation" );
232
 
233
  /**
234
- * @since 4.1.1 - added
 
 
235
  */
236
- do_action( 'wbcr/factory/plugin_activation', $this->plugin_name );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
 
238
  /**
 
 
239
  * @since 4.1.1 - deprecated
240
  */
241
- wbcr_factory_412_do_action_deprecated( 'wbcr_factory_412_plugin_activation_' . $this->plugin_name, [
242
  $this
243
- ], '4.1.1', "wbcr/factory/plugin_{$this->plugin_name}_activation" );
244
 
245
  /**
246
- * @since 4.1.1 - added
 
 
247
  */
248
- do_action( "wbcr/factory/plugin_{$this->plugin_name}_activation" );
249
 
250
  if ( ! empty( $this->activator_class ) ) {
251
  foreach ( (array) $this->activator_class as $activator_class ) {
@@ -253,6 +279,97 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
253
  $activator->activate();
254
  }
255
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  }
257
 
258
  /**
@@ -265,8 +382,8 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
265
  * @throws Exception
266
  */
267
  public function getPluginPageUrl( $page_id, $args = [] ) {
268
- if ( ! class_exists( 'Wbcr_FactoryPages412' ) ) {
269
- throw new Exception( 'The factory_pages_412 module is not included.' );
270
  }
271
 
272
  if ( ! is_admin() ) {
@@ -275,21 +392,12 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
275
  return null;
276
  }
277
 
278
- return Wbcr_FactoryPages412::getPageUrl( $this, $page_id, $args );
279
  }
280
 
281
 
282
  /**
283
  * Загружает аддоны для плагина, как часть проекта, а не как отдельный плагин
284
- *
285
- * @param array $addons - массив со списком загружаемых аддонов.
286
- * array(
287
- * 'hide_login_page' => - ключ, идентификатора массива с информацией об аддоне
288
- * array(
289
- * 'WHLP_Plugin', - имя основного класса аддона
290
- * WCL_PLUGIN_DIR . '/components/hide-login-page/hide-login-page.php' - пусть к
291
- * основному файлу аддона
292
- * ));
293
  */
294
  protected function loadAddons( $addons ) {
295
  if ( empty( $addons ) ) {
@@ -362,12 +470,12 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
362
  /**
363
  * @since 4.1.1 - deprecated
364
  */
365
- wbcr_factory_412_do_action_deprecated( 'wbcr_factory_412_core_modules_loaded-' . $this->plugin_name, [], '4.1.1', "wbcr/factory/plugin_activation" );
366
 
367
  /**
368
  * @since 4.1.1 - add
369
  */
370
- do_action( 'wbcr/factory_412/modules_loaded-' . $this->plugin_name );
371
  }
372
 
373
 
@@ -381,60 +489,13 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
381
  add_action( 'plugins_loaded', [ $this, 'set_text_domain' ] );
382
 
383
  if ( is_admin() ) {
384
- add_filter( 'wbcr_factory_412_core_admin_allow_multisite', '__return_true' );
385
 
386
  register_activation_hook( $this->get_paths()->main_file, [ $this, 'activation_hook' ] );
387
  register_deactivation_hook( $this->get_paths()->main_file, [ $this, 'deactivation_hook' ] );
388
  }
389
  }
390
 
391
- /**
392
- * It's invoked on plugin deactionvation. Don't excite it directly.
393
- *
394
- * @since 1.0.0
395
- * @return void
396
- */
397
- public function deactivation_hook() {
398
-
399
- /**
400
- * @since 4.1.1 - change hook name
401
- */
402
- if ( apply_filters( "wbcr/factory_412/cancel_plugin_deactivation_{$this->plugin_name}", false ) ) {
403
- return;
404
- }
405
-
406
- /**
407
- * @since 4.1.1 - deprecated
408
- */
409
- wbcr_factory_412_do_action_deprecated( 'wbcr_factory_412_plugin_deactivation', [
410
- $this
411
- ], '4.1.1', "wbcr/factory/plugin_deactivation" );
412
-
413
- /**
414
- * @since 4.1.1 - added
415
- */
416
- do_action( 'wbcr/factory/plugin_deactivation', $this->plugin_name );
417
-
418
- /**
419
- * @since 4.1.1 - deprecated
420
- */
421
- wbcr_factory_412_do_action_deprecated( 'wbcr_factory_412_plugin_deactivation_' . $this->plugin_name, [
422
- $this
423
- ], '4.1.1', "wbcr/factory/plugin_{$this->plugin_name}_deactivation" );
424
-
425
- /**
426
- * @since 4.1.1 - added
427
- */
428
- do_action( "wbcr/factory/plugin_{$this->plugin_name}_deactivation" );
429
-
430
- if ( ! empty( $this->activator_class ) ) {
431
- foreach ( (array) $this->activator_class as $activator_class ) {
432
- $activator = new $activator_class( $this );
433
- $activator->deactivate();
434
- }
435
- }
436
- }
437
-
438
  /**
439
  * Инициализируем миграции плагина
440
  *
@@ -443,7 +504,7 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
443
  * @throws Exception
444
  */
445
  protected function init_plugin_migrations() {
446
- new WBCR\Factory_412\Migrations( $this );
447
  }
448
 
449
  /**
@@ -453,7 +514,7 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
453
  * @return void
454
  */
455
  protected function init_plugin_notices() {
456
- new Wbcr\Factory_412\Notices( $this );
457
  }
458
 
459
  /**
@@ -468,7 +529,7 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
468
  */
469
  protected function init_plugin_updates() {
470
  if ( $this->has_updates ) {
471
- new WBCR\Factory_412\Updates\Upgrader( $this );
472
  }
473
  }
474
 
@@ -490,11 +551,11 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
490
  }
491
 
492
  // Создаем экземляр премиум менеджера, мы сможем к нему обращаться глобально.
493
- $this->premium = WBCR\Factory_412\Premium\Manager::instance( $this, $this->license_settings );
494
 
495
  // Подключаем премиум апгрейдер
496
  if ( isset( $this->license_settings['has_updates'] ) && $this->license_settings['has_updates'] ) {
497
- new WBCR\Factory_412\Updates\Premium_Upgrader( $this );
498
  }
499
  }
500
 
@@ -528,11 +589,11 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
528
  // ----------------------------------------------------------------------
529
 
530
  public function newScriptList() {
531
- return new Wbcr_Factory412_ScriptList( $this );
532
  }
533
 
534
  public function newStyleList() {
535
- return new Wbcr_Factory412_StyleList( $this );
536
  }
537
  }
538
 
14
  * @copyright (c) 2018 Webcraftic Ltd
15
  *
16
  */
17
+ abstract class Wbcr_Factory414_Plugin extends Wbcr_Factory414_Base {
18
 
19
  /**
20
+ * Instance class Wbcr_Factory414_Request, required manages http requests
21
  *
22
+ * @var Wbcr_Factory414_Request
23
  */
24
  public $request;
25
 
26
  /**
27
+ * @var \WBCR\Factory_414\Premium\Provider
28
  */
29
  public $premium;
30
 
31
  /**
32
  * The Bootstrap Manager class
33
  *
34
+ * @var Wbcr_FactoryBootstrap414_Manager
35
  */
36
  public $bootstrap;
37
 
38
  /**
39
  * The Bootstrap Manager class
40
  *
41
+ * @var Wbcr_FactoryForms414_Manager
42
  */
43
  public $forms;
44
 
59
  /**
60
  * Plugin components loaded
61
  *
62
+ * @var array[] Wbcr_Factory414_Plugin
63
  */
64
  private $plugin_addons;
65
 
78
 
79
  parent::__construct( $plugin_path, $data );
80
 
81
+ $this->request = new Wbcr_Factory414_Request();
82
+ //$this->route = new Wbcr_Factory414_Route();
83
 
84
  // INIT PLUGIN FRAMEWORK MODULES
85
  // Framework modules should always be loaded first,
108
  /* -------------------------------------------------------------*/
109
 
110
  /**
111
+ * @param Wbcr_FactoryBootstrap414_Manager $bootstrap
112
  */
113
+ public function setBootstap( Wbcr_FactoryBootstrap414_Manager $bootstrap ) {
114
  $this->bootstrap = $bootstrap;
115
  }
116
 
117
  /**
118
+ * @param Wbcr_FactoryForms414_Manager $forms
119
  */
120
+ public function setForms( Wbcr_FactoryForms414_Manager $forms ) {
121
  $this->forms = $forms;
122
  }
123
 
160
  throw new Exception( 'A class with this name {' . $class_name . '} does not exist.' );
161
  }
162
 
163
+ if ( ! class_exists( 'Wbcr_FactoryPages414' ) ) {
164
+ throw new Exception( 'The factory_pages_414 module is not included.' );
165
  }
166
 
167
+ Wbcr_FactoryPages414::register( $this, $class_name );
168
  }
169
 
170
  /**
219
  /**
220
  * @since 4.1.1 - change hook name
221
  */
222
+ if ( apply_filters( "wbcr/factory_414/cancel_plugin_activation_{$this->plugin_name}", false ) ) {
223
  return;
224
  }
225
 
226
  /**
227
+ * wbcr_factory_414_plugin_activation
228
+ *
229
  * @since 4.1.1 - deprecated
230
  */
231
+ wbcr_factory_414_do_action_deprecated( 'wbcr_factory_414_plugin_activation', [
232
  $this
233
  ], '4.1.1', "wbcr/factory/plugin_activation" );
234
 
235
  /**
236
+ * wbcr/factory/plugin_activation
237
+ *
238
+ * @since 4.1.2 - deprecated
239
  */
240
+ wbcr_factory_414_do_action_deprecated( 'wbcr/factory/plugin_activation', [
241
+ $this
242
+ ], '4.1.2', "wbcr/factory/before_plugin_activation" );
243
+
244
+ /**
245
+ * wbcr/factory/before_plugin_activation
246
+ *
247
+ * @since 4.1.2 - added
248
+ */
249
+ do_action( 'wbcr/factory/before_plugin_activation', $this );
250
+
251
+ /**
252
+ * # wbcr/factory/plugin_{$this->plugin_name}_activation
253
+ *
254
+ * @since 4.1.2 - deprecated
255
+ */
256
+ wbcr_factory_414_do_action_deprecated( "wbcr/factory/plugin_{$this->plugin_name}_activation", [
257
+ $this
258
+ ], '4.1.2', "wbcr/factory/before_plugin_{$this->plugin_name}_activation" );
259
 
260
  /**
261
+ * wbcr_factory_414_plugin_activation_' . $this->plugin_name
262
+ *
263
  * @since 4.1.1 - deprecated
264
  */
265
+ wbcr_factory_414_do_action_deprecated( 'wbcr_factory_414_plugin_activation_' . $this->plugin_name, [
266
  $this
267
+ ], '4.1.1', "wbcr/factory/before_plugin_{$this->plugin_name}_activation" );
268
 
269
  /**
270
+ * wbcr/factory/plugin_{$this->plugin_name}_activation
271
+ *
272
+ * @since 4.1.2 - added
273
  */
274
+ do_action( "wbcr/factory/plugin_{$this->plugin_name}_activation", $this );
275
 
276
  if ( ! empty( $this->activator_class ) ) {
277
  foreach ( (array) $this->activator_class as $activator_class ) {
279
  $activator->activate();
280
  }
281
  }
282
+
283
+ /**
284
+ * @since 4.1.2 - added
285
+ */
286
+ do_action( 'wbcr/factory/plugin_activated', $this );
287
+
288
+ /**
289
+ * @since 4.1.2 - added
290
+ */
291
+ do_action( "wbcr/factory/plugin_{$this->plugin_name}_activated", $this );
292
+ }
293
+
294
+ /**
295
+ * It's invoked on plugin deactionvation. Don't excite it directly.
296
+ *
297
+ * @since 1.0.0
298
+ * @return void
299
+ */
300
+ public function deactivation_hook() {
301
+
302
+ /**
303
+ * @since 4.1.1 - change hook name
304
+ */
305
+ if ( apply_filters( "wbcr/factory_414/cancel_plugin_deactivation_{$this->plugin_name}", false ) ) {
306
+ return;
307
+ }
308
+
309
+ /**
310
+ * wbcr_factory_414_plugin_deactivation
311
+ *
312
+ * @since 4.1.1 - deprecated
313
+ */
314
+ wbcr_factory_414_do_action_deprecated( 'wbcr_factory_414_plugin_deactivation', [
315
+ $this
316
+ ], '4.1.1', "wbcr/factory/plugin_deactivation" );
317
+
318
+ /**
319
+ * wbcr/factory/plugin_deactivation
320
+ *
321
+ * @since 4.1.2 - deprecated
322
+ */
323
+ wbcr_factory_414_do_action_deprecated( 'wbcr/factory/plugin_deactivation', [
324
+ $this
325
+ ], '4.1.2', "wbcr/factory/before_plugin_deactivation" );
326
+
327
+ /**
328
+ * wbcr/factory/plugin_deactivation
329
+ *
330
+ * @since 4.1.2 - added
331
+ */
332
+ do_action( 'wbcr/factory/plugin_deactivation', $this );
333
+
334
+ /**
335
+ * wbcr_factory_414_plugin_deactivation_ . $this->plugin_name
336
+ *
337
+ * @since 4.1.1 - deprecated
338
+ */
339
+ wbcr_factory_414_do_action_deprecated( 'wbcr_factory_414_plugin_deactivation_' . $this->plugin_name, [
340
+ $this
341
+ ], '4.1.1', "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation" );
342
+
343
+ /**
344
+ * wbcr/factory/plugin_{$this->plugin_name}_deactivation
345
+ *
346
+ * @since 4.1.2 - deprecated
347
+ */
348
+ wbcr_factory_414_do_action_deprecated( "wbcr/factory/plugin_{$this->plugin_name}_deactivation", [
349
+ $this
350
+ ], '4.1.2', "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation" );
351
+
352
+ /**
353
+ * @since 4.1.2 - added
354
+ */
355
+ do_action( "wbcr/factory/before_plugin_{$this->plugin_name}_deactivation" );
356
+
357
+ if ( ! empty( $this->activator_class ) ) {
358
+ foreach ( (array) $this->activator_class as $activator_class ) {
359
+ $activator = new $activator_class( $this );
360
+ $activator->deactivate();
361
+ }
362
+ }
363
+
364
+ /**
365
+ * @since 4.1.2 - added
366
+ */
367
+ do_action( 'wbcr/factory/plugin_deactivated', $this );
368
+
369
+ /**
370
+ * @since 4.1.2 - added
371
+ */
372
+ do_action( "wbcr/factory/plugin_{$this->plugin_name}_deactivated", $this );
373
  }
374
 
375
  /**
382
  * @throws Exception
383
  */
384
  public function getPluginPageUrl( $page_id, $args = [] ) {
385
+ if ( ! class_exists( 'Wbcr_FactoryPages414' ) ) {
386
+ throw new Exception( 'The factory_pages_414 module is not included.' );
387
  }
388
 
389
  if ( ! is_admin() ) {
392
  return null;
393
  }
394
 
395
+ return Wbcr_FactoryPages414::getPageUrl( $this, $page_id, $args );
396
  }
397
 
398
 
399
  /**
400
  * Загружает аддоны для плагина, как часть проекта, а не как отдельный плагин
 
 
 
 
 
 
 
 
 
401
  */
402
  protected function loadAddons( $addons ) {
403
  if ( empty( $addons ) ) {
470
  /**
471
  * @since 4.1.1 - deprecated
472
  */
473
+ wbcr_factory_414_do_action_deprecated( 'wbcr_factory_414_core_modules_loaded-' . $this->plugin_name, [], '4.1.1', "wbcr/factory_414/modules_loaded-" . $this->plugin_name );
474
 
475
  /**
476
  * @since 4.1.1 - add
477
  */
478
+ do_action( 'wbcr/factory_414/modules_loaded-' . $this->plugin_name );
479
  }
480
 
481
 
489
  add_action( 'plugins_loaded', [ $this, 'set_text_domain' ] );
490
 
491
  if ( is_admin() ) {
492
+ add_filter( 'wbcr_factory_414_core_admin_allow_multisite', '__return_true' );
493
 
494
  register_activation_hook( $this->get_paths()->main_file, [ $this, 'activation_hook' ] );
495
  register_deactivation_hook( $this->get_paths()->main_file, [ $this, 'deactivation_hook' ] );
496
  }
497
  }
498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
499
  /**
500
  * Инициализируем миграции плагина
501
  *
504
  * @throws Exception
505
  */
506
  protected function init_plugin_migrations() {
507
+ new WBCR\Factory_414\Migrations( $this );
508
  }
509
 
510
  /**
514
  * @return void
515
  */
516
  protected function init_plugin_notices() {
517
+ new Wbcr\Factory_414\Notices( $this );
518
  }
519
 
520
  /**
529
  */
530
  protected function init_plugin_updates() {
531
  if ( $this->has_updates ) {
532
+ new WBCR\Factory_414\Updates\Upgrader( $this );
533
  }
534
  }
535
 
551
  }
552
 
553
  // Создаем экземляр премиум менеджера, мы сможем к нему обращаться глобально.
554
+ $this->premium = WBCR\Factory_414\Premium\Manager::instance( $this, $this->license_settings );
555
 
556
  // Подключаем премиум апгрейдер
557
  if ( isset( $this->license_settings['has_updates'] ) && $this->license_settings['has_updates'] ) {
558
+ new WBCR\Factory_414\Updates\Premium_Upgrader( $this );
559
  }
560
  }
561
 
589
  // ----------------------------------------------------------------------
590
 
591
  public function newScriptList() {
592
+ return new Wbcr_Factory414_ScriptList( $this );
593
  }
594
 
595
  public function newStyleList() {
596
+ return new Wbcr_Factory414_StyleList( $this );
597
  }
598
  }
599
 
libs/factory/core/includes/class-factory-plugin-base.php CHANGED
@@ -12,9 +12,9 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  * @copyright (c) 2018 Webraftic Ltd
13
  * @since 4.0.8
14
  */
15
- class Wbcr_Factory412_Base {
16
 
17
- use WBCR\Factory_412\Options;
18
 
19
  /**
20
  * Namespace Prefix among Wordpress Options
@@ -121,19 +121,19 @@ class Wbcr_Factory412_Base {
121
  * }
122
  */
123
  protected $load_factory_modules = array(
124
- array( 'libs/factory/bootstrap', 'factory_bootstrap_412', 'admin' ),
125
- array( 'libs/factory/forms', 'factory_forms_412', 'admin' ),
126
- array( 'libs/factory/pages', 'factory_pages_412', 'admin' ),
127
  );
128
 
129
 
130
  /**
131
- * @var \WBCR\Factory_412\Entities\Support
132
  */
133
  protected $support;
134
 
135
  /**
136
- * @var \WBCR\Factory_412\Entities\Paths
137
  */
138
  protected $paths;
139
 
@@ -171,8 +171,8 @@ class Wbcr_Factory412_Base {
171
  throw new Exception( 'One of the required attributes has not been passed (prefix, plugin_title, plugin_name, plugin_version, plugin_text_domain).' );
172
  }
173
 
174
- $this->support = new \WBCR\Factory_412\Entities\Support( $this->support_details );
175
- $this->paths = new \WBCR\Factory_412\Entities\Paths( $plugin_file );
176
 
177
  // used only in the module 'updates'
178
  $this->plugin_slug = ! empty( $this->plugin_name ) ? $this->plugin_name : basename( $plugin_file );
@@ -328,14 +328,14 @@ class Wbcr_Factory412_Base {
328
  }
329
 
330
  /**
331
- * @return \WBCR\Factory_412\Entities\Support
332
  */
333
  public function get_support() {
334
  return $this->support;
335
  }
336
 
337
  /**
338
- * @return \WBCR\Factory_412\Entities\Paths
339
  */
340
  public function get_paths() {
341
  return $this->paths;
@@ -368,17 +368,14 @@ class Wbcr_Factory412_Base {
368
  if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
369
  require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
370
  }
371
-
372
  $activate = is_plugin_active_for_network( $this->get_paths()->basename );
373
-
374
  if ( ! $activate && $this->isNetworkAdmin() && isset( $_GET['action'] ) && $_GET['action'] == 'activate' ) {
375
- $is_activate_for_network = isset( $_GET['plugin_status'] ) && $_GET['plugin_status'] == 'all';
376
-
377
- if ( $is_activate_for_network ) {
378
- return true;
379
- }
380
  }
381
-
382
  return $activate;
383
  }
384
 
12
  * @copyright (c) 2018 Webraftic Ltd
13
  * @since 4.0.8
14
  */
15
+ class Wbcr_Factory414_Base {
16
 
17
+ use WBCR\Factory_414\Options;
18
 
19
  /**
20
  * Namespace Prefix among Wordpress Options
121
  * }
122
  */
123
  protected $load_factory_modules = array(
124
+ array( 'libs/factory/bootstrap', 'factory_bootstrap_414', 'admin' ),
125
+ array( 'libs/factory/forms', 'factory_forms_414', 'admin' ),
126
+ array( 'libs/factory/pages', 'factory_pages_414', 'admin' ),
127
  );
128
 
129
 
130
  /**
131
+ * @var \WBCR\Factory_414\Entities\Support
132
  */
133
  protected $support;
134
 
135
  /**
136
+ * @var \WBCR\Factory_414\Entities\Paths
137
  */
138
  protected $paths;
139
 
171
  throw new Exception( 'One of the required attributes has not been passed (prefix, plugin_title, plugin_name, plugin_version, plugin_text_domain).' );
172
  }
173
 
174
+ $this->support = new \WBCR\Factory_414\Entities\Support( $this->support_details );
175
+ $this->paths = new \WBCR\Factory_414\Entities\Paths( $plugin_file );
176
 
177
  // used only in the module 'updates'
178
  $this->plugin_slug = ! empty( $this->plugin_name ) ? $this->plugin_name : basename( $plugin_file );
328
  }
329
 
330
  /**
331
+ * @return \WBCR\Factory_414\Entities\Support
332
  */
333
  public function get_support() {
334
  return $this->support;
335
  }
336
 
337
  /**
338
+ * @return \WBCR\Factory_414\Entities\Paths
339
  */
340
  public function get_paths() {
341
  return $this->paths;
368
  if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
369
  require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
370
  }
371
+
372
  $activate = is_plugin_active_for_network( $this->get_paths()->basename );
373
+
374
  if ( ! $activate && $this->isNetworkAdmin() && isset( $_GET['action'] ) && $_GET['action'] == 'activate' ) {
375
+ return isset( $_GET['networkwide'] ) && 1 == (int)$_GET['networkwide'];
376
+
 
 
 
377
  }
378
+
379
  return $activate;
380
  }
381
 
libs/factory/core/includes/class-factory-requests.php CHANGED
@@ -4,7 +4,7 @@ if ( ! defined( 'ABSPATH' ) ) {
4
  exit;
5
  }
6
 
7
- class Wbcr_Factory412_Request {
8
 
9
  /**
10
  * @param null $param
4
  exit;
5
  }
6
 
7
+ class Wbcr_Factory414_Request {
8
 
9
  /**
10
  * @param null $param
libs/factory/core/includes/class-factory-requirements.php CHANGED
@@ -11,8 +11,8 @@
11
  * @since 4.0.9
12
  */
13
 
14
- if ( ! class_exists( 'Wbcr_Factory412_Requirements' ) ) {
15
- class Wbcr_Factory412_Requirements {
16
 
17
  /**
18
  * Factory framework version
@@ -107,7 +107,7 @@ if ( ! class_exists( 'Wbcr_Factory412_Requirements' ) ) {
107
  * @param string $plugin_file
108
  * @param array $plugin_info
109
  */
110
- function __construct( $plugin_file, array $plugin_info ) {
111
 
112
  foreach ( (array) $plugin_info as $property => $value ) {
113
  if ( property_exists( $this, $property ) ) {
@@ -239,7 +239,7 @@ if ( ! class_exists( 'Wbcr_Factory412_Requirements' ) ) {
239
  $notice_text = $notice_default_text = '';
240
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
241
 
242
- $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_208' ), $this->plugin_title ) . ' ';
243
  $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
244
 
245
  $has_one = false;
@@ -270,21 +270,21 @@ if ( ! class_exists( 'Wbcr_Factory412_Requirements' ) ) {
270
  * @return string
271
  */
272
  protected function get_php_incompat_text() {
273
- return sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_412' ), $this->required_php_version );
274
  }
275
 
276
  /**
277
  * @return string
278
  */
279
  protected function get_wp_incompat_text() {
280
- return sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_412' ), $this->required_wp_version );
281
  }
282
 
283
  /**
284
  * @return string
285
  */
286
  protected function get_plugin_already_activate_text() {
287
- return sprintf( __( 'Plugin %s is already activated, you are trying to activate it again.', 'wbcr_factory_412' ), $this->plugin_title );
288
  }
289
  }
290
  }
11
  * @since 4.0.9
12
  */
13
 
14
+ if ( ! class_exists( 'Wbcr_Factory414_Requirements' ) ) {
15
+ class Wbcr_Factory414_Requirements {
16
 
17
  /**
18
  * Factory framework version
107
  * @param string $plugin_file
108
  * @param array $plugin_info
109
  */
110
+ public function __construct( $plugin_file, array $plugin_info ) {
111
 
112
  foreach ( (array) $plugin_info as $property => $value ) {
113
  if ( property_exists( $this, $property ) ) {
239
  $notice_text = $notice_default_text = '';
240
  $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
241
 
242
+ $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_209' ), $this->plugin_title ) . ' ';
243
  $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
244
 
245
  $has_one = false;
270
  * @return string
271
  */
272
  protected function get_php_incompat_text() {
273
+ return sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_414' ), $this->required_php_version );
274
  }
275
 
276
  /**
277
  * @return string
278
  */
279
  protected function get_wp_incompat_text() {
280
+ return sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_414' ), $this->required_wp_version );
281
  }
282
 
283
  /**
284
  * @return string
285
  */
286
  protected function get_plugin_already_activate_text() {
287
+ return sprintf( __( 'Plugin %s is already activated, you are trying to activate it again.', 'wbcr_factory_414' ), $this->plugin_title );
288
  }
289
  }
290
  }
libs/factory/core/includes/entities/class-factory-paths.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\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_412\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
libs/factory/core/includes/functions.php CHANGED
@@ -46,7 +46,7 @@ if ( ! function_exists( 'get_user_locale' ) ) {
46
  *
47
  * @since 1.0.0
48
  *
49
- * @see wbcr_factory_412_deprecated_hook()
50
  *
51
  * @param string $tag The name of the filter hook.
52
  * @param array $args Array of additional function arguments to be passed to apply_filters().
@@ -56,14 +56,14 @@ if ( ! function_exists( 'get_user_locale' ) ) {
56
  *
57
  * @return mixed
58
  */
59
- function wbcr_factory_412_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_412_deprecated_hook( $tag, $version, $replacement, $message );
67
 
68
  return apply_filters_ref_array( $tag, $args );
69
  }
@@ -89,7 +89,7 @@ function wbcr_factory_412_apply_filters_deprecated( $tag, $args, $version, $repl
89
  *
90
  * @return void
91
  */
92
- function wbcr_factory_412_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_412_do_action_deprecated( $tag, $args, $version, $replacem
98
  if ( ! has_action( $tag ) ) {
99
  return;
100
  }
101
- wbcr_factory_412_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_412_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_412_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_412_deprecated_hook( $hook, $version, $replacement = null, $message = null ) {
127
  /**
128
  * Fires when a deprecated hook is called.
129
  *
46
  *
47
  * @since 1.0.0
48
  *
49
+ * @see wbcr_factory_414_deprecated_hook()
50
  *
51
  * @param string $tag The name of the filter hook.
52
  * @param array $args Array of additional function arguments to be passed to apply_filters().
56
  *
57
  * @return mixed
58
  */
59
+ function wbcr_factory_414_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_414_deprecated_hook( $tag, $version, $replacement, $message );
67
 
68
  return apply_filters_ref_array( $tag, $args );
69
  }
89
  *
90
  * @return void
91
  */
92
+ function wbcr_factory_414_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_414_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_414_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_414_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_412\Premium\Interfaces;
4
 
5
  // Exit if accessed directly
6
  if ( ! defined( 'ABSPATH' ) ) {
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\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_412\Premium;
4
 
5
  use Exception;
6
- use Wbcr_Factory412_Plugin;
7
 
8
  // Exit if accessed directly
9
  if ( ! defined( 'ABSPATH' ) ) {
@@ -19,12 +19,12 @@ if ( ! defined( 'ABSPATH' ) ) {
19
  class Manager {
20
 
21
  /**
22
- * @var Wbcr_Factory412_Plugin
23
  */
24
  protected $plugin;
25
 
26
  /**
27
- * @var \WBCR\Factory_412\Premium\Provider
28
  */
29
  protected $provider;
30
 
@@ -36,25 +36,25 @@ class Manager {
36
  /**
37
  * Manager constructor.
38
  *
39
- * @param Wbcr_Factory412_Plugin $plugin
40
  * @param array $settings
41
  *
42
  * @throws Exception
43
  */
44
- public function __construct( Wbcr_Factory412_Plugin $plugin, array $settings ) {
45
  $this->plugin = $plugin;
46
  $this->settings = $settings;
47
  //Plugin_Updates_Manager( $this->plugin, $this->updates['premium'], true );
48
  }
49
 
50
  /**
51
- * @param Wbcr_Factory412_Plugin $plugin
52
  * @param array $settings
53
  *
54
- * @return \WBCR\Factory_Freemius_101\Premium\Provider
55
  * @throws Exception
56
  */
57
- public static function instance( Wbcr_Factory412_Plugin $plugin, array $settings ) {
58
  $premium_manager = new Manager( $plugin, $settings );
59
 
60
  return $premium_manager->instance_provider();
@@ -63,14 +63,14 @@ class Manager {
63
  /**
64
  * @param $provider_name
65
  *
66
- * @return \WBCR\Factory_Freemius_101\Premium\Provider
67
  * @throws Exception
68
  */
69
  public function instance_provider() {
70
  $provider_name = $this->get_setting( 'provider' );
71
 
72
  if ( 'freemius' == $provider_name ) {
73
- return new \WBCR\Factory_Freemius_101\Premium\Provider( $this->plugin, $this->settings );
74
  } else if ( 'codecanyon' == $provider_name ) {
75
  //return new \WBCR\Factory_Codecanyon_000\Licensing\Provider( $this->plugin, $this->settings );
76
  throw new Exception( 'Codecanyon provider is not supported!' );
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\Premium;
4
 
5
  use Exception;
6
+ use Wbcr_Factory414_Plugin;
7
 
8
  // Exit if accessed directly
9
  if ( ! defined( 'ABSPATH' ) ) {
19
  class Manager {
20
 
21
  /**
22
+ * @var Wbcr_Factory414_Plugin
23
  */
24
  protected $plugin;
25
 
26
  /**
27
+ * @var \WBCR\Factory_414\Premium\Provider
28
  */
29
  protected $provider;
30
 
36
  /**
37
  * Manager constructor.
38
  *
39
+ * @param Wbcr_Factory414_Plugin $plugin
40
  * @param array $settings
41
  *
42
  * @throws Exception
43
  */
44
+ public function __construct( Wbcr_Factory414_Plugin $plugin, array $settings ) {
45
  $this->plugin = $plugin;
46
  $this->settings = $settings;
47
  //Plugin_Updates_Manager( $this->plugin, $this->updates['premium'], true );
48
  }
49
 
50
  /**
51
+ * @param Wbcr_Factory414_Plugin $plugin
52
  * @param array $settings
53
  *
54
+ * @return \WBCR\Factory_Freemius_103\Premium\Provider
55
  * @throws Exception
56
  */
57
+ public static function instance( Wbcr_Factory414_Plugin $plugin, array $settings ) {
58
  $premium_manager = new Manager( $plugin, $settings );
59
 
60
  return $premium_manager->instance_provider();
63
  /**
64
  * @param $provider_name
65
  *
66
+ * @return \WBCR\Factory_Freemius_103\Premium\Provider
67
  * @throws Exception
68
  */
69
  public function instance_provider() {
70
  $provider_name = $this->get_setting( 'provider' );
71
 
72
  if ( 'freemius' == $provider_name ) {
73
+ return new \WBCR\Factory_Freemius_103\Premium\Provider( $this->plugin, $this->settings );
74
  } else if ( 'codecanyon' == $provider_name ) {
75
  //return new \WBCR\Factory_Codecanyon_000\Licensing\Provider( $this->plugin, $this->settings );
76
  throw new Exception( 'Codecanyon provider is not supported!' );
libs/factory/core/includes/premium/class-factory-provider-abstract.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412\Premium;
4
 
5
  use Exception;
6
- use Wbcr_Factory412_Plugin;
7
 
8
  // Exit if accessed directly
9
  if ( ! defined( 'ABSPATH' ) ) {
@@ -21,7 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) {
21
  abstract class Provider {
22
 
23
  /**
24
- * @var Wbcr_Factory412_Plugin
25
  */
26
  protected $plugin;
27
 
@@ -38,10 +38,10 @@ abstract class Provider {
38
  /**
39
  * Provider constructor.
40
  *
41
- * @param Wbcr_Factory412_Plugin $plugin
42
  * @param array $settings
43
  */
44
- public function __construct( Wbcr_Factory412_Plugin $plugin, array $settings ) {
45
  $this->plugin = $plugin;
46
  $this->settings = $settings;
47
 
@@ -196,7 +196,7 @@ abstract class Provider {
196
  abstract public function get_billing_cycle();
197
 
198
  /**
199
- * @return \WBCR\Factory_412\Premium\Interfaces\License
200
  */
201
  abstract public function get_license();
202
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\Premium;
4
 
5
  use Exception;
6
+ use Wbcr_Factory414_Plugin;
7
 
8
  // Exit if accessed directly
9
  if ( ! defined( 'ABSPATH' ) ) {
21
  abstract class Provider {
22
 
23
  /**
24
+ * @var Wbcr_Factory414_Plugin
25
  */
26
  protected $plugin;
27
 
38
  /**
39
  * Provider constructor.
40
  *
41
+ * @param Wbcr_Factory414_Plugin $plugin
42
  * @param array $settings
43
  */
44
+ public function __construct( Wbcr_Factory414_Plugin $plugin, array $settings ) {
45
  $this->plugin = $plugin;
46
  $this->settings = $settings;
47
 
196
  abstract public function get_billing_cycle();
197
 
198
  /**
199
+ * @return \WBCR\Factory_414\Premium\Interfaces\License
200
  */
201
  abstract public function get_license();
202
 
libs/factory/core/includes/updates/class-factory-premium-upgrader.php CHANGED
@@ -1,12 +1,12 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412\Updates;
4
 
5
  use Exception;
6
  use Plugin_Installer_Skin;
7
  use Plugin_Upgrader;
8
- use Wbcr_Factory412_Plugin;
9
- use Wbcr_FactoryPages412_ImpressiveThemplate;
10
  use WP_Filesystem_Base;
11
  use WP_Upgrader;
12
  use WP_Upgrader_Skin;
@@ -33,7 +33,7 @@ class Premium_Upgrader extends Upgrader {
33
  /**
34
  * Manager constructor.
35
  *
36
- * @param Wbcr_Factory412_Plugin $plugin
37
  * @param $args
38
  * @param bool $is_premium
39
  *
@@ -41,7 +41,7 @@ class Premium_Upgrader extends Upgrader {
41
  * @since 4.1.1
42
  *
43
  */
44
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
45
  parent::__construct( $plugin );
46
 
47
  $this->plugin_basename = null;
@@ -100,7 +100,7 @@ class Premium_Upgrader extends Upgrader {
100
  }
101
 
102
  add_action( "admin_print_styles-plugins.php", array( $this, "print_styles_for_plugin_row" ) );
103
- add_action( "wbcr_factory_notices_000_list", array( $this, "admin_notices_hook" ) );
104
  add_action( 'wbcr/factory/pages/impressive/print_all_notices', array(
105
  $this,
106
  'install_notice_in_plugin_interface'
@@ -176,9 +176,9 @@ class Premium_Upgrader extends Upgrader {
176
  * @since 4.1.1
177
  *
178
  */
179
- public function admin_notices_hook( $notices ) {
180
-
181
- if ( ! current_user_can( 'update_plugins' ) ) {
182
  return $notices;
183
  }
184
 
@@ -221,8 +221,8 @@ class Premium_Upgrader extends Upgrader {
221
  /**
222
  * Выводит уведомление внутри интерфейса плагина, на всех страницах плагина.
223
  *
224
- * @param Wbcr_Factory412_Plugin $plugin
225
- * @param Wbcr_FactoryPages412_ImpressiveThemplate $obj
226
  *
227
  * @return void
228
  * @since 4.1.1
@@ -739,12 +739,12 @@ class Premium_Upgrader extends Upgrader {
739
  $cancel_license_url = $this->get_action_url( 'cancel_license' );
740
 
741
  $texts = array(
742
- 'need_activate_license' => __( 'License activation required. A license is required to get premium plugin updates, as well as to get additional services.', 'wbcr_factory_412' ),
743
- '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_412' ),
744
  'please_install_premium' => sprintf( __( 'Congratulations, you have activated a premium license! Please install premium add-on to use pro features now.
745
- <a href="%s">Install</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_412' ), $upgrade_url, $cancel_license_url ),
746
  'please_activate_premium' => sprintf( __( 'Congratulations, you have activated a premium license! Please activate premium add-on to use pro features now.
747
- <a href="%s">Activate</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_412' ), $activate_plugin_url, $cancel_license_url )
748
  );
749
 
750
  if ( isset( $texts[ $type ] ) ) {
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\Updates;
4
 
5
  use Exception;
6
  use Plugin_Installer_Skin;
7
  use Plugin_Upgrader;
8
+ use Wbcr_Factory414_Plugin;
9
+ use Wbcr_FactoryPages414_ImpressiveThemplate;
10
  use WP_Filesystem_Base;
11
  use WP_Upgrader;
12
  use WP_Upgrader_Skin;
33
  /**
34
  * Manager constructor.
35
  *
36
+ * @param Wbcr_Factory414_Plugin $plugin
37
  * @param $args
38
  * @param bool $is_premium
39
  *
41
  * @since 4.1.1
42
  *
43
  */
44
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
45
  parent::__construct( $plugin );
46
 
47
  $this->plugin_basename = null;
100
  }
101
 
102
  add_action( "admin_print_styles-plugins.php", array( $this, "print_styles_for_plugin_row" ) );
103
+ add_action( "wbcr_factory_notices_000_list", array( $this, "admin_notices_hook" ), 10, 2 );
104
  add_action( 'wbcr/factory/pages/impressive/print_all_notices', array(
105
  $this,
106
  'install_notice_in_plugin_interface'
176
  * @since 4.1.1
177
  *
178
  */
179
+ public function admin_notices_hook( $notices, $plugin_name ) {
180
+
181
+ if ( $plugin_name !== $this->plugin->getPluginName() || ! current_user_can( 'update_plugins' ) ) {
182
  return $notices;
183
  }
184
 
221
  /**
222
  * Выводит уведомление внутри интерфейса плагина, на всех страницах плагина.
223
  *
224
+ * @param Wbcr_Factory414_Plugin $plugin
225
+ * @param Wbcr_FactoryPages414_ImpressiveThemplate $obj
226
  *
227
  * @return void
228
  * @since 4.1.1
739
  $cancel_license_url = $this->get_action_url( 'cancel_license' );
740
 
741
  $texts = array(
742
+ 'need_activate_license' => __( 'License activation required. A license is required to get premium plugin updates, as well as to get additional services.', 'wbcr_factory_414' ),
743
+ '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_414' ),
744
  'please_install_premium' => sprintf( __( 'Congratulations, you have activated a premium license! Please install premium add-on to use pro features now.
745
+ <a href="%s">Install</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_414' ), $upgrade_url, $cancel_license_url ),
746
  'please_activate_premium' => sprintf( __( 'Congratulations, you have activated a premium license! Please activate premium add-on to use pro features now.
747
+ <a href="%s">Activate</a> premium add-on or <a href="%s">cancel</a> license.', 'wbcr_factory_414' ), $activate_plugin_url, $cancel_license_url )
748
  );
749
 
750
  if ( isset( $texts[ $type ] ) ) {
libs/factory/core/includes/updates/class-factory-upgrader.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412\Updates;
4
 
5
  use Exception;
6
  use stdClass;
7
- use Wbcr_Factory412_Plugin;
8
- use WBCR\Factory_Freemius_101\Updates\Freemius_Repository;
9
 
10
  // Exit if accessed directly
11
  if ( ! defined( 'ABSPATH' ) ) {
@@ -30,7 +30,7 @@ class Upgrader {
30
  protected $type = 'default';
31
 
32
  /**
33
- * @var Wbcr_Factory412_Plugin
34
  */
35
  protected $plugin;
36
 
@@ -78,13 +78,13 @@ class Upgrader {
78
  *
79
  * @since 4.1.1
80
  *
81
- * @param Wbcr_Factory412_Plugin $plugin
82
  * @param $args
83
  * @param bool $is_premium
84
  *
85
  * @throws Exception
86
  */
87
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
88
 
89
  $this->plugin = $plugin;
90
 
@@ -274,7 +274,7 @@ class Upgrader {
274
  return new Wordpress_Repository( $this->plugin );
275
  break;
276
  case 'freemius':
277
- if ( ! defined( 'FACTORY_FREEMIUS_101_LOADED' ) ) {
278
  throw new Exception( 'If you have to get updates from the Freemius repository, you need to install the freemius module.' );
279
  }
280
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\Updates;
4
 
5
  use Exception;
6
  use stdClass;
7
+ use Wbcr_Factory414_Plugin;
8
+ use WBCR\Factory_Freemius_103\Updates\Freemius_Repository;
9
 
10
  // Exit if accessed directly
11
  if ( ! defined( 'ABSPATH' ) ) {
30
  protected $type = 'default';
31
 
32
  /**
33
+ * @var Wbcr_Factory414_Plugin
34
  */
35
  protected $plugin;
36
 
78
  *
79
  * @since 4.1.1
80
  *
81
+ * @param Wbcr_Factory414_Plugin $plugin
82
  * @param $args
83
  * @param bool $is_premium
84
  *
85
  * @throws Exception
86
  */
87
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
88
 
89
  $this->plugin = $plugin;
90
 
274
  return new Wordpress_Repository( $this->plugin );
275
  break;
276
  case 'freemius':
277
+ if ( ! defined( 'FACTORY_FREEMIUS_103_LOADED' ) ) {
278
  throw new Exception( 'If you have to get updates from the Freemius repository, you need to install the freemius module.' );
279
  }
280
 
libs/factory/core/includes/updates/repositories/class-factory-repository-abstract.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_412\Updates;
4
 
5
  // Exit if accessed directly
6
- use Wbcr_Factory412_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
@@ -23,17 +23,17 @@ abstract class Repository {
23
  protected $initialized = false;
24
 
25
  /**
26
- * @var Wbcr_Factory412_Plugin
27
  */
28
  protected $plugin;
29
 
30
  /**
31
  * Repository constructor.
32
  *
33
- * @param Wbcr_Factory412_Plugin $plugin
34
  * @param bool $is_premium
35
  */
36
- abstract public function __construct( Wbcr_Factory412_Plugin $plugin );
37
 
38
  /**
39
  * @return void
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\Updates;
4
 
5
  // Exit if accessed directly
6
+ use Wbcr_Factory414_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
23
  protected $initialized = false;
24
 
25
  /**
26
+ * @var Wbcr_Factory414_Plugin
27
  */
28
  protected $plugin;
29
 
30
  /**
31
  * Repository constructor.
32
  *
33
+ * @param Wbcr_Factory414_Plugin $plugin
34
  * @param bool $is_premium
35
  */
36
+ abstract public function __construct( Wbcr_Factory414_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_412\Updates;
4
 
5
  // Exit if accessed directly
6
- use Wbcr_Factory412_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_Factory412_Plugin $plugin
24
  * @param bool $is_premium
25
  */
26
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
27
  $this->plugin = $plugin;
28
  }
29
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_414\Updates;
4
 
5
  // Exit if accessed directly
6
+ use Wbcr_Factory414_Plugin;
7
 
8
  if ( ! defined( 'ABSPATH' ) ) {
9
  exit;
20
  /**
21
  * Wordpress constructor.
22
  *
23
+ * @param Wbcr_Factory414_Plugin $plugin
24
  * @param bool $is_premium
25
  */
26
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
27
  $this->plugin = $plugin;
28
  }
29
 
libs/factory/core/langs/{wbcr_factory_412-ru_RU.mo → wbcr_factory_414-ru_RU.mo} RENAMED
File without changes
libs/factory/core/langs/{wbcr_factory_412-ru_RU.po → wbcr_factory_414-ru_RU.po} RENAMED
File without changes
libs/factory/forms/boot.php CHANGED
@@ -22,174 +22,174 @@
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_412_LOADED') ) {
26
  return;
27
  }
28
 
29
- define('FACTORY_FORMS_412_LOADED', true);
30
 
31
- define('FACTORY_FORMS_412_VERSION', '4.1.0');
32
 
33
  // absolute path and URL to the files and resources of the module.
34
- define('FACTORY_FORMS_412_DIR', dirname(__FILE__));
35
- define('FACTORY_FORMS_412_URL', plugins_url(null, __FILE__));
36
 
37
  #comp merge
38
- require_once(FACTORY_FORMS_412_DIR . '/includes/providers/value-provider.interface.php');
39
- require_once(FACTORY_FORMS_412_DIR . '/includes/providers/meta-value-provider.class.php');
40
- require_once(FACTORY_FORMS_412_DIR . '/includes/providers/options-value-provider.class.php');
41
 
42
- require_once(FACTORY_FORMS_412_DIR . '/includes/form.class.php');
43
  #endcomp
44
 
45
- load_plugin_textdomain('wbcr_factory_forms_412', 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
- * @see the 'wbcr_factory_forms_412_register_controls' hook
52
  *
53
  * @since 3.0.7
54
  */
55
- if( !function_exists('wbcr_factory_forms_412_register_default_controls') ) {
56
 
57
  /**
58
- * @param Wbcr_Factory412_Plugin $plugin
59
  * @throws Exception
60
  */
61
- function wbcr_factory_forms_412_register_default_controls(Wbcr_Factory412_Plugin $plugin)
62
  {
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_412_DIR . '/includes/html-builder.class.php');
69
- require_once(FACTORY_FORMS_412_DIR . '/includes/form-element.class.php');
70
- require_once(FACTORY_FORMS_412_DIR . '/includes/control.class.php');
71
- require_once(FACTORY_FORMS_412_DIR . '/includes/complex-control.class.php');
72
- require_once(FACTORY_FORMS_412_DIR . '/includes/holder.class.php');
73
- require_once(FACTORY_FORMS_412_DIR . '/includes/control-holder.class.php');
74
- require_once(FACTORY_FORMS_412_DIR . '/includes/custom-element.class.php');
75
- require_once(FACTORY_FORMS_412_DIR . '/includes/form-layout.class.php');
76
 
77
  // registration of controls
78
  $plugin->forms->registerControls(array(
79
  array(
80
  'type' => 'checkbox',
81
- 'class' => 'Wbcr_FactoryForms412_CheckboxControl',
82
- 'include' => FACTORY_FORMS_412_DIR . '/controls/checkbox.php'
83
  ),
84
  array(
85
  'type' => 'list',
86
- 'class' => 'Wbcr_FactoryForms412_ListControl',
87
- 'include' => FACTORY_FORMS_412_DIR . '/controls/list.php'
88
  ),
89
  array(
90
  'type' => 'dropdown',
91
- 'class' => 'Wbcr_FactoryForms412_DropdownControl',
92
- 'include' => FACTORY_FORMS_412_DIR . '/controls/dropdown.php'
93
  ),
94
  array(
95
  'type' => 'dropdown-and-colors',
96
- 'class' => 'Wbcr_FactoryForms412_DropdownAndColorsControl',
97
- 'include' => FACTORY_FORMS_412_DIR . '/controls/dropdown-and-colors.php'
98
  ),
99
  array(
100
  'type' => 'hidden',
101
- 'class' => 'Wbcr_FactoryForms412_HiddenControl',
102
- 'include' => FACTORY_FORMS_412_DIR . '/controls/hidden.php'
103
  ),
104
  array(
105
  'type' => 'hidden',
106
- 'class' => 'Wbcr_FactoryForms412_HiddenControl',
107
- 'include' => FACTORY_FORMS_412_DIR . '/controls/hidden.php'
108
  ),
109
  array(
110
  'type' => 'radio',
111
- 'class' => 'Wbcr_FactoryForms412_RadioControl',
112
- 'include' => FACTORY_FORMS_412_DIR . '/controls/radio.php'
113
  ),
114
  array(
115
  'type' => 'radio-colors',
116
- 'class' => 'Wbcr_FactoryForms412_RadioColorsControl',
117
- 'include' => FACTORY_FORMS_412_DIR . '/controls/radio-colors.php'
118
  ),
119
  array(
120
  'type' => 'textarea',
121
- 'class' => 'Wbcr_FactoryForms412_TextareaControl',
122
- 'include' => FACTORY_FORMS_412_DIR . '/controls/textarea.php'
123
  ),
124
  array(
125
  'type' => 'textbox',
126
- 'class' => 'Wbcr_FactoryForms412_TextboxControl',
127
- 'include' => FACTORY_FORMS_412_DIR . '/controls/textbox.php'
128
  ),
129
  array(
130
  'type' => 'multiple-textbox',
131
- 'class' => 'Wbcr_FactoryForms412_MultipleTextboxControl',
132
- 'include' => FACTORY_FORMS_412_DIR . '/controls/multiple-textbox.php'
133
  ),
134
  array(
135
  'type' => 'datetimepicker-range',
136
- 'class' => 'Wbcr_FactoryForms412_DatepickerRangeControl',
137
- 'include' => FACTORY_FORMS_412_DIR . '/controls/datepicker-range.php'
138
  ),
139
  array(
140
  'type' => 'url',
141
- 'class' => 'Wbcr_FactoryForms412_UrlControl',
142
- 'include' => FACTORY_FORMS_412_DIR . '/controls/url.php'
143
  ),
144
  array(
145
  'type' => 'wp-editor',
146
- 'class' => 'Wbcr_FactoryForms412_WpEditorControl',
147
- 'include' => FACTORY_FORMS_412_DIR . '/controls/wp-editor.php'
148
  ),
149
  array(
150
  'type' => 'color',
151
- 'class' => 'Wbcr_FactoryForms412_ColorControl',
152
- 'include' => FACTORY_FORMS_412_DIR . '/controls/color.php'
153
  ),
154
  array(
155
  'type' => 'color-and-opacity',
156
- 'class' => 'Wbcr_FactoryForms412_ColorAndOpacityControl',
157
- 'include' => FACTORY_FORMS_412_DIR . '/controls/color-and-opacity.php'
158
  ),
159
  array(
160
  'type' => 'gradient',
161
- 'class' => 'Wbcr_FactoryForms412_GradientControl',
162
- 'include' => FACTORY_FORMS_412_DIR . '/controls/gradient.php'
163
  ),
164
  array(
165
  'type' => 'font',
166
- 'class' => 'Wbcr_FactoryForms412_FontControl',
167
- 'include' => FACTORY_FORMS_412_DIR . '/controls/font.php'
168
  ),
169
  array(
170
  'type' => 'google-font',
171
- 'class' => 'Wbcr_FactoryForms412_GoogleFontControl',
172
- 'include' => FACTORY_FORMS_412_DIR . '/controls/google-font.php'
173
  ),
174
  array(
175
  'type' => 'pattern',
176
- 'class' => 'Wbcr_FactoryForms412_PatternControl',
177
- 'include' => FACTORY_FORMS_412_DIR . '/controls/pattern.php'
178
  ),
179
  array(
180
  'type' => 'integer',
181
- 'class' => 'Wbcr_FactoryForms412_IntegerControl',
182
- 'include' => FACTORY_FORMS_412_DIR . '/controls/integer.php'
183
  ),
184
  array(
185
  'type' => 'control-group',
186
- 'class' => 'Wbcr_FactoryForms412_ControlGroupHolder',
187
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/control-group.php'
188
  ),
189
  array(
190
  'type' => 'paddings-editor',
191
- 'class' => 'Wbcr_FactoryForms412_PaddingsEditorControl',
192
- 'include' => FACTORY_FORMS_412_DIR . '/controls/paddings-editor.php'
193
  ),
194
  ));
195
 
@@ -197,53 +197,53 @@
197
  $plugin->forms->registerHolders(array(
198
  array(
199
  'type' => 'tab',
200
- 'class' => 'Wbcr_FactoryForms412_TabHolder',
201
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/tab.php'
202
  ),
203
  array(
204
  'type' => 'tab-item',
205
- 'class' => 'Wbcr_FactoryForms412_TabItemHolder',
206
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/tab-item.php'
207
  ),
208
  array(
209
  'type' => 'accordion',
210
- 'class' => 'Wbcr_FactoryForms412_AccordionHolder',
211
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/accordion.php'
212
  ),
213
  array(
214
  'type' => 'accordion-item',
215
- 'class' => 'Wbcr_FactoryForms412_AccordionItemHolder',
216
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/accordion-item.php'
217
  ),
218
  array(
219
  'type' => 'control-group',
220
- 'class' => 'Wbcr_FactoryForms412_ControlGroupHolder',
221
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/control-group.php'
222
  ),
223
  array(
224
  'type' => 'control-group-item',
225
- 'class' => 'Wbcr_FactoryForms412_ControlGroupItem',
226
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/control-group-item.php'
227
  ),
228
  array(
229
  'type' => 'form-group',
230
- 'class' => 'Wbcr_FactoryForms412_FormGroupHolder',
231
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/form-group.php'
232
  ),
233
  array(
234
  'type' => 'more-link',
235
- 'class' => 'Wbcr_FactoryForms412_MoreLinkHolder',
236
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/more-link.php'
237
  ),
238
  array(
239
  'type' => 'div',
240
- 'class' => 'Wbcr_FactoryForms412_DivHolder',
241
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/div.php'
242
  ),
243
  array(
244
  'type' => 'columns',
245
- 'class' => 'Wbcr_FactoryForms412_ColumnsHolder',
246
- 'include' => FACTORY_FORMS_412_DIR . '/controls/holders/columns.php'
247
  )
248
  ));
249
 
@@ -251,23 +251,23 @@
251
  $plugin->forms->registerCustomElements(array(
252
  array(
253
  'type' => 'html',
254
- 'class' => 'Wbcr_FactoryForms412_Html',
255
- 'include' => FACTORY_FORMS_412_DIR . '/controls/customs/html.php',
256
  ),
257
  array(
258
  'type' => 'separator',
259
- 'class' => 'Wbcr_FactoryForms412_Separator',
260
- 'include' => FACTORY_FORMS_412_DIR . '/controls/customs/separator.php',
261
  ),
262
  ));
263
 
264
  // registration of form layouts
265
  $plugin->forms->registerFormLayout(array(
266
  'name' => 'bootstrap-3',
267
- 'class' => 'Wbcr_FactoryForms412_Bootstrap3FormLayout',
268
- 'include' => FACTORY_FORMS_412_DIR . '/layouts/bootstrap-3/bootstrap-3.php'
269
  ));
270
  }
271
 
272
- add_action('wbcr_factory_forms_412_register_controls', 'wbcr_factory_forms_412_register_default_controls');
273
  }
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_414_LOADED') ) {
26
  return;
27
  }
28
 
29
+ define('FACTORY_FORMS_414_LOADED', true);
30
 
31
+ define('FACTORY_FORMS_414_VERSION', '4.1.0');
32
 
33
  // absolute path and URL to the files and resources of the module.
34
+ define('FACTORY_FORMS_414_DIR', dirname(__FILE__));
35
+ define('FACTORY_FORMS_414_URL', plugins_url(null, __FILE__));
36
 
37
  #comp merge
38
+ require_once(FACTORY_FORMS_414_DIR . '/includes/providers/value-provider.interface.php');
39
+ require_once(FACTORY_FORMS_414_DIR . '/includes/providers/meta-value-provider.class.php');
40
+ require_once(FACTORY_FORMS_414_DIR . '/includes/providers/options-value-provider.class.php');
41
 
42
+ require_once(FACTORY_FORMS_414_DIR . '/includes/form.class.php');
43
  #endcomp
44
 
45
+ load_plugin_textdomain('wbcr_factory_forms_414', 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
+ * @see the 'wbcr_factory_forms_414_register_controls' hook
52
  *
53
  * @since 3.0.7
54
  */
55
+ if( !function_exists('wbcr_factory_forms_414_register_default_controls') ) {
56
 
57
  /**
58
+ * @param Wbcr_Factory414_Plugin $plugin
59
  * @throws Exception
60
  */
61
+ function wbcr_factory_forms_414_register_default_controls(Wbcr_Factory414_Plugin $plugin)
62
  {
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_414_DIR . '/includes/html-builder.class.php');
69
+ require_once(FACTORY_FORMS_414_DIR . '/includes/form-element.class.php');
70
+ require_once(FACTORY_FORMS_414_DIR . '/includes/control.class.php');
71
+ require_once(FACTORY_FORMS_414_DIR . '/includes/complex-control.class.php');
72
+ require_once(FACTORY_FORMS_414_DIR . '/includes/holder.class.php');
73
+ require_once(FACTORY_FORMS_414_DIR . '/includes/control-holder.class.php');
74
+ require_once(FACTORY_FORMS_414_DIR . '/includes/custom-element.class.php');
75
+ require_once(FACTORY_FORMS_414_DIR . '/includes/form-layout.class.php');
76
 
77
  // registration of controls
78
  $plugin->forms->registerControls(array(
79
  array(
80
  'type' => 'checkbox',
81
+ 'class' => 'Wbcr_FactoryForms414_CheckboxControl',
82
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/checkbox.php'
83
  ),
84
  array(
85
  'type' => 'list',
86
+ 'class' => 'Wbcr_FactoryForms414_ListControl',
87
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/list.php'
88
  ),
89
  array(
90
  'type' => 'dropdown',
91
+ 'class' => 'Wbcr_FactoryForms414_DropdownControl',
92
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/dropdown.php'
93
  ),
94
  array(
95
  'type' => 'dropdown-and-colors',
96
+ 'class' => 'Wbcr_FactoryForms414_DropdownAndColorsControl',
97
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/dropdown-and-colors.php'
98
  ),
99
  array(
100
  'type' => 'hidden',
101
+ 'class' => 'Wbcr_FactoryForms414_HiddenControl',
102
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/hidden.php'
103
  ),
104
  array(
105
  'type' => 'hidden',
106
+ 'class' => 'Wbcr_FactoryForms414_HiddenControl',
107
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/hidden.php'
108
  ),
109
  array(
110
  'type' => 'radio',
111
+ 'class' => 'Wbcr_FactoryForms414_RadioControl',
112
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/radio.php'
113
  ),
114
  array(
115
  'type' => 'radio-colors',
116
+ 'class' => 'Wbcr_FactoryForms414_RadioColorsControl',
117
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/radio-colors.php'
118
  ),
119
  array(
120
  'type' => 'textarea',
121
+ 'class' => 'Wbcr_FactoryForms414_TextareaControl',
122
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/textarea.php'
123
  ),
124
  array(
125
  'type' => 'textbox',
126
+ 'class' => 'Wbcr_FactoryForms414_TextboxControl',
127
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/textbox.php'
128
  ),
129
  array(
130
  'type' => 'multiple-textbox',
131
+ 'class' => 'Wbcr_FactoryForms414_MultipleTextboxControl',
132
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/multiple-textbox.php'
133
  ),
134
  array(
135
  'type' => 'datetimepicker-range',
136
+ 'class' => 'Wbcr_FactoryForms414_DatepickerRangeControl',
137
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/datepicker-range.php'
138
  ),
139
  array(
140
  'type' => 'url',
141
+ 'class' => 'Wbcr_FactoryForms414_UrlControl',
142
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/url.php'
143
  ),
144
  array(
145
  'type' => 'wp-editor',
146
+ 'class' => 'Wbcr_FactoryForms414_WpEditorControl',
147
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/wp-editor.php'
148
  ),
149
  array(
150
  'type' => 'color',
151
+ 'class' => 'Wbcr_FactoryForms414_ColorControl',
152
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/color.php'
153
  ),
154
  array(
155
  'type' => 'color-and-opacity',
156
+ 'class' => 'Wbcr_FactoryForms414_ColorAndOpacityControl',
157
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/color-and-opacity.php'
158
  ),
159
  array(
160
  'type' => 'gradient',
161
+ 'class' => 'Wbcr_FactoryForms414_GradientControl',
162
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/gradient.php'
163
  ),
164
  array(
165
  'type' => 'font',
166
+ 'class' => 'Wbcr_FactoryForms414_FontControl',
167
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/font.php'
168
  ),
169
  array(
170
  'type' => 'google-font',
171
+ 'class' => 'Wbcr_FactoryForms414_GoogleFontControl',
172
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/google-font.php'
173
  ),
174
  array(
175
  'type' => 'pattern',
176
+ 'class' => 'Wbcr_FactoryForms414_PatternControl',
177
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/pattern.php'
178
  ),
179
  array(
180
  'type' => 'integer',
181
+ 'class' => 'Wbcr_FactoryForms414_IntegerControl',
182
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/integer.php'
183
  ),
184
  array(
185
  'type' => 'control-group',
186
+ 'class' => 'Wbcr_FactoryForms414_ControlGroupHolder',
187
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/control-group.php'
188
  ),
189
  array(
190
  'type' => 'paddings-editor',
191
+ 'class' => 'Wbcr_FactoryForms414_PaddingsEditorControl',
192
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/paddings-editor.php'
193
  ),
194
  ));
195
 
197
  $plugin->forms->registerHolders(array(
198
  array(
199
  'type' => 'tab',
200
+ 'class' => 'Wbcr_FactoryForms414_TabHolder',
201
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/tab.php'
202
  ),
203
  array(
204
  'type' => 'tab-item',
205
+ 'class' => 'Wbcr_FactoryForms414_TabItemHolder',
206
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/tab-item.php'
207
  ),
208
  array(
209
  'type' => 'accordion',
210
+ 'class' => 'Wbcr_FactoryForms414_AccordionHolder',
211
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/accordion.php'
212
  ),
213
  array(
214
  'type' => 'accordion-item',
215
+ 'class' => 'Wbcr_FactoryForms414_AccordionItemHolder',
216
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/accordion-item.php'
217
  ),
218
  array(
219
  'type' => 'control-group',
220
+ 'class' => 'Wbcr_FactoryForms414_ControlGroupHolder',
221
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/control-group.php'
222
  ),
223
  array(
224
  'type' => 'control-group-item',
225
+ 'class' => 'Wbcr_FactoryForms414_ControlGroupItem',
226
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/control-group-item.php'
227
  ),
228
  array(
229
  'type' => 'form-group',
230
+ 'class' => 'Wbcr_FactoryForms414_FormGroupHolder',
231
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/form-group.php'
232
  ),
233
  array(
234
  'type' => 'more-link',
235
+ 'class' => 'Wbcr_FactoryForms414_MoreLinkHolder',
236
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/more-link.php'
237
  ),
238
  array(
239
  'type' => 'div',
240
+ 'class' => 'Wbcr_FactoryForms414_DivHolder',
241
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/div.php'
242
  ),
243
  array(
244
  'type' => 'columns',
245
+ 'class' => 'Wbcr_FactoryForms414_ColumnsHolder',
246
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/holders/columns.php'
247
  )
248
  ));
249
 
251
  $plugin->forms->registerCustomElements(array(
252
  array(
253
  'type' => 'html',
254
+ 'class' => 'Wbcr_FactoryForms414_Html',
255
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/customs/html.php',
256
  ),
257
  array(
258
  'type' => 'separator',
259
+ 'class' => 'Wbcr_FactoryForms414_Separator',
260
+ 'include' => FACTORY_FORMS_414_DIR . '/controls/customs/separator.php',
261
  ),
262
  ));
263
 
264
  // registration of form layouts
265
  $plugin->forms->registerFormLayout(array(
266
  'name' => 'bootstrap-3',
267
+ 'class' => 'Wbcr_FactoryForms414_Bootstrap3FormLayout',
268
+ 'include' => FACTORY_FORMS_414_DIR . '/layouts/bootstrap-3/bootstrap-3.php'
269
  ));
270
  }
271
 
272
+ add_action('wbcr_factory_forms_414_register_controls', 'wbcr_factory_forms_414_register_default_controls');
273
  }
libs/factory/forms/controls/checkbox.php CHANGED
@@ -20,9 +20,9 @@
20
  exit;
21
  }
22
 
23
- if( !class_exists('Wbcr_FactoryForms412_CheckboxControl') ) {
24
 
25
- class Wbcr_FactoryForms412_CheckboxControl extends Wbcr_FactoryForms412_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_412') ?></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_412') ?></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_FactoryForms414_CheckboxControl') ) {
24
 
25
+ class Wbcr_FactoryForms414_CheckboxControl extends Wbcr_FactoryForms414_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_414') ?></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_414') ?></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_FactoryForms412_ColorAndOpacityControl') ) {
24
  }
25
 
26
- class Wbcr_FactoryForms412_ColorAndOpacityControl extends Wbcr_FactoryForms412_ComplexControl {
27
 
28
  public $type = 'color-and-opacity';
29
 
@@ -57,8 +57,8 @@
57
  'way' => 'slider'
58
  ));
59
 
60
- $this->color = new Wbcr_FactoryForms412_ColorControl($options['color'], $form, $provider);
61
- $this->opacity = new Wbcr_FactoryForms412_IntegerControl($options['opacity'], $form, $provider);
62
 
63
  $this->innerControls = array($this->color, $this->opacity);
64
  }
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms414_ColorAndOpacityControl') ) {
24
  }
25
 
26
+ class Wbcr_FactoryForms414_ColorAndOpacityControl extends Wbcr_FactoryForms414_ComplexControl {
27
 
28
  public $type = 'color-and-opacity';
29
 
57
  'way' => 'slider'
58
  ));
59
 
60
+ $this->color = new Wbcr_FactoryForms414_ColorControl($options['color'], $form, $provider);
61
+ $this->opacity = new Wbcr_FactoryForms414_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_FactoryForms412_ColorControl') ) {
24
 
25
- class Wbcr_FactoryForms412_ColorControl extends Wbcr_FactoryForms412_Control {
26
 
27
  public $type = 'color';
28
 
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms414_ColorControl') ) {
24
 
25
+ class Wbcr_FactoryForms414_ColorControl extends Wbcr_FactoryForms414_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_FactoryForms412_Html') ) {
18
 
19
- class Wbcr_FactoryForms412_Html extends Wbcr_FactoryForms412_CustomElement {
20
 
21
  public $type = 'html';
22
 
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_Html') ) {
18
 
19
+ class Wbcr_FactoryForms414_Html extends Wbcr_FactoryForms414_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_FactoryForms412_Separator') ) {
18
- class Wbcr_FactoryForms412_Separator extends Wbcr_FactoryForms412_CustomElement {
19
 
20
  public $type = 'separator';
21
 
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_Separator') ) {
18
+ class Wbcr_FactoryForms414_Separator extends Wbcr_FactoryForms414_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_FactoryForms412_DatepickerRangeControl') ) {
33
 
34
- class Wbcr_FactoryForms412_DatepickerRangeControl extends Wbcr_FactoryForms412_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_FactoryForms412_TextboxControl($options['range_1'], $form, $provider);
69
- $this->range_2 = new Wbcr_FactoryForms412_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_FactoryForms414_DatepickerRangeControl') ) {
33
 
34
+ class Wbcr_FactoryForms414_DatepickerRangeControl extends Wbcr_FactoryForms414_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_FactoryForms414_TextboxControl($options['range_1'], $form, $provider);
69
+ $this->range_2 = new Wbcr_FactoryForms414_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 FactoryForms412_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 FactoryForms412_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_FactoryForms412_DropdownAndColorsControl') ) {
41
 
42
- class Wbcr_FactoryForms412_DropdownAndColorsControl extends Wbcr_FactoryForms412_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_FactoryForms412_DropdownControl($options['dropdown'], $form, $provider);
73
- $this->colors = new Wbcr_FactoryForms412_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 FactoryForms414_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 FactoryForms414_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_FactoryForms414_DropdownAndColorsControl') ) {
41
 
42
+ class Wbcr_FactoryForms414_DropdownAndColorsControl extends Wbcr_FactoryForms414_ComplexControl {
43
 
44
  public $type = 'dropdown-and-colors';
45
 
69
  'name' => $this->options['name'] . '__colors',
70
  ));
71
 
72
+ $this->dropdown = new Wbcr_FactoryForms414_DropdownControl($options['dropdown'], $form, $provider);
73
+ $this->colors = new Wbcr_FactoryForms414_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_FactoryForms412_DropdownControl' ) ) {
25
 
26
- class Wbcr_FactoryForms412_DropdownControl extends Wbcr_FactoryForms412_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_412' ) ) ?>'
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_412' ) );
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_412' );
353
 
354
  $data = isset( $item['data'] ) ? $item['data'] : null;
355
  } else {
21
  exit;
22
  }
23
 
24
+ if ( ! class_exists( 'Wbcr_FactoryForms414_DropdownControl' ) ) {
25
 
26
+ class Wbcr_FactoryForms414_DropdownControl extends Wbcr_FactoryForms414_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_414' ) ) ?>'
127
  };
128
  </script>
129
  <?php
268
  }
269
 
270
  $is_empty = $this->isAjax() || empty( $items );
271
+ $empty_list = $this->getOption( 'empty', __( '- empty -', 'wbcr_factory_forms_414' ) );
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_414' );
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_FactoryForms412_FontControl') ) {
24
 
25
- class Wbcr_FactoryForms412_FontControl extends Wbcr_FactoryForms412_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_FactoryForms412_IntegerControl($option_font_size, $form, $provider);
58
- $this->family = new Wbcr_FactoryForms412_DropdownControl($option_font_family, $form, $provider);
59
- $this->color = new Wbcr_FactoryForms412_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_412_fonts', $fonts);
70
- $fonts = apply_filters('wbcr_factory_forms_412_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_412')),
81
  array(
82
  'group',
83
- __('Sans Serif:', 'wbcr_factory_forms_412'),
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_412'),
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_412'),
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_FactoryForms414_FontControl') ) {
24
 
25
+ class Wbcr_FactoryForms414_FontControl extends Wbcr_FactoryForms414_ComplexControl {
26
 
27
  public $type = 'font';
28
 
54
  'pickerTarget' => '.factory-control-' . $this->options['name'] . ' .factory-picker-target'
55
  );
56
 
57
+ $this->size = new Wbcr_FactoryForms414_IntegerControl($option_font_size, $form, $provider);
58
+ $this->family = new Wbcr_FactoryForms414_DropdownControl($option_font_family, $form, $provider);
59
+ $this->color = new Wbcr_FactoryForms414_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_414_fonts', $fonts);
70
+ $fonts = apply_filters('wbcr_factory_forms_414_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_414')),
81
  array(
82
  'group',
83
+ __('Sans Serif:', 'wbcr_factory_forms_414'),
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_414'),
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_414'),
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_FactoryForms412_GoogleFontControl extends Wbcr_FactoryForms412_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_FactoryForms412_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_412'))
53
  );
54
 
55
  $fontsCommon = array(
56
  'group',
57
- __('Standard:', 'wbcr_factory_forms_412'),
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_412'), 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_412');
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_412');
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_412');
137
 
138
  return $body;
139
  }
15
  * @package core
16
  * @since 1.0.0
17
  */
18
+ class Wbcr_FactoryForms414_GoogleFontControl extends Wbcr_FactoryForms414_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_FactoryForms414_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_414'))
53
  );
54
 
55
  $fontsCommon = array(
56
  'group',
57
+ __('Standard:', 'wbcr_factory_forms_414'),
58
  array(
59
 
60
  array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
65
  )
66
  );
67
 
68
+ $fontsGoogleFonts = array('group', __('Google Fonts:', 'wbcr_factory_forms_414'), 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_414');
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_414');
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_414');
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_FactoryForms412_GradientControl') ) {
29
- class Wbcr_FactoryForms412_GradientControl extends Wbcr_FactoryForms412_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_412' ) ?>';
70
- factory.res.resHorizontal = '<?php _e( 'horizontal', 'wbcr_factory_forms_412' ) ?>';
71
  </script>
72
  <div <?php $this->attrs() ?>>
73
  <div class="factory-gradient-picker">
25
  exit;
26
  }
27
 
28
+ if( !class_exists('Wbcr_FactoryForms414_GradientControl') ) {
29
+ class Wbcr_FactoryForms414_GradientControl extends Wbcr_FactoryForms414_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_414' ) ?>';
70
+ factory.res.resHorizontal = '<?php _e( 'horizontal', 'wbcr_factory_forms_414' ) ?>';
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_FactoryForms412_HiddenControl') ) {
24
 
25
- class Wbcr_FactoryForms412_HiddenControl extends Wbcr_FactoryForms412_Control {
26
 
27
  public $type = 'hidden';
28
 
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms414_HiddenControl') ) {
24
 
25
+ class Wbcr_FactoryForms414_HiddenControl extends Wbcr_FactoryForms414_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_FactoryForms412_AccordionItemHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms412_AccordionItemHolder extends Wbcr_FactoryForms412_Holder {
25
 
26
  /**
27
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_AccordionItemHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms414_AccordionItemHolder extends Wbcr_FactoryForms414_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_FactoryForms412_AccordionHolder') ) {
17
  /**
18
  * Tab Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_FactoryForms412_AccordionHolder extends Wbcr_FactoryForms412_Holder {
23
 
24
  /**
25
  * A holder type.
13
  if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
+ if( !class_exists('Wbcr_FactoryForms414_AccordionHolder') ) {
17
  /**
18
  * Tab Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
+ class Wbcr_FactoryForms414_AccordionHolder extends Wbcr_FactoryForms414_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_FactoryForms412_ColumnsHolder') ) {
18
  /**
19
  * Columns Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms412_ColumnsHolder extends Wbcr_FactoryForms412_Holder {
24
 
25
  /**
26
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_ColumnsHolder') ) {
18
  /**
19
  * Columns Holder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms414_ColumnsHolder extends Wbcr_FactoryForms414_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_FactoryForms412_ControlGroupItem') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms412_ControlGroupItem extends Wbcr_FactoryForms412_Holder {
25
 
26
  /**
27
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_ControlGroupItem') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms414_ControlGroupItem extends Wbcr_FactoryForms414_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_FactoryForms412_ControlGroupHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms412_ControlGroupHolder extends Wbcr_FactoryForms412_ControlHolder {
25
 
26
  /**
27
  * A holder type.
@@ -61,7 +61,7 @@
61
  continue;
62
  }
63
 
64
- $builder = new Wbcr_FactoryForms412_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_FactoryForms414_ControlGroupHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms414_ControlGroupHolder extends Wbcr_FactoryForms414_ControlHolder {
25
 
26
  /**
27
  * A holder type.
61
  continue;
62
  }
63
 
64
+ $builder = new Wbcr_FactoryForms414_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_FactoryForms412_DivHolder') ) {
18
  /**
19
  * Div Control Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms412_DivHolder extends Wbcr_FactoryForms412_Holder {
24
 
25
  /**
26
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_DivHolder') ) {
18
  /**
19
  * Div Control Holder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms414_DivHolder extends Wbcr_FactoryForms414_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_FactoryForms412_FormGroupHolder') ) {
18
  /**
19
  * Group Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms412_FormGroupHolder extends Wbcr_FactoryForms412_Holder {
24
 
25
  /**
26
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_FormGroupHolder') ) {
18
  /**
19
  * Group Holder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms414_FormGroupHolder extends Wbcr_FactoryForms414_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_FactoryForms412_MoreLinkHolder') ) {
18
 
19
  /**
20
  * Collapsed Group Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms412_MoreLinkHolder extends Wbcr_FactoryForms412_Holder {
25
 
26
  /**
27
  * A holder type.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_MoreLinkHolder') ) {
18
 
19
  /**
20
  * Collapsed Group Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms414_MoreLinkHolder extends Wbcr_FactoryForms414_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_FactoryForms412_TabItemHolder') ) {
17
  /**
18
  * Tab Item Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_FactoryForms412_TabItemHolder extends Wbcr_FactoryForms412_Holder {
23
 
24
  /**
25
  * A holder type.
13
  exit;
14
  }
15
 
16
+ if( !class_exists('Wbcr_FactoryForms414_TabItemHolder') ) {
17
  /**
18
  * Tab Item Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
+ class Wbcr_FactoryForms414_TabItemHolder extends Wbcr_FactoryForms414_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_FactoryForms412_TabHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms412_TabHolder extends Wbcr_FactoryForms412_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 FactoryForms412_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_FactoryForms412_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_FactoryForms414_TabHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
+ class Wbcr_FactoryForms414_TabHolder extends Wbcr_FactoryForms414_Holder {
25
 
26
  /**
27
  * A holder type.
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
+ * @param FactoryForms414_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_FactoryForms414_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_FactoryForms412_IntegerControl') ) {
36
 
37
- class Wbcr_FactoryForms412_IntegerControl extends Wbcr_FactoryForms412_Control {
38
 
39
  public $type = 'integer';
40
 
32
  exit;
33
  }
34
 
35
+ if( !class_exists('Wbcr_FactoryForms414_IntegerControl') ) {
36
 
37
+ class Wbcr_FactoryForms414_IntegerControl extends Wbcr_FactoryForms414_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_FactoryForms412_ListControl') ) {
25
 
26
- class Wbcr_FactoryForms412_ListControl extends Wbcr_FactoryForms412_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_412') ) ?>'
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_412'));
140
 
141
  if( $is_empty ) {
142
  $this->addCssClass('factory-empty');
21
  exit;
22
  }
23
 
24
+ if( !class_exists('Wbcr_FactoryForms414_ListControl') ) {
25
 
26
+ class Wbcr_FactoryForms414_ListControl extends Wbcr_FactoryForms414_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_414') ) ?>'
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_414'));
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_FactoryForms412_MultipleTextboxControl') ) {
19
 
20
- class Wbcr_FactoryForms412_MultipleTextboxControl extends Wbcr_FactoryForms412_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_412') ?>
90
  </button>
91
  </div>
92
 
15
  exit;
16
  }
17
 
18
+ if( !class_exists('Wbcr_FactoryForms414_MultipleTextboxControl') ) {
19
 
20
+ class Wbcr_FactoryForms414_MultipleTextboxControl extends Wbcr_FactoryForms414_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_414') ?>
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_FactoryForms412_PaddingsEditorControl') ) {
18
 
19
- class Wbcr_FactoryForms412_PaddingsEditorControl extends Wbcr_FactoryForms412_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_412') ?>
71
  </label>
72
 
73
  <div class="factory-slider">
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_PaddingsEditorControl') ) {
18
 
19
+ class Wbcr_FactoryForms414_PaddingsEditorControl extends Wbcr_FactoryForms414_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_414') ?>
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_FactoryForms412_PatternControl') ) {
19
 
20
- class Wbcr_FactoryForms412_PatternControl extends Wbcr_FactoryForms412_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_412_patterns', array());
56
- $this->patterns = apply_filters('wbcr_factory_forms_412_patterns-' . $name, $this->patterns);
57
 
58
  $this->custom_patterns = $this->getOption('patterns', array());
59
 
60
- $this->color = new Wbcr_FactoryForms412_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_412') ?>">
106
  <i class="fa fa-flask"></i>
107
- <span><?php _e('re-color', 'wbcr_factory_forms_412') ?></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_412') ?></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_412') ?></i>
118
  </div>
119
  </div>
120
  <div class="factory-picker-target"></div>
15
  exit;
16
  }
17
 
18
+ if( !class_exists('Wbcr_FactoryForms414_PatternControl') ) {
19
 
20
+ class Wbcr_FactoryForms414_PatternControl extends Wbcr_FactoryForms414_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_414_patterns', array());
56
+ $this->patterns = apply_filters('wbcr_factory_forms_414_patterns-' . $name, $this->patterns);
57
 
58
  $this->custom_patterns = $this->getOption('patterns', array());
59
 
60
+ $this->color = new Wbcr_FactoryForms414_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_414') ?>">
106
  <i class="fa fa-flask"></i>
107
+ <span><?php _e('re-color', 'wbcr_factory_forms_414') ?></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_414') ?></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_414') ?></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_FactoryForms412_RadioColorsControl') ) {
31
 
32
- class Wbcr_FactoryForms412_RadioColorsControl extends Wbcr_FactoryForms412_Control {
33
 
34
  public $type = 'radio-color';
35
 
27
  exit;
28
  }
29
 
30
+ if( !class_exists('Wbcr_FactoryForms414_RadioColorsControl') ) {
31
 
32
+ class Wbcr_FactoryForms414_RadioColorsControl extends Wbcr_FactoryForms414_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_FactoryForms412_RadioControl') ) {
25
 
26
- class Wbcr_FactoryForms412_RadioControl extends Wbcr_FactoryForms412_Control {
27
 
28
  public $type = 'radio';
29
 
21
  exit;
22
  }
23
 
24
+ if( !class_exists('Wbcr_FactoryForms414_RadioControl') ) {
25
 
26
+ class Wbcr_FactoryForms414_RadioControl extends Wbcr_FactoryForms414_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_FactoryForms412_TextareaControl') ) {
24
 
25
- class Wbcr_FactoryForms412_TextareaControl extends Wbcr_FactoryForms412_Control {
26
 
27
  public $type = 'textarea';
28
 
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_FactoryForms414_TextareaControl') ) {
24
 
25
+ class Wbcr_FactoryForms414_TextareaControl extends Wbcr_FactoryForms414_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_FactoryForms412_TextboxControl') ) {
33
 
34
- class Wbcr_FactoryForms412_TextboxControl extends Wbcr_FactoryForms412_Control {
35
 
36
  public $type = 'textbox';
37
 
29
  exit;
30
  }
31
 
32
+ if( !class_exists('Wbcr_FactoryForms414_TextboxControl') ) {
33
 
34
+ class Wbcr_FactoryForms414_TextboxControl extends Wbcr_FactoryForms414_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 FactoryForms412_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_FactoryForms412_UrlControl') ) {
22
 
23
- class Wbcr_FactoryForms412_UrlControl extends Wbcr_FactoryForms412_TextboxControl {
24
 
25
  public $type = 'url';
26
 
4
  * Url Control
5
  *
6
  * Main options:
7
+ * @see FactoryForms414_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_FactoryForms414_UrlControl') ) {
22
 
23
+ class Wbcr_FactoryForms414_UrlControl extends Wbcr_FactoryForms414_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_FactoryForms412_WpEditorControl') ) {
26
 
27
- class Wbcr_FactoryForms412_WpEditorControl extends Wbcr_FactoryForms412_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_412_URL . '/assets/css/editor.css';
46
  }
47
  }
48
 
22
  exit;
23
  }
24
 
25
+ if( !class_exists('Wbcr_FactoryForms414_WpEditorControl') ) {
26
 
27
+ class Wbcr_FactoryForms414_WpEditorControl extends Wbcr_FactoryForms414_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_414_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_FactoryForms412_ComplexControl') ) {
17
  /**
18
  * The base class for all controls.
19
  *
20
  * @since 1.0.0
21
  */
22
- abstract class Wbcr_FactoryForms412_ComplexControl extends Wbcr_FactoryForms412_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_FactoryForms412_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_IFactoryForms412_ValueProvider $provider
45
  * @return void
46
  */
47
  public function setProvider($provider)
13
  if( !defined('ABSPATH') ) {
14
  exit;
15
  }
16
+ if( !class_exists('Wbcr_FactoryForms414_ComplexControl') ) {
17
  /**
18
  * The base class for all controls.
19
  *
20
  * @since 1.0.0
21
  */
22
+ abstract class Wbcr_FactoryForms414_ComplexControl extends Wbcr_FactoryForms414_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_FactoryForms414_Control[]
37
  */
38
  public $inner_controls = array();
39
 
41
  * Sets a provider for the control.
42
  *
43
  * @since 1.0.0
44
+ * @param Wbcr_IFactoryForms414_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_FactoryForms412_ControlHolder') ) {
18
  /**
19
  * The base class for control holders.
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_FactoryForms412_ControlHolder extends Wbcr_FactoryForms412_Control {
24
 
25
  /**
26
  * Holder Elements.
27
  *
28
  * @since 1.0.0
29
- * @var Wbcr_FactoryForms412_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_FactoryForms412_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_FactoryForms412_FormElement[].
64
  */
65
  public function getElements()
66
  {
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_ControlHolder') ) {
18
  /**
19
  * The base class for control holders.
20
  *
21
  * @since 1.0.0
22
  */
23
+ abstract class Wbcr_FactoryForms414_ControlHolder extends Wbcr_FactoryForms414_Control {
24
 
25
  /**
26
  * Holder Elements.
27
  *
28
  * @since 1.0.0
29
+ * @var Wbcr_FactoryForms414_Control[]
30
  */
31
  protected $elements = array();
32
 
43
  *
44
  * @since 1.0.0
45
  * @param mixed[] $options A holder options.
46
+ * @param Wbcr_FactoryForms414_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_FactoryForms414_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_FactoryForms412_Control') ) {
18
 
19
  /**
20
  * The base class for all controls.
21
  *
22
  * @since 1.0.0
23
  */
24
- abstract class Wbcr_FactoryForms412_Control extends Wbcr_FactoryForms412_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_IFactoryForms412_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 FactoryForms412_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 IFactoryForms412_ValueProvider $provider
70
  * @return void
71
  */
72
  public function setProvider($provider)
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_Control') ) {
18
 
19
  /**
20
  * The base class for all controls.
21
  *
22
  * @since 1.0.0
23
  */
24
+ abstract class Wbcr_FactoryForms414_Control extends Wbcr_FactoryForms414_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_IFactoryForms414_ValueProvider
47
  */
48
  protected $provider = null;
49
 
51
  * Create a new instance of the control.
52
  *
53
  * @param mixed[] $options
54
+ * @param FactoryForms414_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 IFactoryForms414_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_FactoryForms412_CustomElement') ) {
18
  /**
19
  * The base class for all controls.
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_FactoryForms412_CustomElement extends Wbcr_FactoryForms412_FormElement {
24
 
25
  /**
26
  * Is this element a custom form element?
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_CustomElement') ) {
18
  /**
19
  * The base class for all controls.
20
  *
21
  * @since 1.0.0
22
  */
23
+ abstract class Wbcr_FactoryForms414_CustomElement extends Wbcr_FactoryForms414_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_HtmlAttributeBuilder
41
  */
42
  private $html_builder;
43
 
@@ -53,7 +53,7 @@
53
  * A parent form.
54
  *
55
  * @since 1.0.0
56
- * @var Wbcr_FactoryForms412_Form
57
  */
58
  protected $form;
59
 
@@ -61,7 +61,7 @@
61
  * A form layout.
62
  *
63
  * @since 1.0.0
64
- * @var Wbcr_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms414_FormElement') ) {
18
 
19
  /**
20
  * The base class for all form element (controls, holders).
23
  *
24
  * @since 1.0.0
25
  */
26
+ abstract class Wbcr_FactoryForms414_FormElement {
27
 
28
  /**
29
  * A type of an elemnt.
37
  * An html attribute builder.
38
  *
39
  * @since 1.0.0
40
+ * @var Wbcr_FactoryForms414_HtmlAttributeBuilder
41
  */
42
  private $html_builder;
43
 
53
  * A parent form.
54
  *
55
  * @since 1.0.0
56
+ * @var Wbcr_FactoryForms414_Form
57
  */
58
  protected $form;
59
 
61
  * A form layout.
62
  *
63
  * @since 1.0.0
64
+ * @var Wbcr_FactoryForms414_FormLayout
65
  */
66
  protected $layout;
67
 
94
  *
95
  * @since 1.0.0
96
  * @param mixed[] $options A holder options.
97
+ * @param Wbcr_FactoryForms414_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_FactoryForms414_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_FactoryForms412_FormLayout') ) {
18
 
19
  /**
20
  * The base class for all form layouts.
21
  */
22
- abstract class Wbcr_FactoryForms412_FormLayout extends Wbcr_FactoryForms412_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_FactoryForms412_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-412-' . $this->type);
56
- $this->addCssClass('factory-forms-412-' . $this->name);
57
  }
58
 
59
  /**
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_FormLayout') ) {
18
 
19
  /**
20
  * The base class for all form layouts.
21
  */
22
+ abstract class Wbcr_FactoryForms414_FormLayout extends Wbcr_FactoryForms414_Holder {
23
 
24
  /**
25
  * A form layout name.
42
  *
43
  * @since 1.0.0
44
  * @param mixed[] $options A holder options.
45
+ * @param Wbcr_FactoryForms414_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-414-' . $this->type);
56
+ $this->addCssClass('factory-forms-414-' . $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_412_plugin_created', 'wbcr_factory_forms_412_plugin_created');
19
 
20
- function wbcr_factory_forms_412_plugin_created($plugin)
21
  {
22
- $plugin->forms = new Wbcr_FactoryForms412_Manager($plugin);
23
  }
24
 
25
- if( !class_exists('Wbcr_FactoryForms412_Manager') ) {
26
 
27
- class Wbcr_FactoryForms412_Manager {
28
 
29
  // ----------------------------------------------------
30
  // Static fields and methods
@@ -57,7 +57,7 @@
57
  /**
58
  * Registers a set of new controls.
59
  *
60
- * @see FactoryForms412_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 FactoryForms412_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 FactoryForms412_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_FactoryForms412_Form') ) {
184
  /**
185
  * An abstraction for forms.
186
  */
187
- class Wbcr_FactoryForms412_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_IFactoryForms412_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_FactoryForms412_FormLayout
249
  */
250
  public $layout;
251
 
@@ -261,20 +261,20 @@
261
  *
262
  * @since 1.0.0
263
  * @param array $options
264
- * @param Wbcr_Factory412_Plugin $plugin
265
  */
266
- public function __construct(array $options = array(), Wbcr_Factory412_Plugin $plugin)
267
  {
268
  // register controls once, when the first form is created
269
- if( !Wbcr_FactoryForms412_Manager::$controls_registered ) {
270
 
271
- do_action('wbcr_factory_forms_412_register_controls', $plugin);
272
 
273
  //if( !empty($plugin) ) {
274
- do_action('wbcr_factory_forms_412_register_controls_' . $plugin->getPluginName(), $plugin);
275
  //}
276
 
277
- Wbcr_FactoryForms412_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_FactoryForms412_Manager::$temper = 'flat';
293
  }
294
 
295
  /**
296
  * Sets a provider for the control.
297
  *
298
  * @since 1.0.0
299
- * @param Wbcr_IFactoryForms412_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_412_form_items', $this->items, $this->name);
336
  }
337
 
338
  /**
339
  * Returns form controls (control objects).
340
  *
341
  * @since 1.0.0
342
- * @return Wbcr_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_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_FactoryForms412_Manager::$registered_controls;
606
  } elseif( self::isControlHolder($type) ) {
607
- $haystack = Wbcr_FactoryForms412_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_FactoryForms412_Manager::$registered_controls[$item['type']]);
664
  }
665
 
666
  /**
@@ -672,7 +672,7 @@
672
  */
673
  public static function isControlHolder($item)
674
  {
675
- return isset(Wbcr_FactoryForms412_Manager::$registered_holders[$item['type']]);
676
  }
677
 
678
  /**
@@ -684,7 +684,7 @@
684
  */
685
  public static function isCustomElement($item)
686
  {
687
- return isset(Wbcr_FactoryForms412_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_414_plugin_created', 'wbcr_factory_forms_414_plugin_created');
19
 
20
+ function wbcr_factory_forms_414_plugin_created($plugin)
21
  {
22
+ $plugin->forms = new Wbcr_FactoryForms414_Manager($plugin);
23
  }
24
 
25
+ if( !class_exists('Wbcr_FactoryForms414_Manager') ) {
26
 
27
+ class Wbcr_FactoryForms414_Manager {
28
 
29
  // ----------------------------------------------------
30
  // Static fields and methods
57
  /**
58
  * Registers a set of new controls.
59
  *
60
+ * @see FactoryForms414_Form::registerControl()
61
  *
62
  * @since 1.0.0
63
  * @return void
95
  /**
96
  * Registers a set of new holder controls.
97
  *
98
+ * @see FactoryForms414_Form::registerHolder()
99
  *
100
  * @since 1.0.0
101
  * @return void
129
  /**
130
  * Registers a set of new custom form elements.
131
  *
132
+ * @see FactoryForms414_Form::registerCustomElement()
133
  *
134
  * @since 1.0.0
135
  * @return void
180
  public static $controls_registered = false;
181
  }
182
  }
183
+ if( !class_exists('Wbcr_FactoryForms414_Form') ) {
184
  /**
185
  * An abstraction for forms.
186
  */
187
+ class Wbcr_FactoryForms414_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_IFactoryForms414_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_FactoryForms414_FormLayout
249
  */
250
  public $layout;
251
 
261
  *
262
  * @since 1.0.0
263
  * @param array $options
264
+ * @param Wbcr_Factory414_Plugin $plugin
265
  */
266
+ public function __construct(array $options = array(), Wbcr_Factory414_Plugin $plugin)
267
  {
268
  // register controls once, when the first form is created
269
+ if( !Wbcr_FactoryForms414_Manager::$controls_registered ) {
270
 
271
+ do_action('wbcr_factory_forms_414_register_controls', $plugin);
272
 
273
  //if( !empty($plugin) ) {
274
+ do_action('wbcr_factory_forms_414_register_controls_' . $plugin->getPluginName(), $plugin);
275
  //}
276
 
277
+ Wbcr_FactoryForms414_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_FactoryForms414_Manager::$temper = 'flat';
293
  }
294
 
295
  /**
296
  * Sets a provider for the control.
297
  *
298
  * @since 1.0.0
299
+ * @param Wbcr_IFactoryForms414_ValueProvider $provider
300
  * @return void
301
  */
302
  public function setProvider($provider)
332
  */
333
  public function getItems()
334
  {
335
+ return apply_filters('wbcr_factory_414_form_items', $this->items, $this->name);
336
  }
337
 
338
  /**
339
  * Returns form controls (control objects).
340
  *
341
  * @since 1.0.0
342
+ * @return Wbcr_FactoryForms414_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_FactoryForms414_Control[]
359
  */
360
 
361
  public function createControls($holder = null)
395
  *
396
  * @since 1.0.0
397
  * @param array $item Item data.
398
+ * @return Wbcr_FactoryForms414_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_FactoryForms414_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_FactoryForms414_Control A control object.
437
  */
438
  public function createControl($item)
439
  {
441
 
442
  if( is_array($item) ) {
443
 
444
+ $control_data = Wbcr_FactoryForms414_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_FactoryForms414_Holder A control holder object.
469
  */
470
  public function createHolder($item)
471
  {
473
 
474
  if( is_array($item) ) {
475
 
476
+ $holderData = Wbcr_FactoryForms414_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_FactoryForms414_FormElement A custom form element object.
495
  */
496
  public function createCustomElement($item)
497
  {
499
 
500
  if( is_array($item) ) {
501
 
502
+ $data = Wbcr_FactoryForms414_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_FactoryForms414_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_FactoryForms414_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_FactoryForms414_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_FactoryForms414_Manager::$registered_controls;
606
  } elseif( self::isControlHolder($type) ) {
607
+ $haystack = Wbcr_FactoryForms414_Manager::$registered_holders;
608
  }
609
 
610
  if( isset($haystack[$type]) ) {
660
  */
661
  public static function isControl($item)
662
  {
663
+ return isset(Wbcr_FactoryForms414_Manager::$registered_controls[$item['type']]);
664
  }
665
 
666
  /**
672
  */
673
  public static function isControlHolder($item)
674
  {
675
+ return isset(Wbcr_FactoryForms414_Manager::$registered_holders[$item['type']]);
676
  }
677
 
678
  /**
684
  */
685
  public static function isCustomElement($item)
686
  {
687
+ return isset(Wbcr_FactoryForms414_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_FactoryForms412_Holder') ) {
18
 
19
  /**
20
  * The base class for control holders.
21
  *
22
  * @since 1.0.0
23
  */
24
- abstract class Wbcr_FactoryForms412_Holder extends Wbcr_FactoryForms412_FormElement {
25
 
26
  /**
27
  * Holder Elements.
28
  *
29
  * @since 1.0.0
30
- * @var Wbcr_FactoryForms412_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_FactoryForms412_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_FactoryForms412_Control[].
60
  */
61
  public function getElements()
62
  {
@@ -84,7 +84,7 @@
84
  $is_first_item = false;
85
  }
86
 
87
- do_action('wbcr_factory_412_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_FactoryForms414_Holder') ) {
18
 
19
  /**
20
  * The base class for control holders.
21
  *
22
  * @since 1.0.0
23
  */
24
+ abstract class Wbcr_FactoryForms414_Holder extends Wbcr_FactoryForms414_FormElement {
25
 
26
  /**
27
  * Holder Elements.
28
  *
29
  * @since 1.0.0
30
+ * @var Wbcr_FactoryForms414_Control[]
31
  */
32
  protected $elements = array();
33
 
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
+ * @param Wbcr_FactoryForms414_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_FactoryForms414_Control[].
60
  */
61
  public function getElements()
62
  {
84
  $is_first_item = false;
85
  }
86
 
87
+ do_action('wbcr_factory_414_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_FactoryForms412_HtmlAttributeBuilder') ) {
18
  /**
19
  * Html Attribute Builder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms412_HtmlAttributeBuilder {
24
 
25
  /**
26
  * An array to store css classes.
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_HtmlAttributeBuilder') ) {
18
  /**
19
  * Html Attribute Builder
20
  *
21
  * @since 1.0.0
22
  */
23
+ class Wbcr_FactoryForms414_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_FactoryForms412_OptionsValueProvider') ) {
18
 
19
  /**
20
  * Factory Meta Value Provider
@@ -24,7 +24,7 @@
24
  *
25
  * @since 1.0.0
26
  */
27
- class Wbcr_FactoryForms412_MetaValueProvider implements Wbcr_IFactoryForms412_ValueProvider {
28
 
29
 
30
  public $scope;
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_OptionsValueProvider') ) {
18
 
19
  /**
20
  * Factory Meta Value Provider
24
  *
25
  * @since 1.0.0
26
  */
27
+ class Wbcr_FactoryForms414_MetaValueProvider implements Wbcr_IFactoryForms414_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_FactoryForms412_OptionsValueProvider') ) {
17
 
18
  /**
19
  * Factory Options Value Provider
@@ -22,7 +22,7 @@
22
  *
23
  * @since 1.0.0
24
  */
25
- class Wbcr_FactoryForms412_OptionsValueProvider implements Wbcr_IFactoryForms412_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_Factory412_Plugin $plugin)
47
  {
48
  $this->plugin = $plugin;
49
  }
13
  exit;
14
  }
15
 
16
+ if( !class_exists('Wbcr_FactoryForms414_OptionsValueProvider') ) {
17
 
18
  /**
19
  * Factory Options Value Provider
22
  *
23
  * @since 1.0.0
24
  */
25
+ class Wbcr_FactoryForms414_OptionsValueProvider implements Wbcr_IFactoryForms414_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_Factory414_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_IFactoryForms412_ValueProvider') ) {
18
  /**
19
  * The interface for all value provides.
20
  *
21
  * @since 1.0.0
22
  */
23
- interface Wbcr_IFactoryForms412_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_IFactoryForms414_ValueProvider') ) {
18
  /**
19
  * The interface for all value provides.
20
  *
21
  * @since 1.0.0
22
  */
23
+ interface Wbcr_IFactoryForms414_ValueProvider {
24
 
25
  /**
26
  * Inits a form a provider to get data from a storage.
libs/factory/forms/langs/{wbcr_factory_forms_412-ru_RU.mo → wbcr_factory_forms_414-ru_RU.mo} RENAMED
File without changes
libs/factory/forms/langs/{wbcr_factory_forms_412-ru_RU.po → wbcr_factory_forms_414-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_FactoryForms412_Bootstrap3FormLayout') ) {
18
  /**
19
  * A form layout based on Twitter Bootstrap 3
20
  */
21
- class Wbcr_FactoryForms412_Bootstrap3FormLayout extends Wbcr_FactoryForms412_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_FactoryForms412_Form $form A parent form.
31
  */
32
  public function __construct($options, $form)
33
  {
@@ -68,7 +68,7 @@
68
  }
69
 
70
  /**
71
- * @param Wbcr_FactoryForms412_Control $control
72
  */
73
  public function beforeControl($control)
74
  {
@@ -116,7 +116,7 @@
116
  }
117
 
118
  /**
119
- * @param Wbcr_FactoryForms412_Control $control
120
  */
121
  public function afterControl($control)
122
  {
@@ -168,7 +168,7 @@
168
  }
169
 
170
  /**
171
- * @param Wbcr_FactoryForms412_Control $control
172
  * @param int $index
173
  * @param int $total
174
  */
@@ -193,7 +193,7 @@
193
  }
194
 
195
  /**
196
- * @param Wbcr_FactoryForms412_Control $control
197
  * @param int $index
198
  * @param int $total
199
  */
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryForms414_Bootstrap3FormLayout') ) {
18
  /**
19
  * A form layout based on Twitter Bootstrap 3
20
  */
21
+ class Wbcr_FactoryForms414_Bootstrap3FormLayout extends Wbcr_FactoryForms414_FormLayout {
22
 
23
  public $name = 'default';
24
 
27
  *
28
  * @since 1.0.0
29
  * @param array $options A holder options.
30
+ * @param Wbcr_FactoryForms414_Form $form A parent form.
31
  */
32
  public function __construct($options, $form)
33
  {
68
  }
69
 
70
  /**
71
+ * @param Wbcr_FactoryForms414_Control $control
72
  */
73
  public function beforeControl($control)
74
  {
116
  }
117
 
118
  /**
119
+ * @param Wbcr_FactoryForms414_Control $control
120
  */
121
  public function afterControl($control)
122
  {
168
  }
169
 
170
  /**
171
+ * @param Wbcr_FactoryForms414_Control $control
172
  * @param int $index
173
  * @param int $total
174
  */
193
  }
194
 
195
  /**
196
+ * @param Wbcr_FactoryForms414_Control $control
197
  * @param int $index
198
  * @param int $total
199
  */
libs/factory/freemius/boot.php CHANGED
@@ -14,29 +14,29 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( defined( 'FACTORY_FREEMIUS_101_LOADED' ) ) {
18
  return;
19
  }
20
 
21
- define( 'FACTORY_FREEMIUS_101_LOADED', true );
22
- define( 'FACTORY_FREEMIUS_101_DIR', dirname( __FILE__ ) );
23
- define( 'FACTORY_FREEMIUS_101_URL', plugins_url( null, __FILE__ ) );
24
 
25
  #comp merge
26
  // Freemius
27
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/entities/class-freemius-entity.php' );
28
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/entities/class-freemius-scope.php' );
29
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/entities/class-freemius-user.php' );
30
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/entities/class-freemius-site.php' );
31
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/entities/class-freemius-license.php' );
32
 
33
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/licensing/class-freemius-provider.php' );
34
 
35
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/updates/class-freemius-repository.php' );
36
 
37
  if ( ! class_exists( 'Freemius_Api_WordPress' ) ) {
38
- require_once FACTORY_FREEMIUS_101_DIR . '/includes/sdk/FreemiusWordPress.php';
39
  }
40
 
41
- require_once( FACTORY_FREEMIUS_101_DIR . '/includes/class-freemius-api.php' );
42
  #endcomp
14
  exit;
15
  }
16
 
17
+ if ( defined( 'FACTORY_FREEMIUS_103_LOADED' ) ) {
18
  return;
19
  }
20
 
21
+ define( 'FACTORY_FREEMIUS_103_LOADED', true );
22
+ define( 'FACTORY_FREEMIUS_103_DIR', dirname( __FILE__ ) );
23
+ define( 'FACTORY_FREEMIUS_103_URL', plugins_url( null, __FILE__ ) );
24
 
25
  #comp merge
26
  // Freemius
27
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/entities/class-freemius-entity.php' );
28
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/entities/class-freemius-scope.php' );
29
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/entities/class-freemius-user.php' );
30
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/entities/class-freemius-site.php' );
31
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/entities/class-freemius-license.php' );
32
 
33
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/licensing/class-freemius-provider.php' );
34
 
35
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/updates/class-freemius-repository.php' );
36
 
37
  if ( ! class_exists( 'Freemius_Api_WordPress' ) ) {
38
+ require_once FACTORY_FREEMIUS_103_DIR . '/includes/sdk/FreemiusWordPress.php';
39
  }
40
 
41
+ require_once( FACTORY_FREEMIUS_103_DIR . '/includes/class-freemius-api.php' );
42
  #endcomp
libs/factory/freemius/includes/class-freemius-api.php CHANGED
@@ -1,10 +1,10 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101;
4
 
5
  use Freemius_Api_WordPress;
6
  use Freemius_Exception;
7
- use Wbcr_Factory412_Plugin;
8
 
9
  if ( ! defined( 'ABSPATH' ) ) {
10
  exit;
@@ -33,7 +33,7 @@ final class Api {
33
  private $api;
34
 
35
  /**
36
- * @var Wbcr_Factory412_Plugin
37
  */
38
  private $plugin;
39
 
@@ -48,14 +48,14 @@ final class Api {
48
  private static $clock_diff;
49
 
50
  /**
51
- * @param Wbcr_Factory412_Plugin $slug
52
  * @param string $scope 'app', 'developer', 'user' or 'install'.
53
  * @param number $id Element's id.
54
  * @param string $public_key Public key.
55
  * @param bool|string $secret_key Element's secret key.
56
  * @param bool $is_sandbox
57
  */
58
- private function __construct( Wbcr_Factory412_Plugin $plugin, $scope, $id, $public_key, $secret_key, $is_sandbox ) {
59
  if ( ! class_exists( 'Freemius_Api_WordPress' ) ) {
60
  require_once WP_FS__DIR_SDK . '/FreemiusWordPress.php';
61
  }
@@ -73,7 +73,7 @@ final class Api {
73
  }
74
 
75
  /**
76
- * @param Wbcr_Factory412_Plugin $plugin
77
  * @param string $scope 'app', 'developer', 'user' or 'install'.
78
  * @param number $id Element's id.
79
  * @param string $public_key Public key.
@@ -82,7 +82,7 @@ final class Api {
82
  *
83
  * @return Api
84
  */
85
- public static function instance( Wbcr_Factory412_Plugin $plugin, $scope, $id, $public_key, $is_sandbox, $secret_key = false ) {
86
  $identifier = md5( $plugin->getPluginName() . $scope . $id . $public_key . ( is_string( $secret_key ) ? $secret_key : '' ) . json_encode( $is_sandbox ) );
87
 
88
  if ( ! isset( self::$instances[ $identifier ] ) ) {
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103;
4
 
5
  use Freemius_Api_WordPress;
6
  use Freemius_Exception;
7
+ use Wbcr_Factory414_Plugin;
8
 
9
  if ( ! defined( 'ABSPATH' ) ) {
10
  exit;
33
  private $api;
34
 
35
  /**
36
+ * @var Wbcr_Factory414_Plugin
37
  */
38
  private $plugin;
39
 
48
  private static $clock_diff;
49
 
50
  /**
51
+ * @param Wbcr_Factory414_Plugin $slug
52
  * @param string $scope 'app', 'developer', 'user' or 'install'.
53
  * @param number $id Element's id.
54
  * @param string $public_key Public key.
55
  * @param bool|string $secret_key Element's secret key.
56
  * @param bool $is_sandbox
57
  */
58
+ private function __construct( Wbcr_Factory414_Plugin $plugin, $scope, $id, $public_key, $secret_key, $is_sandbox ) {
59
  if ( ! class_exists( 'Freemius_Api_WordPress' ) ) {
60
  require_once WP_FS__DIR_SDK . '/FreemiusWordPress.php';
61
  }
73
  }
74
 
75
  /**
76
+ * @param Wbcr_Factory414_Plugin $plugin
77
  * @param string $scope 'app', 'developer', 'user' or 'install'.
78
  * @param number $id Element's id.
79
  * @param string $public_key Public key.
82
  *
83
  * @return Api
84
  */
85
+ public static function instance( Wbcr_Factory414_Plugin $plugin, $scope, $id, $public_key, $is_sandbox, $secret_key = false ) {
86
  $identifier = md5( $plugin->getPluginName() . $scope . $id . $public_key . ( is_string( $secret_key ) ? $secret_key : '' ) . json_encode( $is_sandbox ) );
87
 
88
  if ( ! isset( self::$instances[ $identifier ] ) ) {
libs/factory/freemius/includes/entities/class-freemius-entity.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Entities;
4
 
5
  use stdClass;
6
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Entities;
4
 
5
  use stdClass;
6
 
libs/factory/freemius/includes/entities/class-freemius-license.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Entities;
4
 
5
  use stdClass;
6
 
@@ -14,7 +14,7 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  * @copyright (c) 2018 Webraftic Ltd, Freemius, Inc.
15
  * @version 1.0
16
  */
17
- class License extends Entity implements \WBCR\Factory_412\Premium\Interfaces\License {
18
 
19
  /**
20
  * @var number
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Entities;
4
 
5
  use stdClass;
6
 
14
  * @copyright (c) 2018 Webraftic Ltd, Freemius, Inc.
15
  * @version 1.0
16
  */
17
+ class License extends Entity implements \WBCR\Factory_414\Premium\Interfaces\License {
18
 
19
  /**
20
  * @var number
libs/factory/freemius/includes/entities/class-freemius-plugin.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Entities;
4
 
5
  use stdClass;
6
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Entities;
4
 
5
  use stdClass;
6
 
libs/factory/freemius/includes/entities/class-freemius-scope.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Entities;
4
 
5
  use stdClass;
6
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Entities;
4
 
5
  use stdClass;
6
 
libs/factory/freemius/includes/entities/class-freemius-site.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Entities;
4
 
5
  use stdClass;
6
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Entities;
4
 
5
  use stdClass;
6
 
libs/factory/freemius/includes/entities/class-freemius-user.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Entities;
4
 
5
  if ( ! defined( 'ABSPATH' ) ) {
6
  exit;
libs/factory/freemius/includes/licensing/class-freemius-provider.php CHANGED
@@ -1,14 +1,14 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Premium;
4
-
5
- use WBCR\Factory_Freemius_101\Entities\License;
6
- use WBCR\Factory_Freemius_101\Entities\Plugin;
7
- use WBCR\Factory_Freemius_101\Entities\Site;
8
- use WBCR\Factory_Freemius_101\Entities\User;
9
- use WBCR\Factory_412\Premium\Provider as License_Provider;
10
- use Wbcr_Factory412_Plugin;
11
- use WBCR\Factory_Freemius_101\Api;
12
  use WP_Error;
13
  use Exception;
14
  use stdClass;
@@ -42,17 +42,17 @@ final class Provider extends License_Provider {
42
  private $slug;
43
 
44
  /**
45
- * @var \WBCR\Factory_Freemius_101\Api
46
  */
47
  private $site_api;
48
 
49
  /**
50
- * @var \WBCR\Factory_Freemius_101\Api
51
  */
52
  private $plugin_api;
53
 
54
  /**
55
- * @var \WBCR\Factory_Freemius_101\Api
56
  */
57
  private $user_api;
58
 
@@ -84,11 +84,11 @@ final class Provider extends License_Provider {
84
  /**
85
  * Manager constructor.
86
  *
87
- * @param Wbcr_Factory412_Plugin $plugin
88
  *
89
  * @throws Exception
90
  */
91
- public function __construct( Wbcr_Factory412_Plugin $plugin, array $settings ) {
92
  parent::__construct( $plugin, $settings );
93
 
94
  $this->plugin_id = $this->get_setting( 'plugin_id', null );
@@ -147,7 +147,7 @@ final class Provider extends License_Provider {
147
  }
148
 
149
  /**
150
- * @return \WBCR\Factory_Freemius_101\Entities\License|null
151
  * @throws Exception
152
  */
153
  public function get_license() {
@@ -193,7 +193,13 @@ final class Provider extends License_Provider {
193
  $latest = $this->get_api_site_scope( $this->license_site )->call( "/updates/latest.json" );
194
 
195
  if ( isset( $latest->error ) ) {
196
- throw new Exception( $latest->error );
 
 
 
 
 
 
197
  }
198
  } catch( \Freemius_Exception $e ) {
199
  throw new Exception( $e->getMessage(), $e->getCode() );
@@ -556,7 +562,7 @@ final class Provider extends License_Provider {
556
  /**
557
  * @param bool $flush
558
  *
559
- * @return \WBCR\Factory_Freemius_101\Api
560
  * @throws Exception
561
  */
562
  private function get_api_user_scope( User $user, $flush = false ) {
@@ -570,7 +576,7 @@ final class Provider extends License_Provider {
570
  /**
571
  * @param bool $flush
572
  *
573
- * @return \WBCR\Factory_Freemius_101\Api
574
  * @throws Exception
575
  */
576
  private function get_api_site_scope( Site $site, $flush = false ) {
@@ -584,7 +590,7 @@ final class Provider extends License_Provider {
584
  /**
585
  * Get plugin public API scope.
586
  *
587
- * @return \WBCR\Factory_Freemius_101\Api
588
  * @throws Exception
589
  */
590
  private function get_api_plugin_scope() {
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Premium;
4
+
5
+ use WBCR\Factory_Freemius_103\Entities\License;
6
+ use WBCR\Factory_Freemius_103\Entities\Plugin;
7
+ use WBCR\Factory_Freemius_103\Entities\Site;
8
+ use WBCR\Factory_Freemius_103\Entities\User;
9
+ use WBCR\Factory_414\Premium\Provider as License_Provider;
10
+ use Wbcr_Factory414_Plugin;
11
+ use WBCR\Factory_Freemius_103\Api;
12
  use WP_Error;
13
  use Exception;
14
  use stdClass;
42
  private $slug;
43
 
44
  /**
45
+ * @var \WBCR\Factory_Freemius_103\Api
46
  */
47
  private $site_api;
48
 
49
  /**
50
+ * @var \WBCR\Factory_Freemius_103\Api
51
  */
52
  private $plugin_api;
53
 
54
  /**
55
+ * @var \WBCR\Factory_Freemius_103\Api
56
  */
57
  private $user_api;
58
 
84
  /**
85
  * Manager constructor.
86
  *
87
+ * @param Wbcr_Factory414_Plugin $plugin
88
  *
89
  * @throws Exception
90
  */
91
+ public function __construct( Wbcr_Factory414_Plugin $plugin, array $settings ) {
92
  parent::__construct( $plugin, $settings );
93
 
94
  $this->plugin_id = $this->get_setting( 'plugin_id', null );
147
  }
148
 
149
  /**
150
+ * @return \WBCR\Factory_Freemius_103\Entities\License|null
151
  * @throws Exception
152
  */
153
  public function get_license() {
193
  $latest = $this->get_api_site_scope( $this->license_site )->call( "/updates/latest.json" );
194
 
195
  if ( isset( $latest->error ) ) {
196
+ $error = $latest->error;
197
+
198
+ if ( is_object( $error ) || is_array( $error ) ) {
199
+ $error = var_export( $error, true );
200
+ }
201
+
202
+ throw new Exception( "Freemius API ERROR:" . $error );
203
  }
204
  } catch( \Freemius_Exception $e ) {
205
  throw new Exception( $e->getMessage(), $e->getCode() );
562
  /**
563
  * @param bool $flush
564
  *
565
+ * @return \WBCR\Factory_Freemius_103\Api
566
  * @throws Exception
567
  */
568
  private function get_api_user_scope( User $user, $flush = false ) {
576
  /**
577
  * @param bool $flush
578
  *
579
+ * @return \WBCR\Factory_Freemius_103\Api
580
  * @throws Exception
581
  */
582
  private function get_api_site_scope( Site $site, $flush = false ) {
590
  /**
591
  * Get plugin public API scope.
592
  *
593
+ * @return \WBCR\Factory_Freemius_103\Api
594
  * @throws Exception
595
  */
596
  private function get_api_plugin_scope() {
libs/factory/freemius/includes/updates/class-freemius-repository.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php
2
 
3
- namespace WBCR\Factory_Freemius_101\Updates;
4
 
5
  // Exit if accessed directly
6
  use Exception;
7
- use Wbcr_Factory412_Plugin;
8
- use WBCR\Factory_412\Updates\Repository;
9
 
10
  if ( ! defined( 'ABSPATH' ) ) {
11
  exit;
@@ -20,7 +20,7 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  class Freemius_Repository extends Repository {
21
 
22
  /**
23
- * @var \WBCR\Factory_Freemius_101\Premium\Provider
24
  */
25
  private $premium;
26
 
@@ -28,11 +28,11 @@ class Freemius_Repository extends Repository {
28
  * Freemius constructor.
29
  * @since 4.0.0
30
  *
31
- * @param Wbcr_Factory412_Plugin $plugin
32
  *
33
  * @throws Exception
34
  */
35
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
36
  $this->plugin = $plugin;
37
  $this->premium = $this->plugin->premium;
38
  }
@@ -41,7 +41,7 @@ class Freemius_Repository extends Repository {
41
  * @throws Exception
42
  */
43
  public function init() {
44
- if ( ! $this->premium instanceof \WBCR\Factory_Freemius_101\Premium\Provider ) {
45
  throw new Exception( "This repository type requires Freemius premium provider." );
46
  }
47
 
1
  <?php
2
 
3
+ namespace WBCR\Factory_Freemius_103\Updates;
4
 
5
  // Exit if accessed directly
6
  use Exception;
7
+ use Wbcr_Factory414_Plugin;
8
+ use WBCR\Factory_414\Updates\Repository;
9
 
10
  if ( ! defined( 'ABSPATH' ) ) {
11
  exit;
20
  class Freemius_Repository extends Repository {
21
 
22
  /**
23
+ * @var \WBCR\Factory_Freemius_103\Premium\Provider
24
  */
25
  private $premium;
26
 
28
  * Freemius constructor.
29
  * @since 4.0.0
30
  *
31
+ * @param Wbcr_Factory414_Plugin $plugin
32
  *
33
  * @throws Exception
34
  */
35
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
36
  $this->plugin = $plugin;
37
  $this->premium = $this->plugin->premium;
38
  }
41
  * @throws Exception
42
  */
43
  public function init() {
44
+ if ( ! $this->premium instanceof \WBCR\Factory_Freemius_103\Premium\Provider ) {
45
  throw new Exception( "This repository type requires Freemius premium provider." );
46
  }
47
 
libs/factory/pages/boot.php CHANGED
@@ -19,25 +19,25 @@
19
  return;
20
  }
21
 
22
- if( defined('FACTORY_PAGES_412_LOADED') ) {
23
  return;
24
  }
25
 
26
- define('FACTORY_PAGES_412_LOADED', true);
27
 
28
- define('FACTORY_PAGES_412_VERSION', '4.1.0');
29
 
30
- define('FACTORY_PAGES_412_DIR', dirname(__FILE__));
31
- define('FACTORY_PAGES_412_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_412', false, dirname(plugin_basename(__FILE__)) . '/langs');
38
 
39
- require(FACTORY_PAGES_412_DIR . '/pages.php');
40
- require(FACTORY_PAGES_412_DIR . '/includes/page.class.php');
41
- require(FACTORY_PAGES_412_DIR . '/includes/admin-page.class.php');
42
- require(FACTORY_PAGES_412_DIR . '/templates/impressive-page.class.php');
43
 
19
  return;
20
  }
21
 
22
+ if( defined('FACTORY_PAGES_414_LOADED') ) {
23
  return;
24
  }
25
 
26
+ define('FACTORY_PAGES_414_LOADED', true);
27
 
28
+ define('FACTORY_PAGES_414_VERSION', '4.1.0');
29
 
30
+ define('FACTORY_PAGES_414_DIR', dirname(__FILE__));
31
+ define('FACTORY_PAGES_414_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_414', false, dirname(plugin_basename(__FILE__)) . '/langs');
38
 
39
+ require(FACTORY_PAGES_414_DIR . '/pages.php');
40
+ require(FACTORY_PAGES_414_DIR . '/includes/page.class.php');
41
+ require(FACTORY_PAGES_414_DIR . '/includes/admin-page.class.php');
42
+ require(FACTORY_PAGES_414_DIR . '/templates/impressive-page.class.php');
43
 
libs/factory/pages/includes/admin-page.class.php CHANGED
@@ -14,9 +14,9 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  exit;
15
  }
16
 
17
- if ( ! class_exists( 'Wbcr_FactoryPages412_AdminPage' ) ) {
18
 
19
- class Wbcr_FactoryPages412_AdminPage extends Wbcr_FactoryPages412_Page {
20
 
21
  /**
22
  * Visible page title.
@@ -120,7 +120,7 @@ if ( ! class_exists( 'Wbcr_FactoryPages412_AdminPage' ) ) {
120
  */
121
  public $add_link_to_plugin_actions = false;
122
 
123
- public function __construct( Wbcr_Factory412_Plugin $plugin ) {
124
  parent::__construct( $plugin );
125
  $this->configure();
126
 
@@ -227,13 +227,13 @@ if ( ! class_exists( 'Wbcr_FactoryPages412_AdminPage' ) ) {
227
  public function connect() {
228
  $result_id = $this->getResultId();
229
 
230
- $this->hidden = apply_filters( 'wbcr_factory_412_page_is_hidden_' . $result_id, $this->hidden );
231
 
232
  if ( $this->hidden ) {
233
  return;
234
  }
235
 
236
- $this->internal = apply_filters( 'wbcr_factory_412_page_is_internal_' . $result_id, $this->internal );
237
 
238
  if ( $this->internal ) {
239
  $this->menu_target = null;
@@ -272,7 +272,7 @@ if ( ! class_exists( 'Wbcr_FactoryPages412_AdminPage' ) ) {
272
  $this->assets( $this->scripts, $this->styles );
273
 
274
  if ( ! $this->scripts->isEmpty( 'bootstrap' ) || ! $this->styles->isEmpty( 'bootstrap' ) ) {
275
- add_action( 'wbcr_factory_412_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), array(
276
  $this,
277
  'actionAdminBootstrapScripts'
278
  ) );
14
  exit;
15
  }
16
 
17
+ if ( ! class_exists( 'Wbcr_FactoryPages414_AdminPage' ) ) {
18
 
19
+ class Wbcr_FactoryPages414_AdminPage extends Wbcr_FactoryPages414_Page {
20
 
21
  /**
22
  * Visible page title.
120
  */
121
  public $add_link_to_plugin_actions = false;
122
 
123
+ public function __construct( Wbcr_Factory414_Plugin $plugin ) {
124
  parent::__construct( $plugin );
125
  $this->configure();
126
 
227
  public function connect() {
228
  $result_id = $this->getResultId();
229
 
230
+ $this->hidden = apply_filters( 'wbcr_factory_414_page_is_hidden_' . $result_id, $this->hidden );
231
 
232
  if ( $this->hidden ) {
233
  return;
234
  }
235
 
236
+ $this->internal = apply_filters( 'wbcr_factory_414_page_is_internal_' . $result_id, $this->internal );
237
 
238
  if ( $this->internal ) {
239
  $this->menu_target = null;
272
  $this->assets( $this->scripts, $this->styles );
273
 
274
  if ( ! $this->scripts->isEmpty( 'bootstrap' ) || ! $this->styles->isEmpty( 'bootstrap' ) ) {
275
+ add_action( 'wbcr_factory_414_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), array(
276
  $this,
277
  'actionAdminBootstrapScripts'
278
  ) );
libs/factory/pages/includes/page.class.php CHANGED
@@ -14,9 +14,9 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryPages412_Page') ) {
18
 
19
- class Wbcr_FactoryPages412_Page {
20
 
21
  /**
22
  * Page id used to call.
@@ -26,7 +26,7 @@
26
 
27
  /**
28
  * Current Factory Plugin.
29
- * @var Wbcr_Factory412_Plugin
30
  */
31
  public $plugin;
32
 
@@ -38,10 +38,10 @@
38
  //private $default_actions = array();
39
 
40
  /**
41
- * @param Wbcr_Factory412_Plugin $plugin
42
  * @throws Exception
43
  */
44
- public function __construct(Wbcr_Factory412_Plugin $plugin)
45
  {
46
  $this->plugin = $plugin;
47
 
@@ -100,7 +100,7 @@
100
 
101
  if( !method_exists($this, $actionFunction) ) {
102
  // todo: продумать и доработать выполнение произвольных и глобальных дейтсвия для всех страниц
103
- /*$custom_actions = apply_filters('wbcr/factory_pages_412/custom_actions', array(), $raw_action_name);
104
 
105
  if(isset($custom_actions[$raw_action_name])) {
106
  $custom_actions[$raw_action_name]();
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryPages414_Page') ) {
18
 
19
+ class Wbcr_FactoryPages414_Page {
20
 
21
  /**
22
  * Page id used to call.
26
 
27
  /**
28
  * Current Factory Plugin.
29
+ * @var Wbcr_Factory414_Plugin
30
  */
31
  public $plugin;
32
 
38
  //private $default_actions = array();
39
 
40
  /**
41
+ * @param Wbcr_Factory414_Plugin $plugin
42
  * @throws Exception
43
  */
44
+ public function __construct(Wbcr_Factory414_Plugin $plugin)
45
  {
46
  $this->plugin = $plugin;
47
 
100
 
101
  if( !method_exists($this, $actionFunction) ) {
102
  // todo: продумать и доработать выполнение произвольных и глобальных дейтсвия для всех страниц
103
+ /*$custom_actions = apply_filters('wbcr/factory_pages_414/custom_actions', array(), $raw_action_name);
104
 
105
  if(isset($custom_actions[$raw_action_name])) {
106
  $custom_actions[$raw_action_name]();
libs/factory/pages/langs/{wbcr_factory_pages_412-fr_FR.mo → wbcr_factory_pages_414-fr_FR.mo} RENAMED
File without changes
libs/factory/pages/langs/{wbcr_factory_pages_412-fr_FR.po → wbcr_factory_pages_414-fr_FR.po} RENAMED
File without changes
libs/factory/pages/langs/{wbcr_factory_pages_412-ru_RU.mo → wbcr_factory_pages_414-ru_RU.mo} RENAMED
File without changes
libs/factory/pages/langs/{wbcr_factory_pages_412-ru_RU.po → wbcr_factory_pages_414-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_FactoryPages412::actionAdminMenu');
18
- add_action('network_admin_menu', 'Wbcr_FactoryPages412::actionAdminMenu');
19
 
20
- if( !class_exists('Wbcr_FactoryPages412') ) {
21
  /**
22
  * A base class to manage pages.
23
  *
24
  * @since 1.0.0
25
  */
26
- class Wbcr_FactoryPages412 {
27
 
28
  /**
29
- * @var Wbcr_FactoryPages412_Page[]
30
  */
31
  private static $pages = array();
32
 
33
  /**
34
- * @param Wbcr_Factory412_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_Factory412_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_Factory412_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_412_get_page_id') ) {
97
  /**
98
  *
99
- * @param Wbcr_Factory412_Plugin $plugin
100
  * @param string $page_id
101
  * @return string
102
  */
103
- function wbcr_factory_pages_412_get_page_id($plugin, $page_id)
104
  {
105
  return $page_id . '-' . $plugin->getPluginName();
106
  }
14
  exit;
15
  }
16
 
17
+ add_action('admin_menu', 'Wbcr_FactoryPages414::actionAdminMenu');
18
+ add_action('network_admin_menu', 'Wbcr_FactoryPages414::actionAdminMenu');
19
 
20
+ if( !class_exists('Wbcr_FactoryPages414') ) {
21
  /**
22
  * A base class to manage pages.
23
  *
24
  * @since 1.0.0
25
  */
26
+ class Wbcr_FactoryPages414 {
27
 
28
  /**
29
+ * @var Wbcr_FactoryPages414_Page[]
30
  */
31
  private static $pages = array();
32
 
33
  /**
34
+ * @param Wbcr_Factory414_Plugin $plugin
35
  * @param $class_name
36
  */
37
  public static function register($plugin, $class_name)
59
  }
60
  }
61
 
62
+ public static function getPageUrl(Wbcr_Factory414_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_Factory414_Plugin $plugin
79
  * @return array
80
  */
81
  public static function getIds($plugin)
93
  }
94
  }
95
 
96
+ if( !function_exists('wbcr_factory_pages_414_get_page_id') ) {
97
  /**
98
  *
99
+ * @param Wbcr_Factory414_Plugin $plugin
100
  * @param string $page_id
101
  * @return string
102
  */
103
+ function wbcr_factory_pages_414_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-412-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-412-impressive-page-template .wbcr-factory-color-grey {
21
  color: #9a9a9a;
22
  }
23
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-orange-color {
24
  color: #ffc107;
25
  }
26
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-light-orange-color {
27
  color: #ffeb3b;
28
  }
29
- #WBCR .wbcr-factory-pages-412-impressive-page-template .form-group {
30
  padding: 0 20px;
31
  }
32
- #WBCR .wbcr-factory-pages-412-impressive-page-template .form-group label {
33
  font-weight: normal;
34
  }
35
- #WBCR .wbcr-factory-pages-412-impressive-page-template .form-horizontal .control-label {
36
  max-width: 300px;
37
  }
38
- #WBCR .wbcr-factory-pages-412-impressive-page-template .factory-control-buttons {
39
  text-align: right;
40
  padding-right: 20px;
41
  }
42
- #WBCR .wbcr-factory-pages-412-impressive-page-template .factory-from-control-list label span {
43
  display: inline-block;
44
  vertical-align: bottom;
45
  }
46
- #WBCR .wbcr-factory-pages-412-impressive-page-template .factory-from-control-list label span input[type="checkbox"],
47
- #WBCR .wbcr-factory-pages-412-impressive-page-template .factory-from-control-list label span input[type="checkbox"]:focus {
48
  outline: none;
49
  }
50
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .alert + .wbcr-factory-page-group-header {
58
  margin-top: 0 !important;
59
  }
60
- #WBCR .wbcr-factory-pages-412-impressive-page-template .alert.alert-warning {
61
  background: #fff3d0;
62
  }
63
- #WBCR .wbcr-factory-pages-412-impressive-page-template .alert.alert-warning:nth-child(2n+1) {
64
  background: #fffde9;
65
  }
66
- #WBCR .wbcr-factory-pages-412-impressive-page-template .alert.alert-danger {
67
  background: #de716d;
68
  }
69
- #WBCR .wbcr-factory-pages-412-impressive-page-template .alert.alert-danger:nth-child(2n+1) {
70
  background: #ec8c89;
71
  }
72
- #WBCR .wbcr-factory-pages-412-impressive-page-template .alert.alert-success {
73
  background: #d0ecc4;
74
  }
75
- #WBCR .wbcr-factory-pages-412-impressive-page-template .alert.alert-success:nth-child(2n+1) {
76
  background: #e0eadb;
77
  }
78
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-header {
79
  padding: 20px 20px 40px;
80
  }
81
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-options,
88
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page {
89
  position: relative;
90
  background: #e6e6e6;
91
  overflow: hidden;
92
  }
93
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-options:after,
94
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page:after {
95
  display: block;
96
  content: '';
97
  clear: both;
98
  }
99
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-page-group-header:first-child {
106
  margin-top: 0;
107
  }
108
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page-group-header strong {
109
  font-size: 15px;
110
  }
111
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page-group-header p {
112
  color: #8c8888;
113
  font-size: 12px;
114
  }
115
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-wrapper,
122
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page-inner-wrap h2.nav-tab-wrapper,
123
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page-inner-wrap h1.nav-tab-wrapper {
124
  border: 0;
125
  }
126
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:first-child {
132
  margin: 0;
133
  }
134
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:hover {
135
  background: #f7f7f7;
136
  }
137
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:active,
143
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:focus {
144
  box-shadow: none;
145
  outline: none;
146
  }
147
- #WBCR .wbcr-factory-pages-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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-412-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,83 @@
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-412-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-412-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-412-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-412-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-412-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-412-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-412-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link,
292
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
293
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover,
294
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
295
- #WBCR .wbcr-factory-pages-412-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-412-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-412-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-412-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-412-impressive-page-template .wbcr-factory-content-section,
311
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section {
312
  display: inline-block;
313
  vertical-align: top;
314
  }
315
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-content-section {
316
  width: 74.6%;
317
  }
318
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-content-section.wbcr-fullwidth {
319
  width: 100%;
320
  }
321
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-content-section .nav-tab-wrapper {
322
  margin-top: 15px;
323
  }
324
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content > form {
331
  padding-top: 0 !important;
332
  }
333
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-sidebar-widget {
341
  margin: 0 0 20px;
342
  }
343
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget {
344
  display: inline-block;
345
  min-height: 230px;
346
  width: 100%;
@@ -349,19 +349,19 @@
349
  padding: 20px 15px;
350
  vertical-align: top;
351
  }
352
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-hide {
353
  display: none;
354
  }
355
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-warning {
356
  background: #fff4d0;
357
  }
358
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-danger {
359
  background: #e2ffc0;
360
  }
361
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-success {
362
  background: #ffebe9;
363
  }
364
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-hint-icon-simple {
365
  display: inline-block;
366
  width: 16px;
367
  height: 16px;
@@ -373,16 +373,16 @@
373
  background: #E91E63;
374
  border-radius: 3px;
375
  }
376
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-grey {
377
  background: #E91E63;
378
  }
379
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-red {
380
  background: #9e9e9e;
381
  }
382
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-green {
383
  background: #8bc34a;
384
  }
385
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-icon-5stars {
386
  display: block;
387
  width: 80px;
388
  height: 17px;
@@ -390,23 +390,23 @@
390
  vertical-align: middle;
391
  margin-bottom: 5px;
392
  }
393
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :focus,
399
- #WBCR .wbcr-factory-pages-412-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-412-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-412-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 +414,24 @@
414
  padding: 30px;
415
  border: 1px solid #f3f1e7;
416
  }
417
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box h3 {
425
  color: #7b6111;
426
  }
427
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box p {
428
  color: #9e9e9e;
429
  }
430
- #WBCR .wbcr-factory-pages-412-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-412-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 +441,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-412-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button:hover {
445
  background-color: #ffce3a;
446
  }
447
- #WBCR .wbcr-factory-pages-412-impressive-page-template #wbcr-factory-confirm-dialog {
448
  padding: 20px;
449
  background: #ffffff;
450
  }
451
- #WBCR .wbcr-factory-pages-412-impressive-page-template #wbcr-factory-confirm-dialog .updated,
452
- #WBCR .wbcr-factory-pages-412-impressive-page-template #wbcr-factory-confirm-dialog .alert {
453
  display: none;
454
  }
455
- #WBCR .wbcr-factory-pages-412-impressive-page-template #wbcr-factory-confirm-dialog h2 {
456
  font-size: 18px;
457
  margin-top: 10px;
458
  }
459
- #WBCR .wbcr-factory-pages-412-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-412-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-412-impressive-page-template .wbcr-factory-content-section {
471
  width: 69.6%;
472
  }
473
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-content-section {
479
  width: 100%;
480
  }
481
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-right-sidebar-section {
482
  display: none !important;
483
  }
484
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-header-logo .dash {
485
  display: none !important;
486
  }
487
- #WBCR .wbcr-factory-pages-412-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-412-impressive-page-template .wbcr-factory-left-navigation-bar {
493
  width: 70px;
494
  }
495
- #WBCR .wbcr-factory-pages-412-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a {
496
  font-size: 0;
497
  }
498
- #WBCR .wbcr-factory-pages-412-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-412-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-412-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-414-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-414-impressive-page-template .wbcr-factory-color-grey {
21
  color: #9a9a9a;
22
  }
23
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-orange-color {
24
  color: #ffc107;
25
  }
26
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-light-orange-color {
27
  color: #ffeb3b;
28
  }
29
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .form-group {
30
  padding: 0 20px;
31
  }
32
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .form-group label {
33
  font-weight: normal;
34
  }
35
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .form-horizontal .control-label {
36
  max-width: 300px;
37
  }
38
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .factory-control-buttons {
39
  text-align: right;
40
  padding-right: 20px;
41
  }
42
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .factory-from-control-list label span {
43
  display: inline-block;
44
  vertical-align: bottom;
45
  }
46
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .factory-from-control-list label span input[type="checkbox"],
47
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .factory-from-control-list label span input[type="checkbox"]:focus {
48
  outline: none;
49
  }
50
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .alert + .wbcr-factory-page-group-header {
58
  margin-top: 0 !important;
59
  }
60
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .alert.alert-warning {
61
  background: #fff3d0;
62
  }
63
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .alert.alert-warning:nth-child(2n+1) {
64
  background: #fffde9;
65
  }
66
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .alert.alert-danger {
67
  background: #de716d;
68
  }
69
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .alert.alert-danger:nth-child(2n+1) {
70
  background: #ec8c89;
71
  }
72
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .alert.alert-success {
73
  background: #d0ecc4;
74
  }
75
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .alert.alert-success:nth-child(2n+1) {
76
  background: #e0eadb;
77
  }
78
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-header {
79
  padding: 20px 20px 40px;
80
  }
81
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-options,
88
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page {
89
  position: relative;
90
  background: #e6e6e6;
91
  overflow: hidden;
92
  }
93
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-options:after,
94
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page:after {
95
  display: block;
96
  content: '';
97
  clear: both;
98
  }
99
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-page-group-header:first-child {
106
  margin-top: 0;
107
  }
108
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page-group-header strong {
109
  font-size: 15px;
110
  }
111
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page-group-header p {
112
  color: #8c8888;
113
  font-size: 12px;
114
  }
115
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-wrapper,
122
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page-inner-wrap h2.nav-tab-wrapper,
123
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page-inner-wrap h1.nav-tab-wrapper {
124
  border: 0;
125
  }
126
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:first-child {
132
  margin: 0;
133
  }
134
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:hover {
135
  background: #f7f7f7;
136
  }
137
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:active,
143
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:focus {
144
  box-shadow: none;
145
  outline: none;
146
  }
147
+ #WBCR .wbcr-factory-pages-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-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-414-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link,
292
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
293
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover,
294
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
295
+ #WBCR .wbcr-factory-pages-414-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-414-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-414-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-414-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-414-impressive-page-template .wbcr-factory-content-section,
311
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section {
312
  display: inline-block;
313
  vertical-align: top;
314
  }
315
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-content-section {
316
  width: 74.6%;
317
  }
318
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-content-section.wbcr-fullwidth {
319
  width: 100%;
320
  }
321
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-content-section .nav-tab-wrapper {
322
  margin-top: 15px;
323
  }
324
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content > form {
331
  padding-top: 0 !important;
332
  }
333
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-sidebar-widget {
341
  margin: 0 0 20px;
342
  }
343
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget {
344
  display: inline-block;
345
  min-height: 230px;
346
  width: 100%;
349
  padding: 20px 15px;
350
  vertical-align: top;
351
  }
352
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-hide {
353
  display: none;
354
  }
355
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-warning {
356
  background: #fff4d0;
357
  }
358
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-danger {
359
  background: #e2ffc0;
360
  }
361
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-success {
362
  background: #ffebe9;
363
  }
364
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-hint-icon-simple {
365
  display: inline-block;
366
  width: 16px;
367
  height: 16px;
373
  background: #E91E63;
374
  border-radius: 3px;
375
  }
376
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-grey {
377
  background: #E91E63;
378
  }
379
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-red {
380
  background: #9e9e9e;
381
  }
382
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-green {
383
  background: #8bc34a;
384
  }
385
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-icon-5stars {
386
  display: block;
387
  width: 80px;
388
  height: 17px;
390
  vertical-align: middle;
391
  margin-bottom: 5px;
392
  }
393
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :focus,
399
+ #WBCR .wbcr-factory-pages-414-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-414-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-414-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
  padding: 30px;
415
  border: 1px solid #f3f1e7;
416
  }
417
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box h3 {
425
  color: #7b6111;
426
  }
427
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box p {
428
  color: #9e9e9e;
429
  }
430
+ #WBCR .wbcr-factory-pages-414-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-414-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
  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-414-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button:hover {
445
  background-color: #ffce3a;
446
  }
447
+ #WBCR .wbcr-factory-pages-414-impressive-page-template #wbcr-factory-confirm-dialog {
448
  padding: 20px;
449
  background: #ffffff;
450
  }
451
+ #WBCR .wbcr-factory-pages-414-impressive-page-template #wbcr-factory-confirm-dialog .updated,
452
+ #WBCR .wbcr-factory-pages-414-impressive-page-template #wbcr-factory-confirm-dialog .alert {
453
  display: none;
454
  }
455
+ #WBCR .wbcr-factory-pages-414-impressive-page-template #wbcr-factory-confirm-dialog h2 {
456
  font-size: 18px;
457
  margin-top: 10px;
458
  }
459
+ #WBCR .wbcr-factory-pages-414-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-414-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-414-impressive-page-template .wbcr-factory-content-section {
471
  width: 69.6%;
472
  }
473
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-content-section {
479
  width: 100%;
480
  }
481
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-right-sidebar-section {
482
  display: none !important;
483
  }
484
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-header-logo .dash {
485
  display: none !important;
486
  }
487
+ #WBCR .wbcr-factory-pages-414-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-414-impressive-page-template .wbcr-factory-left-navigation-bar {
493
  width: 70px;
494
  }
495
+ #WBCR .wbcr-factory-pages-414-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a {
496
  font-size: 0;
497
  }
498
+ #WBCR .wbcr-factory-pages-414-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-414-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-414-impressive-page-template .wbcr-factory-page-inner-wrap {
505
  margin-left: 70px;
506
  }
507
  }
libs/factory/pages/templates/impressive-page.class.php CHANGED
@@ -14,11 +14,11 @@
14
  exit;
15
  }
16
 
17
- if( !class_exists('Wbcr_FactoryPages412_ImpressiveThemplate') ) {
18
  /**
19
- * Class Wbcr_FactoryPages412_ImpressiveThemplate
20
  */
21
- abstract class Wbcr_FactoryPages412_ImpressiveThemplate extends Wbcr_FactoryPages412_AdminPage {
22
 
23
  //public $menu_target = 'options-general.php';
24
 
@@ -110,12 +110,12 @@
110
  public $page_menu = array();
111
 
112
  /**
113
- * @param Wbcr_Factory412_Plugin $plugin
114
  */
115
- public function __construct(Wbcr_Factory412_Plugin $plugin)
116
  {
117
- $this->menuIcon = FACTORY_PAGES_412_URL . '/templates/assets/img/webcraftic-plugin-icon.png';
118
- //$allow_multisite = apply_filters('wbcr_factory_412_core_admin_allow_multisite', false);
119
 
120
  if( is_multisite() && $this->available_for_multisite && $plugin->isNetworkActive() ) {
121
  $this->network = true;
@@ -125,7 +125,7 @@
125
 
126
  parent::__construct($plugin);
127
 
128
- $this->title_plugin_action_link = __('Settings', 'wbcr_factory_pages_412');
129
 
130
  $this->setPageMenu();
131
  }
@@ -169,7 +169,7 @@
169
  /**
170
  * Requests assets (js and css) for the page.
171
  *
172
- * @see FactoryPages412_AdminPage
173
  *
174
  * @since 1.0.0
175
  * @return void
@@ -193,7 +193,7 @@
193
  'control.checkbox'
194
  ), 'bootstrap');
195
 
196
- $this->styles->add(FACTORY_PAGES_412_URL . '/templates/assets/css/impressive.page.template.css');
197
  }
198
 
199
  /**
@@ -207,7 +207,7 @@
207
  * @since 4.0.8 - добавлен
208
  * @since 4.0.9 - является устаревшим
209
  */
210
- $plugin_title = wbcr_factory_412_apply_filters_deprecated('wbcr/factory/imppage/plugin_title', array(
211
  $this->plugin->getPluginTitle(),
212
  $this->plugin->getPluginName()
213
  ), '4.0.9', 'wbcr/factory/pages/impressive/plugin_title');
@@ -286,22 +286,22 @@
286
  {
287
  check_admin_referer('wbcr_factory_' . $this->getResultId() . '_flush_action');
288
 
289
- if( class_exists('WbcrFactoryClearfy208_Helpers') ) {
290
- WbcrFactoryClearfy208_Helpers::flushPageCache();
291
  }
292
 
293
  /**
294
  * @since 4.0.1 - является устаревшим
295
  */
296
- wbcr_factory_412_do_action_deprecated('wbcr_factory_412_imppage_flush_cache', array(
297
  $this->plugin->getPluginName(),
298
  $this->getResultId()
299
- ), '4.0.1', 'wbcr_factory_412_imppage_after_form_save');
300
 
301
  /**
302
  * @since 4.0.9 - является устаревшим
303
  */
304
- wbcr_factory_412_do_action_deprecated('wbcr_factory_412_imppage_after_form_save', array(
305
  $this->plugin,
306
  $this
307
  ), '4.0.9', 'wbcr/factory/pages/impressive/after_form_save');
@@ -320,7 +320,7 @@
320
  /**
321
  * @since 4.0.9 - является устаревшим
322
  */
323
- $redirect_args = wbcr_factory_412_apply_filters_deprecated('wbcr_factory_412_imppage_after_form_save_redirect_args', array($redirect_args), '4.0.9', 'wbcr/factory/pages/impressive/save_redirect_args');
324
 
325
  /**
326
  * @since 4.0.1 - добавлен
@@ -338,7 +338,7 @@
338
  protected function warningNotice()
339
  {
340
  /*if( WP_CACHE ) {
341
- $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_412'));
342
  }*/
343
  // Метод предназначен для вызова в дочернем классе
344
  }
@@ -416,7 +416,7 @@
416
  /**
417
  * @since 4.0.9 - является устаревшим
418
  */
419
- wbcr_factory_412_do_action_deprecated('wbcr_factory_pages_412_imppage_print_all_notices', array(
420
  $this->plugin,
421
  $this
422
  ), '4.0.9', 'wbcr/factory/pages/impressive/print_all_notices');
@@ -436,14 +436,14 @@
436
  $this->plugin->getPluginName() . '_saved' => '1'
437
  ),
438
  'type' => 'success',
439
- 'message' => __('The settings have been updated successfully!', 'wbcr_factory_pages_412') . (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_412') : '')
440
  )
441
  );
442
 
443
  /**
444
  * @since 4.0.9 - является устаревшим
445
  */
446
- $notices = wbcr_factory_412_apply_filters_deprecated('wbcr_factory_pages_412_imppage_actions_notice', array(
447
  $notices,
448
  $this->plugin,
449
  $this->id
@@ -619,7 +619,7 @@
619
  <?php do_action('wbcr/factory/pages/impressive/header', $this->plugin->getPluginName()) ?>
620
 
621
  <?php if( $this->type == 'options' ): ?>
622
- <input name="<?= $this->plugin->getPluginName() ?>_save_action" class="wbcr-factory-button wbcr-factory-type-save" type="submit" value="<?php _e('Save', 'wbcr_factory_pages_412'); ?>">
623
 
624
  <?php wp_nonce_field('wbcr_factory_' . $this->getResultId() . '_save_action'); ?>
625
  <?php endif; ?>
@@ -678,7 +678,7 @@
678
  /**
679
  * @since 4.0.9 - является устаревшим
680
  */
681
- $widgets = wbcr_factory_412_apply_filters_deprecated('wbcr_factory_pages_412_imppage_get_widgets', array(
682
  $widgets,
683
  $position,
684
  $this->plugin,
@@ -696,12 +696,12 @@
696
 
697
  protected function showOptions()
698
  {
699
- $form = new Wbcr_FactoryForms412_Form(array(
700
  'scope' => rtrim($this->plugin->getPrefix(), '_'),
701
  'name' => $this->getResultId() . "-options"
702
  ), $this->plugin);
703
 
704
- $form->setProvider(new Wbcr_FactoryForms412_OptionsValueProvider($this->plugin));
705
 
706
  $options = $this->getPageOptions();
707
 
@@ -741,14 +741,14 @@
741
  check_admin_referer('wbcr_factory_' . $this->getResultId() . '_save_action');
742
 
743
  if( !current_user_can('administrator') && !current_user_can($this->capabilitiy) ) {
744
- wp_die(__('You do not have permission to edit page.', 'wbcr_factory_pages_412'));
745
  exit;
746
  }
747
 
748
  /**
749
  * @since 4.0.9 - является устаревшим
750
  */
751
- wbcr_factory_412_do_action_deprecated('wbcr_factory_412_imppage_before_form_save', array(
752
  $form,
753
  $this->plugin,
754
  $this
@@ -767,7 +767,7 @@
767
  /**
768
  * @since 4.0.9 - является устаревшим
769
  */
770
- wbcr_factory_412_do_action_deprecated('wbcr_factory_412_imppage_form_saved', array(
771
  $form,
772
  $this->plugin,
773
  $this
@@ -788,7 +788,7 @@
788
 
789
  ?>
790
  <div id="WBCR" class="wrap">
791
- <div class="wbcr-factory-pages-412-impressive-page-template factory-bootstrap-412 factory-fontawesome-000">
792
  <div class="wbcr-factory-options wbcr-factory-options-<?= esc_attr($this->id) ?>">
793
  <div class="wbcr-factory-left-navigation-bar">
794
  <?php $this->showPageMenu() ?>
@@ -836,7 +836,7 @@
836
  protected function showPage($content = null)
837
  { ?>
838
  <div id="WBCR" class="wrap">
839
- <div class="wbcr-factory-pages-412-impressive-page-template factory-bootstrap-412 factory-fontawesome-000">
840
  <div class="wbcr-factory-page wbcr-factory-page-<?= $this->id ?>">
841
  <?php $this->showHeader(); ?>
842
 
@@ -904,7 +904,7 @@
904
  {
905
  ?>
906
  <div id="WBCR" class="wrap">
907
- <div class="wbcr-factory-pages-412-impressive-page-template factory-bootstrap-412 factory-fontawesome-000">
908
  <div id="wbcr-factory-confirm-dialog">
909
  <h2><?php echo $data['title'] ?></h2>
910
 
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_FactoryPages414_ImpressiveThemplate') ) {
18
  /**
19
+ * Class Wbcr_FactoryPages414_ImpressiveThemplate
20
  */
21
+ abstract class Wbcr_FactoryPages414_ImpressiveThemplate extends Wbcr_FactoryPages414_AdminPage {
22
 
23
  //public $menu_target = 'options-general.php';
24
 
110
  public $page_menu = array();
111
 
112
  /**
113
+ * @param Wbcr_Factory414_Plugin $plugin
114
  */
115
+ public function __construct(Wbcr_Factory414_Plugin $plugin)
116
  {
117
+ $this->menuIcon = FACTORY_PAGES_414_URL . '/templates/assets/img/webcraftic-plugin-icon.png';
118
+ //$allow_multisite = apply_filters('wbcr_factory_414_core_admin_allow_multisite', false);
119
 
120
  if( is_multisite() && $this->available_for_multisite && $plugin->isNetworkActive() ) {
121
  $this->network = true;
125
 
126
  parent::__construct($plugin);
127
 
128
+ $this->title_plugin_action_link = __('Settings', 'wbcr_factory_pages_414');
129
 
130
  $this->setPageMenu();
131
  }
169
  /**
170
  * Requests assets (js and css) for the page.
171
  *
172
+ * @see FactoryPages414_AdminPage
173
  *
174
  * @since 1.0.0
175
  * @return void
193
  'control.checkbox'
194
  ), 'bootstrap');
195
 
196
+ $this->styles->add(FACTORY_PAGES_414_URL . '/templates/assets/css/impressive.page.template.css');
197
  }
198
 
199
  /**
207
  * @since 4.0.8 - добавлен
208
  * @since 4.0.9 - является устаревшим
209
  */
210
+ $plugin_title = wbcr_factory_414_apply_filters_deprecated('wbcr/factory/imppage/plugin_title', array(
211
  $this->plugin->getPluginTitle(),
212
  $this->plugin->getPluginName()
213
  ), '4.0.9', 'wbcr/factory/pages/impressive/plugin_title');
286
  {
287
  check_admin_referer('wbcr_factory_' . $this->getResultId() . '_flush_action');
288
 
289
+ if( class_exists('WbcrFactoryClearfy209_Helpers') ) {
290
+ WbcrFactoryClearfy209_Helpers::flushPageCache();
291
  }
292
 
293
  /**
294
  * @since 4.0.1 - является устаревшим
295
  */
296
+ wbcr_factory_414_do_action_deprecated('wbcr_factory_414_imppage_flush_cache', array(
297
  $this->plugin->getPluginName(),
298
  $this->getResultId()
299
+ ), '4.0.1', 'wbcr_factory_414_imppage_after_form_save');
300
 
301
  /**
302
  * @since 4.0.9 - является устаревшим
303
  */
304
+ wbcr_factory_414_do_action_deprecated('wbcr_factory_414_imppage_after_form_save', array(
305
  $this->plugin,
306
  $this
307
  ), '4.0.9', 'wbcr/factory/pages/impressive/after_form_save');
320
  /**
321
  * @since 4.0.9 - является устаревшим
322
  */
323
+ $redirect_args = wbcr_factory_414_apply_filters_deprecated('wbcr_factory_414_imppage_after_form_save_redirect_args', array($redirect_args), '4.0.9', 'wbcr/factory/pages/impressive/save_redirect_args');
324
 
325
  /**
326
  * @since 4.0.1 - добавлен
338
  protected function warningNotice()
339
  {
340
  /*if( WP_CACHE ) {
341
+ $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_414'));
342
  }*/
343
  // Метод предназначен для вызова в дочернем классе
344
  }
416
  /**
417
  * @since 4.0.9 - является устаревшим
418
  */
419
+ wbcr_factory_414_do_action_deprecated('wbcr_factory_pages_414_imppage_print_all_notices', array(
420
  $this->plugin,
421
  $this
422
  ), '4.0.9', 'wbcr/factory/pages/impressive/print_all_notices');
436
  $this->plugin->getPluginName() . '_saved' => '1'
437
  ),
438
  'type' => 'success',
439
+ 'message' => __('The settings have been updated successfully!', 'wbcr_factory_pages_414') . (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_414') : '')
440
  )
441
  );
442
 
443
  /**
444
  * @since 4.0.9 - является устаревшим
445
  */
446
+ $notices = wbcr_factory_414_apply_filters_deprecated('wbcr_factory_pages_414_imppage_actions_notice', array(
447
  $notices,
448
  $this->plugin,
449
  $this->id
619
  <?php do_action('wbcr/factory/pages/impressive/header', $this->plugin->getPluginName()) ?>
620
 
621
  <?php if( $this->type == 'options' ): ?>
622
+ <input name="<?= $this->plugin->getPluginName() ?>_save_action" class="wbcr-factory-button wbcr-factory-type-save" type="submit" value="<?php _e('Save', 'wbcr_factory_pages_414'); ?>">
623
 
624
  <?php wp_nonce_field('wbcr_factory_' . $this->getResultId() . '_save_action'); ?>
625
  <?php endif; ?>
678
  /**
679
  * @since 4.0.9 - является устаревшим
680
  */
681
+ $widgets = wbcr_factory_414_apply_filters_deprecated('wbcr_factory_pages_414_imppage_get_widgets', array(
682
  $widgets,
683
  $position,
684
  $this->plugin,
696
 
697
  protected function showOptions()
698
  {
699
+ $form = new Wbcr_FactoryForms414_Form(array(
700
  'scope' => rtrim($this->plugin->getPrefix(), '_'),
701
  'name' => $this->getResultId() . "-options"
702
  ), $this->plugin);
703
 
704
+ $form->setProvider(new Wbcr_FactoryForms414_OptionsValueProvider($this->plugin));
705
 
706
  $options = $this->getPageOptions();
707
 
741
  check_admin_referer('wbcr_factory_' . $this->getResultId() . '_save_action');
742
 
743
  if( !current_user_can('administrator') && !current_user_can($this->capabilitiy) ) {
744
+ wp_die(__('You do not have permission to edit page.', 'wbcr_factory_pages_414'));
745
  exit;
746
  }
747
 
748
  /**
749
  * @since 4.0.9 - является устаревшим
750
  */
751
+ wbcr_factory_414_do_action_deprecated('wbcr_factory_414_imppage_before_form_save', array(
752
  $form,
753
  $this->plugin,
754
  $this
767
  /**
768
  * @since 4.0.9 - является устаревшим
769
  */
770
+ wbcr_factory_414_do_action_deprecated('wbcr_factory_414_imppage_form_saved', array(
771
  $form,
772
  $this->plugin,
773
  $this
788
 
789
  ?>
790
  <div id="WBCR" class="wrap">
791
+ <div class="wbcr-factory-pages-414-impressive-page-template factory-bootstrap-414 factory-fontawesome-000">
792
  <div class="wbcr-factory-options wbcr-factory-options-<?= esc_attr($this->id) ?>">
793
  <div class="wbcr-factory-left-navigation-bar">
794
  <?php $this->showPageMenu() ?>
836
  protected function showPage($content = null)
837
  { ?>
838
  <div id="WBCR" class="wrap">
839
+ <div class="wbcr-factory-pages-414-impressive-page-template factory-bootstrap-414 factory-fontawesome-000">
840
  <div class="wbcr-factory-page wbcr-factory-page-<?= $this->id ?>">
841
  <?php $this->showHeader(); ?>
842
 
904
  {
905
  ?>
906
  <div id="WBCR" class="wrap">
907
+ <div class="wbcr-factory-pages-414-impressive-page-template factory-bootstrap-414 factory-fontawesome-000">
908
  <div id="wbcr-factory-confirm-dialog">
909
  <h2><?php echo $data['title'] ?></h2>
910
 
migrations/010009.php CHANGED
@@ -4,13 +4,41 @@
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 WIOUpdate010009 extends Wbcr_Factory412_Update {
8
 
9
  public function install() {
10
- WRIO_Logger::info( sprintf( 'Start plugin migration < %s', '1.1.5' ) );
 
 
 
 
 
 
 
 
 
 
11
 
12
  WRIO_Plugin::app()->updateOption( 'image_optimization_server', 'server_1' );
13
 
 
 
14
  WRIO_Logger::info( 'Plugin migration was successfull!' );
15
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
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 WIOUpdate010009 extends Wbcr_Factory414_Update {
8
 
9
  public function install() {
10
+
11
+ $db_version = RIO_Process_Queue::get_db_version();
12
+ $plugin_version_in_db = $this->get_plugin_version_in_db();
13
+ $current_plugin_version = $this->plugin->getPluginVersion();
14
+
15
+ $init_log_message = "Start plugin migration < %s.\r\n";
16
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-DB Version: {$db_version}\r\n";
17
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Plugin Version in DB: {$plugin_version_in_db}\r\n";
18
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Current Plugin Version: {$current_plugin_version}";
19
+
20
+ WRIO_Logger::info( sprintf( $init_log_message, '1.1.5' ) );
21
 
22
  WRIO_Plugin::app()->updateOption( 'image_optimization_server', 'server_1' );
23
 
24
+ WbcrFactoryClearfy209_Helpers::flushPageCache();
25
+
26
  WRIO_Logger::info( 'Plugin migration was successfull!' );
27
  }
28
+
29
+ /**
30
+ * Get previous plugin version
31
+ *
32
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
33
+ * @since 1.3.8
34
+ * @return int
35
+ */
36
+ public function get_plugin_version_in_db() {
37
+ if ( WRIO_Plugin::app()->isNetworkActive() ) {
38
+ return get_site_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
39
+ }
40
+
41
+ return get_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
42
+ }
43
+
44
  }
migrations/010300.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 WIOUpdate010300 extends Wbcr_Factory412_Update {
8
 
9
  /**
10
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
@@ -13,9 +13,19 @@ class WIOUpdate010300 extends Wbcr_Factory412_Update {
13
  */
14
  public function install() {
15
 
16
- WRIO_Logger::info( sprintf( 'Start plugin migration < %s', '1.3.0' ) );
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- $this->try_create_table();
19
  $this->clear_log();
20
 
21
  WRIO_Plugin::app()->deleteOption( 'cron_running' );
@@ -24,26 +34,24 @@ class WIOUpdate010300 extends Wbcr_Factory412_Update {
24
  WRIO_Cron::stop();
25
  }
26
 
 
 
27
  WRIO_Logger::info( 'Plugin migration was successfull!' );
28
  }
29
 
30
  /**
31
- * Attempting to create a new schema in the database. Since version 1.3.0,
32
- * our plugin uses a new database structure.
33
  *
34
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
35
- * @since 1.3.6
36
- * @throws \Exception
37
  */
38
- public function try_create_table() {
39
-
40
- if ( ! class_exists( 'RIO_Process_Queue' ) ) {
41
- WRIO_Logger::error( 'Plugin migration: Class RIO_Process_Queue is not found!' );
42
-
43
- return;
44
  }
45
 
46
- RIO_Process_Queue::try_create_plugin_tables();
47
  }
48
 
49
  /**
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 WIOUpdate010300 extends Wbcr_Factory414_Update {
8
 
9
  /**
10
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
13
  */
14
  public function install() {
15
 
16
+ $db_version = RIO_Process_Queue::get_db_version();
17
+ $plugin_version_in_db = $this->get_plugin_version_in_db();
18
+ $current_plugin_version = $this->plugin->getPluginVersion();
19
+
20
+ $init_log_message = "Start plugin migration < %s.\r\n";
21
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-DB Version: {$db_version}\r\n";
22
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Plugin Version in DB: {$plugin_version_in_db}\r\n";
23
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Current Plugin Version: {$current_plugin_version}";
24
+
25
+ WRIO_Logger::info( sprintf( $init_log_message, '1.3.0' ) );
26
+
27
+ RIO_Process_Queue::try_create_plugin_tables();
28
 
 
29
  $this->clear_log();
30
 
31
  WRIO_Plugin::app()->deleteOption( 'cron_running' );
34
  WRIO_Cron::stop();
35
  }
36
 
37
+ WbcrFactoryClearfy209_Helpers::flushPageCache();
38
+
39
  WRIO_Logger::info( 'Plugin migration was successfull!' );
40
  }
41
 
42
  /**
43
+ * Get previous plugin version
 
44
  *
45
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
46
+ * @since 1.3.8
47
+ * @return number
48
  */
49
+ public function get_plugin_version_in_db() {
50
+ if ( WRIO_Plugin::app()->isNetworkActive() ) {
51
+ return get_site_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
 
 
 
52
  }
53
 
54
+ return get_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
55
  }
56
 
57
  /**
migrations/010306.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 WIOUpdate010306 extends Wbcr_Factory412_Update {
8
 
9
  /**
10
  * {inherit}
@@ -13,18 +13,40 @@ class WIOUpdate010306 extends Wbcr_Factory412_Update {
13
  * @since 1.3.6
14
  */
15
  public function install() {
16
- WRIO_Logger::info( sprintf( 'Start plugin migration < %s', '1.3.6' ) );
17
 
18
- if ( ! class_exists( 'RIO_Process_Queue' ) ) {
19
- WRIO_Logger::error( 'Class RIO_Process_Queue is not found!' );
20
- } else {
21
- $this->clear_webp_queue_items();
22
- $this->clear_webp_images();
23
- }
 
 
 
 
 
 
 
 
24
 
25
  WRIO_Logger::info( 'Plugin migration was successfull!' );
26
  }
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  /**
29
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
30
  * @since 1.3.6
@@ -74,6 +96,7 @@ class WIOUpdate010306 extends Wbcr_Factory412_Update {
74
  $dir_path = wp_normalize_path( trailingslashit( $content_path ) . 'wrio-webp-uploads' );
75
 
76
  if ( file_exists( $dir_path ) ) {
 
77
  $this->plugin->updatePopulateOption( 'cleared_webp_images', 1 );
78
 
79
  wrio_rmdir( $dir_path );
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 WIOUpdate010306 extends Wbcr_Factory414_Update {
8
 
9
  /**
10
  * {inherit}
13
  * @since 1.3.6
14
  */
15
  public function install() {
 
16
 
17
+ $db_version = RIO_Process_Queue::get_db_version();
18
+ $plugin_version_in_db = $this->get_plugin_version_in_db();
19
+ $current_plugin_version = $this->plugin->getPluginVersion();
20
+
21
+ $init_log_message = "Start plugin migration < %s.\r\n";
22
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-DB Version: {$db_version}\r\n";
23
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Plugin Version in DB: {$plugin_version_in_db}\r\n";
24
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Current Plugin Version: {$current_plugin_version}";
25
+
26
+ WRIO_Logger::info( sprintf( $init_log_message, '1.3.6' ) );
27
+
28
+ $this->clear_webp_images();
29
+
30
+ WbcrFactoryClearfy209_Helpers::flushPageCache();
31
 
32
  WRIO_Logger::info( 'Plugin migration was successfull!' );
33
  }
34
 
35
+ /**
36
+ * Get previous plugin version
37
+ *
38
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
39
+ * @since 1.3.8
40
+ * @return number
41
+ */
42
+ public function get_plugin_version_in_db() {
43
+ if ( WRIO_Plugin::app()->isNetworkActive() ) {
44
+ return get_site_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
45
+ }
46
+
47
+ return get_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
48
+ }
49
+
50
  /**
51
  * @author Alexander Kovalev <alex.kovalevv@gmail.com>
52
  * @since 1.3.6
96
  $dir_path = wp_normalize_path( trailingslashit( $content_path ) . 'wrio-webp-uploads' );
97
 
98
  if ( file_exists( $dir_path ) ) {
99
+ $this->clear_webp_queue_items();
100
  $this->plugin->updatePopulateOption( 'cleared_webp_images', 1 );
101
 
102
  wrio_rmdir( $dir_path );
migrations/010309.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php #comp-page builds: premium
2
+
3
+ /**
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 WIOUpdate010309 extends Wbcr_Factory414_Update {
8
+
9
+ /**
10
+ * {inherit}
11
+ *
12
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
13
+ * @since 1.3.9
14
+ */
15
+ public function install() {
16
+
17
+ $db_version = RIO_Process_Queue::get_db_version();
18
+ $plugin_version_in_db = $this->get_plugin_version_in_db();
19
+ $current_plugin_version = $this->plugin->getPluginVersion();
20
+
21
+ $init_log_message = "Start plugin migration < %s.\r\n";
22
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-DB Version: {$db_version}\r\n";
23
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Plugin Version in DB: {$plugin_version_in_db}\r\n";
24
+ $init_log_message .= "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-Current Plugin Version: {$current_plugin_version}";
25
+
26
+ WRIO_Logger::info( sprintf( $init_log_message, '1.3.9' ) );
27
+
28
+ $this->add_indexes_in_db();
29
+
30
+ WbcrFactoryClearfy209_Helpers::flushPageCache();
31
+
32
+ WRIO_Logger::info( 'Plugin migration was successfull!' );
33
+ }
34
+
35
+ /**
36
+ * Get previous plugin version
37
+ *
38
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
39
+ * @since 1.3.9
40
+ * @return number
41
+ */
42
+ public function get_plugin_version_in_db() {
43
+ if ( WRIO_Plugin::app()->isNetworkActive() ) {
44
+ return get_site_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
45
+ }
46
+
47
+ return get_option( WRIO_Plugin::app()->getOptionName( 'plugin_version' ), 0 );
48
+ }
49
+
50
+ /**
51
+ * In older plugin relises, the option 'plugin_activated' did not exist. Therefore,
52
+ * if during migration it still does not exist, you need to add option with the current timestamp.
53
+ *
54
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
55
+ * @since 1.3.9
56
+ */
57
+ public function update_plugin_activation_time() {
58
+ if ( $this->plugin->isNetworkActive() ) {
59
+ $activated = get_site_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
60
+ } else {
61
+ $activated = get_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
62
+ }
63
+
64
+ if ( ! $activated ) {
65
+ if ( $this->plugin->isNetworkActive() ) {
66
+ update_site_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
67
+ update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->plugin->getPluginVersion() );
68
+ } else {
69
+ update_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
70
+ update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->plugin->getPluginVersion() );
71
+ }
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Get previous plugin version
77
+ *
78
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
79
+ * @since 1.3.9
80
+ */
81
+ public function add_indexes_in_db() {
82
+ global $wpdb;
83
+
84
+ $table_name = RIO_Process_Queue::table_name();
85
+ $wpdb->query( "ALTER TABLE {$table_name} ADD INDEX `index-type-attachments` (`object_id`, `item_type`);" );
86
+ }
87
+ }
readme.txt CHANGED
@@ -12,6 +12,10 @@ Automatic image optimization without any quality loss. No limitations. The best
12
 
13
  == Description ==
14
 
 
 
 
 
15
  Make your website faster by reducing the weight of images. Our Wordpress image optimizer plugin can cease image weights on 80% without any loss of quality.
16
 
17
  Robin image optimizer is a smart and advanced image optimizer that really stands out among other Wordpress plugins. Robin image optimizer is a Wordpress free image optimizer plugin with zero limitations in terms of number of images and optimization quality. The only thing that you may stumble across is the image weight, which shouldn’t exceed 5 MB.
@@ -100,9 +104,21 @@ Robin image optimizer PRO has full integration with NextGen Gallery, which helps
100
  == Screenshots ==
101
 
102
  1. The simple interface
103
- 2. The simple interface
 
 
104
 
105
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
106
  = 1.3.7 =
107
  * Fixed: Minor errors
108
 
12
 
13
  == Description ==
14
 
15
+ ### Need professional support? ###
16
+ [Get starting FREE support](http://forum.webcraftic.com/forums/robin-image-optimizer.18/ "Get starting free support")
17
+ [Get starting PREMIUM support](https://webcraftic.com/premium-support/ "Get starting premium support")
18
+
19
  Make your website faster by reducing the weight of images. Our Wordpress image optimizer plugin can cease image weights on 80% without any loss of quality.
20
 
21
  Robin image optimizer is a smart and advanced image optimizer that really stands out among other Wordpress plugins. Robin image optimizer is a Wordpress free image optimizer plugin with zero limitations in terms of number of images and optimization quality. The only thing that you may stumble across is the image weight, which shouldn’t exceed 5 MB.
104
  == Screenshots ==
105
 
106
  1. The simple interface
107
+ 2. Optimization log
108
+ 3. Settings page
109
+ 4. Media library
110
 
111
  == Changelog ==
112
+ = 1.4.0 =
113
+ * Fixed: Php warning (Declaration of WRIO_Image_Statistic_Folders)
114
+
115
+ = 1.3.91 =
116
+ * Fixed: Plugin pages loaded for a very long time.
117
+ * Fixed: Bugs with error logging.
118
+ * Fixed: Error warnings have become more understandable.
119
+ * Fixed: Мigration bugs with cache plugins.
120
+ * Fixed: Bulk optimization stopped if an error occurred during image optimization.
121
+
122
  = 1.3.7 =
123
  * Fixed: Minor errors
124
 
robin-image-optimizer.php CHANGED
@@ -4,11 +4,11 @@
4
  * Plugin URI: https://wordpress.org/plugins/robin-image-optimizer/
5
  * Description: Optimize images without losing quality, speed up your website load, improve SEO and save money on server and CDN bandwidth.
6
  * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
- * Version: 1.3.7
8
  * Text Domain: robin-image-optimizer
9
  * Domain Path: /languages/
10
  * Author URI: https://robin-image-optimizer.webcraftic.com
11
- * Framework Version: FACTORY_412_VERSION
12
  */
13
 
14
  // Exit if accessed directly
@@ -77,15 +77,15 @@ $plugin_info = array(
77
 
78
  // FRAMEWORK MODULES
79
  'load_factory_modules' => array(
80
- array( 'libs/factory/bootstrap', 'factory_bootstrap_412', 'admin' ),
81
- array( 'libs/factory/forms', 'factory_forms_412', 'admin' ),
82
- array( 'libs/factory/pages', 'factory_pages_412', 'admin' ),
83
- array( 'libs/factory/clearfy', 'factory_clearfy_208', 'all' ),
84
- array( 'libs/factory/freemius', 'factory_freemius_101', 'all' )
85
  )
86
  );
87
 
88
- $wrio_compatibility = new Wbcr_Factory412_Requirements( __FILE__, array_merge( $plugin_info, array(
89
  'plugin_already_activate' => defined( 'WRIO_PLUGIN_ACTIVE' ),
90
  'required_php_version' => '5.4',
91
  'required_wp_version' => '4.2.0',
4
  * Plugin URI: https://wordpress.org/plugins/robin-image-optimizer/
5
  * Description: Optimize images without losing quality, speed up your website load, improve SEO and save money on server and CDN bandwidth.
6
  * Author: Webcraftic <wordpress.webraftic@gmail.com>
7
+ * Version: 1.4.0
8
  * Text Domain: robin-image-optimizer
9
  * Domain Path: /languages/
10
  * Author URI: https://robin-image-optimizer.webcraftic.com
11
+ * Framework Version: FACTORY_414_VERSION
12
  */
13
 
14
  // Exit if accessed directly
77
 
78
  // FRAMEWORK MODULES
79
  'load_factory_modules' => array(
80
+ array( 'libs/factory/bootstrap', 'factory_bootstrap_414', 'admin' ),
81
+ array( 'libs/factory/forms', 'factory_forms_414', 'admin' ),
82
+ array( 'libs/factory/pages', 'factory_pages_414', 'admin' ),
83
+ array( 'libs/factory/clearfy', 'factory_clearfy_209', 'all' ),
84
+ array( 'libs/factory/freemius', 'factory_freemius_103', 'all' )
85
  )
86
  );
87
 
88
+ $wrio_compatibility = new Wbcr_Factory414_Requirements( __FILE__, array_merge( $plugin_info, array(
89
  'plugin_already_activate' => defined( 'WRIO_PLUGIN_ACTIVE' ),
90
  'required_php_version' => '5.4',
91
  'required_wp_version' => '4.2.0',
views/clearfy-component-card.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
 
10
  if ( ! class_exists( 'WCL_Plugin' ) ) {
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
 
10
  if ( ! class_exists( 'WCL_Plugin' ) ) {
views/part-bulk-optimization-button.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
 
10
  $cron_running = WRIO_Plugin::app()->getPopulateOption( 'cron_running', false );
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
 
10
  $cron_running = WRIO_Plugin::app()->getPopulateOption( 'cron_running', false );
views/part-bulk-optimization-log.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
  ?>
10
  <style>
@@ -133,7 +133,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
133
  <img width="40" height="40" src="<?php echo esc_attr( $item['thumbnail_url'] ); ?>" alt="">
134
  </td>
135
  <td>
136
- <a href="<?php echo esc_attr( $item['url'] ); ?>"><?php echo esc_attr( $item['file_name'] ); ?></a>
137
  </td>
138
  <td colspan="<?php echo( $data['scope'] !== 'custom-folders' ? '6' : '5' ); ?>">
139
  <?php _e( 'Error', 'robin-image-optimizer' ); ?>:
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
  ?>
10
  <style>
133
  <img width="40" height="40" src="<?php echo esc_attr( $item['thumbnail_url'] ); ?>" alt="">
134
  </td>
135
  <td>
136
+ <a href="<?php echo esc_attr( $item['url'] ); ?>" target="_blank"><?php echo esc_attr( $item['file_name'] ); ?></a>
137
  </td>
138
  <td colspan="<?php echo( $data['scope'] !== 'custom-folders' ? '6' : '5' ); ?>">
139
  <?php _e( 'Error', 'robin-image-optimizer' ); ?>:
views/part-bulk-optimization-select-site.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
 
10
  $blogs = WIO_Multisite::getBlogs( $data['scope'] );
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
 
10
  $blogs = WIO_Multisite::getBlogs( $data['scope'] );
views/part-bulk-optimization-servers.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
  ?>
10
  <div class="wrio-servers">
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
  ?>
10
  <div class="wrio-servers">
views/part-bulk-optimization-statistic.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
  ?>
10
  <div class="wio-columns wio-page-statistic">
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
  ?>
10
  <div class="wio-columns wio-page-statistic">
views/part-bulk-optimization-tabs.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
 
10
  $tab_target = ! $data['is_premium'] ? ' target="_blank"' : '';
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
 
10
  $tab_target = ! $data['is_premium'] ? ' target="_blank"' : '';
views/part-page-header.php CHANGED
@@ -4,7 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
4
 
5
  /**
6
  * @var array $data
7
- * @var Wbcr_FactoryClearfy208_PageBase $page
8
  */
9
  ?>
10
  <div class="wbcr-factory-page-group-header" style="margin:0;">
4
 
5
  /**
6
  * @var array $data
7
+ * @var Wbcr_FactoryClearfy209_PageBase $page
8
  */
9
  ?>
10
  <div class="wbcr-factory-page-group-header" style="margin:0;">