Version Description
- Fixed: Php warning (Declaration of WRIO_Image_Statistic_Folders)
Download this release
Release Info
Developer | alexkovalevv |
Plugin | 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
- admin/activation.php +30 -2
- admin/ajax/meta-migrations.php +1 -1
- admin/assets/js/bulk-optimization.js +6 -5
- admin/boot.php +7 -7
- admin/includes/classes/class-rio-optimize-template.php +4 -4
- admin/pages/class-rio-license.php +3 -3
- admin/pages/class-rio-log.php +4 -2
- admin/pages/class-rio-page.php +1 -1
- admin/pages/class-rio-settings.php +1 -1
- includes/class-rio-plugin.php +3 -3
- includes/classes/class-rio-attachment.php +329 -232
- includes/classes/class-rio-image-statistic.php +129 -63
- includes/classes/class-rio-media-library.php +31 -53
- includes/classes/class-rio-views.php +4 -4
- includes/classes/logger/class-rio-logger.php +4 -0
- includes/classes/models/class-rio-process-queue-table.php +38 -5
- includes/functions.php +5 -4
- libs/addons/admin/ajax/folders.php +21 -5
- libs/addons/admin/assets/js/custom-folders.js +4 -4
- libs/addons/admin/boot.php +1 -1
- libs/addons/includes/classes/webp/class-webp-listener.php +9 -11
- libs/addons/includes/functions.php +110 -0
- libs/addons/views/modal-select-custom-folders.php +1 -1
- libs/addons/views/part-bulk-optimization-table-folders.php +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css +2 -2
- libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/control.checkbox.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/control.dropdown.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css +1 -1
- libs/factory/bootstrap/assets/css-min/holder.more-link.min.css +1 -1
- libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js +1 -1
- libs/factory/bootstrap/assets/js-min/control.checkbox.min.js +1 -1
- libs/factory/bootstrap/assets/js-min/control.dropdown.min.js +1 -1
- libs/factory/bootstrap/assets/js-min/control.list.min.js +1 -1
- libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js +1 -1
- libs/factory/bootstrap/boot.php +6 -6
- libs/factory/bootstrap/includes/functions.php +250 -248
- libs/factory/clearfy/assets/css/clearfy-base.css +24 -24
- libs/factory/clearfy/assets/js/globals.js +15 -15
- libs/factory/clearfy/assets/js/license-manager.js +4 -4
- libs/factory/clearfy/boot.php +13 -13
- libs/factory/clearfy/includes/ajax-handlers.php +8 -8
- libs/factory/clearfy/includes/check-clearfy-compatibility.php +11 -11
- libs/factory/clearfy/includes/class-clearfy-configurate.php +4 -4
- libs/factory/clearfy/includes/class-clearfy-helpers.php +2 -2
- libs/factory/clearfy/langs/{wbcr_factory_clearfy_208-ru_RU.mo → wbcr_factory_clearfy_209-ru_RU.mo} +0 -0
- libs/factory/clearfy/langs/{wbcr_factory_clearfy_208-ru_RU.po → wbcr_factory_clearfy_209-ru_RU.po} +0 -0
- libs/factory/clearfy/pages/class-clearfy-license.php +32 -32
- libs/factory/clearfy/pages/class-clearfy-more-features.php +24 -24
- libs/factory/clearfy/pages/class-clearfy-pages.php +42 -42
- libs/factory/core/boot.php +27 -27
- libs/factory/core/includes/activation/class-factory-activator.php +3 -3
- libs/factory/core/includes/activation/class-factory-update.php +3 -3
- libs/factory/core/includes/assets-managment/class-factory-assets-list.php +4 -4
- libs/factory/core/includes/assets-managment/class-factory-script-list.php +2 -2
- libs/factory/core/includes/assets-managment/class-factory-style-list.php +1 -1
- libs/factory/core/includes/class-check-compatibility.php +3 -3
- libs/factory/core/includes/class-factory-migrations.php +187 -140
- libs/factory/core/includes/class-factory-notices.php +5 -5
- libs/factory/core/includes/class-factory-options.php +1 -1
- libs/factory/core/includes/class-factory-plugin-abstract.php +154 -93
- libs/factory/core/includes/class-factory-plugin-base.php +16 -19
- libs/factory/core/includes/class-factory-requests.php +1 -1
- libs/factory/core/includes/class-factory-requirements.php +7 -7
- libs/factory/core/includes/entities/class-factory-paths.php +1 -1
- libs/factory/core/includes/entities/class-factory-support.php +1 -1
- libs/factory/core/includes/functions.php +7 -7
- libs/factory/core/includes/premium/class-factory-license-interface.php +1 -1
- libs/factory/core/includes/premium/class-factory-manager.php +11 -11
- libs/factory/core/includes/premium/class-factory-provider-abstract.php +6 -6
- libs/factory/core/includes/updates/class-factory-premium-upgrader.php +15 -15
- libs/factory/core/includes/updates/class-factory-upgrader.php +7 -7
- libs/factory/core/includes/updates/repositories/class-factory-repository-abstract.php +5 -5
- libs/factory/core/includes/updates/repositories/class-factory-wordpress.php +4 -4
- libs/factory/core/langs/{wbcr_factory_412-ru_RU.mo → wbcr_factory_414-ru_RU.mo} +0 -0
- libs/factory/core/langs/{wbcr_factory_412-ru_RU.po → wbcr_factory_414-ru_RU.po} +0 -0
- libs/factory/forms/boot.php +95 -95
- libs/factory/forms/controls/checkbox.php +4 -4
- libs/factory/forms/controls/color-and-opacity.php +4 -4
- libs/factory/forms/controls/color.php +2 -2
- libs/factory/forms/controls/customs/html.php +2 -2
- libs/factory/forms/controls/customs/separator.php +2 -2
- libs/factory/forms/controls/datepicker-range.php +4 -4
- libs/factory/forms/controls/dropdown-and-colors.php +6 -6
- libs/factory/forms/controls/dropdown.php +5 -5
- libs/factory/forms/controls/font.php +11 -11
- libs/factory/forms/controls/google-font.php +8 -8
- libs/factory/forms/controls/gradient.php +4 -4
- libs/factory/forms/controls/hidden.php +2 -2
- libs/factory/forms/controls/holders/accordion-item.php +2 -2
- libs/factory/forms/controls/holders/accordion.php +2 -2
- libs/factory/forms/controls/holders/columns.php +2 -2
- libs/factory/forms/controls/holders/control-group-item.php +2 -2
- libs/factory/forms/controls/holders/control-group.php +3 -3
- libs/factory/forms/controls/holders/div.php +2 -2
- libs/factory/forms/controls/holders/form-group.php +2 -2
- libs/factory/forms/controls/holders/more-link.php +2 -2
- libs/factory/forms/controls/holders/tab-item.php +2 -2
- libs/factory/forms/controls/holders/tab.php +4 -4
- libs/factory/forms/controls/integer.php +2 -2
- libs/factory/forms/controls/list.php +4 -4
- libs/factory/forms/controls/multiple-textbox.php +3 -3
- libs/factory/forms/controls/paddings-editor.php +3 -3
- libs/factory/forms/controls/pattern.php +9 -9
- libs/factory/forms/controls/radio-colors.php +2 -2
- libs/factory/forms/controls/radio.php +2 -2
- libs/factory/forms/controls/textarea.php +2 -2
- libs/factory/forms/controls/textbox.php +2 -2
- libs/factory/forms/controls/url.php +3 -3
- libs/factory/forms/controls/wp-editor.php +3 -3
- libs/factory/forms/includes/complex-control.class.php +4 -4
- libs/factory/forms/includes/control-holder.class.php +5 -5
- libs/factory/forms/includes/control.class.php +5 -5
- libs/factory/forms/includes/custom-element.class.php +2 -2
- libs/factory/forms/includes/form-element.class.php +7 -7
- libs/factory/forms/includes/form-layout.class.php +5 -5
- libs/factory/forms/includes/form.class.php +39 -39
- libs/factory/forms/includes/holder.class.php +6 -6
- libs/factory/forms/includes/html-builder.class.php +2 -2
- libs/factory/forms/includes/providers/meta-value-provider.class.php +2 -2
- libs/factory/forms/includes/providers/options-value-provider.class.php +3 -3
- libs/factory/forms/includes/providers/value-provider.interface.php +2 -2
- libs/factory/forms/langs/{wbcr_factory_forms_412-ru_RU.mo → wbcr_factory_forms_414-ru_RU.mo} +0 -0
- libs/factory/forms/langs/{wbcr_factory_forms_412-ru_RU.po → wbcr_factory_forms_414-ru_RU.po} +0 -0
- libs/factory/forms/layouts/bootstrap-3/bootstrap-3.php +7 -7
- libs/factory/freemius/boot.php +13 -13
- libs/factory/freemius/includes/class-freemius-api.php +7 -7
- libs/factory/freemius/includes/entities/class-freemius-entity.php +1 -1
- libs/factory/freemius/includes/entities/class-freemius-license.php +2 -2
- libs/factory/freemius/includes/entities/class-freemius-plugin.php +1 -1
- libs/factory/freemius/includes/entities/class-freemius-scope.php +1 -1
- libs/factory/freemius/includes/entities/class-freemius-site.php +1 -1
- libs/factory/freemius/includes/entities/class-freemius-user.php +1 -1
- libs/factory/freemius/includes/licensing/class-freemius-provider.php +25 -19
- libs/factory/freemius/includes/updates/class-freemius-repository.php +7 -7
- libs/factory/pages/boot.php +10 -10
- libs/factory/pages/includes/admin-page.class.php +6 -6
- libs/factory/pages/includes/page.class.php +6 -6
- libs/factory/pages/langs/{wbcr_factory_pages_412-fr_FR.mo → wbcr_factory_pages_414-fr_FR.mo} +0 -0
- libs/factory/pages/langs/{wbcr_factory_pages_412-fr_FR.po → wbcr_factory_pages_414-fr_FR.po} +0 -0
- libs/factory/pages/langs/{wbcr_factory_pages_412-ru_RU.mo → wbcr_factory_pages_414-ru_RU.mo} +0 -0
- libs/factory/pages/langs/{wbcr_factory_pages_412-ru_RU.po → wbcr_factory_pages_414-ru_RU.po} +0 -0
- libs/factory/pages/pages.php +11 -11
- libs/factory/pages/templates/assets/css/impressive.page.template.css +116 -116
- libs/factory/pages/templates/impressive-page.class.php +31 -31
- migrations/010009.php +30 -2
- migrations/010300.php +22 -14
- migrations/010306.php +31 -8
- migrations/010309.php +87 -0
- readme.txt +17 -1
- robin-image-optimizer.php +8 -8
- views/clearfy-component-card.php +1 -1
- views/part-bulk-optimization-button.php +1 -1
- views/part-bulk-optimization-log.php +2 -2
- views/part-bulk-optimization-select-site.php +1 -1
- views/part-bulk-optimization-servers.php +1 -1
- views/part-bulk-optimization-statistic.php +1 -1
- views/part-bulk-optimization-tabs.php +1 -1
- 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
|
9 |
* @version 1.0
|
10 |
*/
|
11 |
|
@@ -14,7 +14,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
class WIO_Activation extends
|
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 |
-
|
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 = $.
|
293 |
|
294 |
setTimeout(function() {
|
295 |
-
$.
|
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.
|
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 |
-
|
|
|
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-
|
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
|
130 |
-
* @param
|
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
|
150 |
*
|
151 |
* @return bool
|
152 |
*/
|
153 |
-
/*add_action('
|
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( '
|
178 |
|
179 |
/**
|
180 |
* Widget with the offer to buy Clearfy Business
|
181 |
*
|
182 |
* @param array $widgets
|
183 |
* @param string $position
|
184 |
-
* @param
|
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
|
30 |
*
|
31 |
* @throws Exception
|
32 |
*/
|
33 |
|
34 |
-
/*public function showPageContent(
|
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( '
|
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( '
|
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
|
13 |
|
14 |
/**
|
15 |
* {@inheritdoc}
|
@@ -43,9 +43,9 @@ class WRIO_License_Page extends Wbcr_FactoryClearfy208_LicensePage {
|
|
43 |
|
44 |
/**
|
45 |
* {@inheritdoc}
|
46 |
-
* @param
|
47 |
*/
|
48 |
-
public function __construct(
|
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.
|
108 |
},
|
109 |
error: function(jqXHR, textStatus, errorThrown) {
|
110 |
-
jQuery.
|
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
|
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
|
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
|
15 |
|
16 |
/**
|
17 |
-
* @var
|
18 |
*/
|
19 |
private static $app;
|
20 |
|
@@ -89,7 +89,7 @@ class WRIO_Plugin extends Wbcr_Factory412_Plugin {
|
|
89 |
/**
|
90 |
* Статический метод для быстрого доступа к информации о плагине, а также часто использумых методах.
|
91 |
*
|
92 |
-
* @return
|
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
|
12 |
* @copyright (c) 2018, Webcraftic
|
13 |
-
* @version
|
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
|
51 |
-
* @param array|false $attachment_meta
|
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 |
-
|
64 |
-
|
65 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
}
|
|
|
|
|
|
|
67 |
}
|
68 |
-
|
69 |
/**
|
70 |
* Актуализирует мета данные аттачмента и загружает актуальные мета данные и данные по оптимизации из базы.
|
71 |
*/
|
72 |
-
public function reload() {
|
73 |
-
|
74 |
-
|
|
|
|
|
|
|
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(
|
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 =
|
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 =
|
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 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
|
|
|
|
|
|
|
|
|
|
162 |
$results['result_status'] = 'error';
|
163 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
'error' => 'path',
|
165 |
-
'error_msg' =>
|
166 |
-
|
167 |
-
|
|
|
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 =
|
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(
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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(
|
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(
|
417 |
'optimized_img_url' => $thumbnail['optimized_img_url'],
|
418 |
-
|
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(
|
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
|
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 =
|
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(
|
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
|
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
|
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
|
607 |
-
* @param string $image_size
|
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
|
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
|
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 =
|
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 =
|
151 |
} else {
|
152 |
$optimized_images_percent = 0;
|
153 |
}
|
@@ -166,9 +166,13 @@ class WRIO_Image_Statistic {
|
|
166 |
}
|
167 |
|
168 |
/**
|
169 |
-
*
|
|
|
|
|
|
|
|
|
170 |
*/
|
171 |
-
public function
|
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
|
191 |
*
|
192 |
* @return array {
|
193 |
-
*
|
194 |
-
*
|
195 |
-
*
|
196 |
-
*
|
197 |
-
*
|
198 |
-
*
|
199 |
-
*
|
200 |
-
*
|
201 |
-
*
|
202 |
-
*
|
203 |
-
*
|
204 |
-
* {type} string $total_saving Процент оптимизации главного файла и превьюшек
|
205 |
* }
|
206 |
*/
|
207 |
public function get_last_optimized_images( $limit = 100 ) {
|
208 |
global $wpdb;
|
209 |
|
210 |
-
$
|
211 |
$db_table = RIO_Process_Queue::table_name();
|
212 |
-
$sql = $wpdb->prepare( "SELECT
|
213 |
-
|
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 |
-
|
|
|
|
|
223 |
}
|
224 |
|
225 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
226 |
|
227 |
-
if (
|
228 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
229 |
}
|
230 |
|
231 |
-
|
232 |
-
|
233 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
$
|
244 |
-
'
|
245 |
-
'
|
246 |
-
'
|
247 |
-
'
|
248 |
-
|
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
|
269 |
-
$
|
270 |
}
|
271 |
|
272 |
$webp_size = $extra_data->get_webp_main_size();
|
273 |
|
274 |
if ( $webp_size ) {
|
275 |
-
$
|
276 |
}
|
277 |
|
278 |
-
$
|
|
|
279 |
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
284 |
}
|
285 |
|
286 |
-
|
287 |
-
|
288 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
289 |
}
|
290 |
|
291 |
-
$
|
|
|
|
|
|
|
292 |
}
|
293 |
|
294 |
-
return $
|
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',
|
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
|
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 |
-
$
|
86 |
-
|
|
|
|
|
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 |
-
$
|
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 |
-
|
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 |
-
|
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
|
264 |
-
|
265 |
-
|
266 |
-
|
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
|
277 |
-
|
278 |
-
|
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 |
-
$
|
292 |
-
|
293 |
-
|
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->
|
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
|
67 |
*
|
68 |
* @return bool|string The page contents. False if the template doesn't exist.
|
69 |
*/
|
70 |
-
public function get_template( $template, $data = [],
|
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
|
96 |
*/
|
97 |
-
public function print_template( $template, $data = [],
|
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 |
-
|
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 |
-
|
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 =
|
352 |
|
353 |
-
if (
|
354 |
return false;
|
355 |
}
|
356 |
|
@@ -361,8 +362,8 @@ function wbcr_rio_has_meta_to_migrate() {
|
|
361 |
return true;
|
362 |
}
|
363 |
|
364 |
-
if ( 1 ===
|
365 |
-
|
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(
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
$exclude_dirs = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
$upload_dir_path . 'wio_backup',
|
43 |
-
'
|
44 |
-
'
|
|
|
|
|
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 = $.
|
90 |
|
91 |
setTimeout(function() {
|
92 |
-
$.
|
93 |
}, 5000);
|
94 |
}
|
95 |
return;
|
@@ -150,10 +150,10 @@
|
|
150 |
if( response.data && response.data.error_message ) {
|
151 |
// todo: так как фреймворк не используется в аддоне, нужно доработать этот кусок кода. Он не
|
152 |
// может быть скомпилирован.
|
153 |
-
var noticeId = $.
|
154 |
|
155 |
setTimeout(function() {
|
156 |
-
$.
|
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
|
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 |
-
|
|
|
|
|
|
|
|
|
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', '
|
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 |
-
|
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
|
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
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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('
|
23 |
return;
|
24 |
}
|
25 |
-
define('
|
26 |
|
27 |
-
define('
|
28 |
-
define('
|
29 |
|
30 |
// sets version of admin interface
|
31 |
-
define('
|
32 |
|
33 |
if( !defined('FACTORY_FLAT_ADMIN') ) {
|
34 |
define('FACTORY_FLAT_ADMIN', true);
|
35 |
}
|
36 |
|
37 |
-
include_once(
|
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 |
-
*
|
4 |
*
|
5 |
-
* @
|
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 |
-
|
19 |
-
|
20 |
-
$manager = new Wbcr_FactoryBootstrap412_Manager($plugin);
|
21 |
-
$plugin->setBootstap($manager);
|
22 |
-
}
|
23 |
-
|
24 |
-
if( !class_exists('Wbcr_FactoryBootstrap412_Manager') ) {
|
25 |
-
|
26 |
/**
|
27 |
-
*
|
28 |
*
|
29 |
* @since 3.2.0
|
|
|
30 |
*/
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
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 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
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 |
-
|
144 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
}
|
146 |
-
|
147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
}
|
|
|
149 |
|
150 |
-
|
151 |
-
$
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
}
|
158 |
-
|
159 |
-
|
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 |
-
|
188 |
-
|
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 |
-
*
|
204 |
-
*
|
205 |
-
* @
|
206 |
*/
|
207 |
-
|
208 |
-
{
|
209 |
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
$cache_dir_url = FACTORY_BOOTSTRAP_412_URL . '/assets/cache/';
|
214 |
|
215 |
-
|
216 |
-
|
217 |
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
}
|
224 |
} else {
|
225 |
-
$
|
226 |
-
|
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 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
|
|
|
|
|
|
246 |
} else {
|
247 |
-
|
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 |
-
|
259 |
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
|
|
264 |
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
}
|
271 |
}
|
272 |
}
|
273 |
}
|
274 |
}
|
|
|
275 |
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
: ' factory-volumetric ';
|
288 |
|
289 |
-
|
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-
|
9 |
padding: 30px 80px;
|
10 |
}
|
11 |
-
#WBCR .wbcr-factory-pages-
|
12 |
margin: 0 0 20px;
|
13 |
}
|
14 |
-
#WBCR .wbcr-factory-pages-
|
15 |
border: 2px dashed #8bc34a;
|
16 |
background: #fff;
|
17 |
padding: 20px;
|
18 |
}
|
19 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
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-
|
44 |
outline: none;
|
45 |
border: 0;
|
46 |
}
|
47 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
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-
|
72 |
outline: none;
|
73 |
border: 0;
|
74 |
}
|
75 |
-
#WBCR .wbcr-factory-pages-
|
76 |
background: #fff;
|
77 |
color: #353535;
|
78 |
font-weight: 600;
|
79 |
border: 2px dashed #8bc34a;
|
80 |
}
|
81 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
93 |
position: relative;
|
94 |
margin-bottom: 20px;
|
95 |
}
|
96 |
-
#WBCR .wbcr-factory-pages-
|
97 |
font-size: 15px;
|
98 |
padding: 7px;
|
99 |
padding-left: 20px;
|
100 |
}
|
101 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
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-
|
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-
|
140 |
outline: none;
|
141 |
border: 0;
|
142 |
}
|
143 |
@media screen and (max-width: 1550px) {
|
144 |
-
#WBCR .wbcr-factory-pages-
|
145 |
padding: 10px 80px;
|
146 |
}
|
147 |
-
#WBCR .wbcr-factory-pages-
|
148 |
padding: 10px;
|
149 |
}
|
150 |
-
#WBCR .wbcr-factory-pages-
|
151 |
margin: 0 0 20px;
|
152 |
padding: 10px 0;
|
153 |
font-size: 13px;
|
154 |
font-weight: 600;
|
155 |
}
|
156 |
-
#WBCR .wbcr-factory-pages-
|
157 |
margin-bottom: 20px;
|
158 |
}
|
159 |
-
#WBCR .wbcr-factory-pages-
|
160 |
font-size: 13px;
|
161 |
padding: 2px;
|
162 |
padding-left: 10px;
|
163 |
}
|
164 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
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 |
-
* $.
|
6 |
-
* $.
|
7 |
*
|
8 |
* Copyright 2018, Webcraftic, http://webcraftic.com
|
9 |
*
|
@@ -13,11 +13,11 @@
|
|
13 |
(function($) {
|
14 |
'use strict';
|
15 |
|
16 |
-
if( !$.
|
17 |
-
$.
|
18 |
}
|
19 |
|
20 |
-
$.
|
21 |
/**
|
22 |
* Создает и показывает уведомление внутри интерфейса Clearfy
|
23 |
*
|
@@ -63,12 +63,12 @@
|
|
63 |
/**
|
64 |
* Хук выполняет проивольную функцию, после того как уведомление отображено
|
65 |
* Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
|
66 |
-
* Пример регистрации хука $.
|
67 |
* function(noticeId) {});
|
68 |
* @param {string} noticeId - id уведомления
|
69 |
*/
|
70 |
-
$.
|
71 |
-
$.
|
72 |
});
|
73 |
|
74 |
return noticeId;
|
@@ -93,13 +93,13 @@
|
|
93 |
/**
|
94 |
* Хук выполняет проивольную функцию, после того как уведомление скрыто
|
95 |
* Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
|
96 |
-
* Пример регистрации хука $.
|
97 |
* function(noticeId)
|
98 |
* {});
|
99 |
* @param {string} noticeId - id уведомления
|
100 |
*/
|
101 |
-
$.
|
102 |
-
$.
|
103 |
});
|
104 |
},
|
105 |
|
@@ -116,7 +116,7 @@
|
|
116 |
|
117 |
};
|
118 |
|
119 |
-
$.
|
120 |
|
121 |
/**
|
122 |
* A set of registered filters.
|
@@ -183,20 +183,20 @@
|
|
183 |
}
|
184 |
};
|
185 |
|
186 |
-
$.
|
187 |
|
188 |
/**
|
189 |
* Applies filters to a given input value.
|
190 |
*/
|
191 |
run: function(filterName, args) {
|
192 |
-
$.
|
193 |
},
|
194 |
|
195 |
/**
|
196 |
* Registers a new filter.
|
197 |
*/
|
198 |
add: function(filterName, callback, priority) {
|
199 |
-
$.
|
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 |
-
$.
|
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 = $.
|
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 = $.
|
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 = $.
|
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( '
|
18 |
return;
|
19 |
}
|
20 |
|
21 |
-
define( '
|
22 |
|
23 |
-
define( '
|
24 |
|
25 |
-
define( '
|
26 |
-
define( '
|
27 |
|
28 |
-
load_plugin_textdomain( '
|
29 |
|
30 |
-
require(
|
31 |
-
require(
|
32 |
-
require(
|
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-
|
42 |
} );
|
43 |
|
44 |
// TODO: Предполагается, что загрузка модуля pages будет раньше этого модуля.
|
45 |
-
require(
|
46 |
-
require(
|
47 |
-
require(
|
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
|
18 |
*
|
19 |
* @since 2.0.7
|
20 |
*
|
21 |
*/
|
22 |
-
function
|
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!', '
|
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)', '
|
41 |
} else {
|
42 |
$plugin_instance->premium->activate( $license_key );
|
43 |
-
$success_message = __( 'Your license has been successfully activated', '
|
44 |
}
|
45 |
break;
|
46 |
case 'deactivate':
|
47 |
$plugin_instance->premium->deactivate();
|
48 |
-
$success_message = __( 'The license is deactivated', '
|
49 |
break;
|
50 |
case 'sync':
|
51 |
$plugin_instance->premium->sync();
|
52 |
-
$success_message = __( 'The license has been updated', '
|
53 |
break;
|
54 |
case 'unsubscribe':
|
55 |
$plugin_instance->premium->cancel_paid_subscription();
|
56 |
-
$success_message = __( 'Subscription success cancelled', '
|
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', '
|
263 |
-
$phrase = sprintf(__('The %s component', '
|
264 |
} else {
|
265 |
-
$notice_default_text .= '<b>' . $this->plugin_title . ' ' . __('warning', '
|
266 |
-
$phrase = sprintf(__('The %s plugin', '
|
267 |
}
|
268 |
|
269 |
-
$notice_default_text .= $phrase . ' ' . __('has stopped.', '
|
270 |
-
$notice_default_text .= __('Possible reasons:', '
|
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!', '
|
277 |
}
|
278 |
|
279 |
if( !$this->isWpCompatibility() ) {
|
280 |
$has_one = true;
|
281 |
-
$notice_text .= '- ' . sprintf(__('You need to update WordPress to %s or higher!', '
|
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!', '
|
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.', '
|
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!', '
|
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('
|
18 |
|
19 |
-
abstract class
|
20 |
|
21 |
/**
|
22 |
-
* @param
|
23 |
*/
|
24 |
-
public function __construct(
|
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('
|
19 |
-
class
|
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
|
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\
|
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\
|
74 |
*/
|
75 |
protected $premium_license;
|
76 |
|
@@ -79,9 +79,9 @@ class Wbcr_FactoryClearfy208_LicensePage extends Wbcr_FactoryClearfy208_PageBase
|
|
79 |
|
80 |
/**
|
81 |
* {@inheritdoc}
|
82 |
-
* @param
|
83 |
*/
|
84 |
-
public function __construct(
|
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(
|
108 |
-
$this->scripts->add(
|
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 |
-
|
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
|
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-
|
222 |
id="license-manager">
|
223 |
<div>
|
224 |
-
<h3><?php printf( __( 'Activate %s', '
|
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(), '
|
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', '
|
242 |
</span>
|
243 |
</a>
|
244 |
-
<p><?php printf( __( 'Your current license for %1$s:', '
|
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', '
|
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', '
|
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.', '
|
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>', '
|
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.', '
|
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', '
|
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', '
|
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', '
|
301 |
<?php echo esc_attr( $this->premium_license->get_sites_quota() ); ?></span>
|
302 |
-
<span class="license-value-name"><?php _e( 'active sites', '
|
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!', '
|
313 |
-
<span class="license-value-name"><?php _e( 'please update the key', '
|
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)', '
|
324 |
</span>
|
325 |
-
<span class="license-value-name"><?php _e( 'remained', '
|
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:', '
|
337 |
<?php else: ?>
|
338 |
-
<p><?php _e( 'Have a key to activate the plugin? Paste it here:', '
|
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', '
|
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!', '
|
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.', '
|
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('
|
18 |
|
19 |
-
class
|
20 |
|
21 |
public $id = "more_features";
|
22 |
|
@@ -26,9 +26,9 @@
|
|
26 |
|
27 |
public $type = 'page';
|
28 |
|
29 |
-
public function __construct(
|
30 |
{
|
31 |
-
$this->menu_title = __('More features (<b>free</b>)', '
|
32 |
|
33 |
parent::__construct($plugin);
|
34 |
|
@@ -37,7 +37,7 @@
|
|
37 |
|
38 |
public function getPageTitle()
|
39 |
{
|
40 |
-
return __('More features', '
|
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', '
|
52 |
|
53 |
-
<p><?php _e('Clears the source code of the page from unused code.', '
|
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', '
|
61 |
|
62 |
-
<p><?php _e('Removes duplicate pages, closes external links, changes the headers of the server.', '
|
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', '
|
70 |
|
71 |
-
<p><?php _e('Enables and disables features that improve the protection of your site.', '
|
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', '
|
79 |
|
80 |
-
<p><?php _e('Disables comments on the entire site or on specific pages.', '
|
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', '
|
88 |
|
89 |
<p><?php _e('Enables or disables automatically updates for plugins, themes and core. It is also possible
|
90 |
-
to disable all updates.', '
|
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', '
|
98 |
|
99 |
-
<p><?php _e('Allows you to remove unused widgets.', '
|
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', '
|
107 |
|
108 |
-
<p><?php _e('Increases performance by disabling unused functions and reducing the number of requests.', '
|
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', '
|
116 |
|
117 |
<p><?php _e('Allows you to hide the version of the site and plugins. Allows you to hide your
|
118 |
-
WordPress.', '
|
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', '
|
126 |
|
127 |
-
<p><?php _e('In quick mode, you can easily configure the plugin according to your needs.', '
|
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', '
|
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
|
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( '
|
27 |
|
28 |
-
class
|
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
|
55 |
*/
|
56 |
-
public function __construct(
|
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
|
87 |
*
|
88 |
-
* @param
|
89 |
-
* @param
|
90 |
*
|
91 |
* @return void
|
92 |
*/
|
93 |
public function assets( $scripts, $styles ) {
|
94 |
parent::assets( $scripts, $styles );
|
95 |
|
96 |
-
$this->styles->add(
|
97 |
|
98 |
// todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
|
99 |
if ( defined( 'WCL_PLUGIN_URL' ) ) {
|
100 |
$this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
|
101 |
}
|
102 |
|
103 |
-
|
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
|
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 =
|
194 |
-
$upgrade_price =
|
195 |
|
196 |
-
$html = '<div class="wbcr-factory-clearfy-
|
197 |
$html .= '<div class="wbcr-factory-inner-contanier">';
|
198 |
-
$html .= '<h3>' . __( 'Upgrade to Clearfy Business', '
|
199 |
-
$html .= '<p>' . __( 'Oops... Sorry for the inconvenience caused!', '
|
200 |
-
$html .= '<p>' . __( 'Complete multisite support is available in Clearfy Business and Clearfy Business Revolution packages only!', '
|
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!', '
|
202 |
$html .= '<p style="margin-top:20px">';
|
203 |
-
$html .= '<a href="' . $license_page_url . '" class="wbcr-factory-activate-premium" rel="noopener">' . __( 'Activate license ', '
|
204 |
-
$html .= '<a href="' . $upgrade_url . '" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">' . sprintf( __( 'Upgrade to Clearfy Business for $%d', '
|
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 =
|
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;', '
|
261 |
-
'40_premium' => __( '40 new premium components within a year for the single price;', '
|
262 |
-
'multisite_support' => __( 'Multisite support;', '
|
263 |
-
'advance_settings' => __( 'Advanced settings;', '
|
264 |
-
'no_ads' => __( 'No ads;', '
|
265 |
-
'perfect_support' => __( 'Perfect support.', '
|
266 |
);
|
267 |
|
268 |
/**
|
269 |
* @since 2.0.8 - added
|
270 |
*/
|
271 |
-
$suggetion_title = __( 'MORE IN CLEARFY <span>BUSINESS</span>', '
|
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 =
|
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-
|
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', '
|
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.', '
|
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.', '
|
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.', '
|
330 |
</li>
|
331 |
</ul>
|
332 |
----------<br>
|
333 |
-
<p><?php _e( 'Hover to the icon to get help for the feature you selected.', '
|
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( '
|
346 |
|
347 |
?>
|
348 |
<div class="wbcr-factory-sidebar-widget">
|
349 |
<p>
|
350 |
-
<strong><?php _e( 'Do you want the plugin to improved and update?', '
|
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.', '
|
353 |
-
<p><?php _e( 'And also write your ideas on how to extend or improve the plugin.', '
|
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', '
|
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', '
|
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="<?=
|
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( '
|
18 |
return;
|
19 |
}
|
20 |
|
21 |
-
define( '
|
22 |
|
23 |
-
define( '
|
24 |
|
25 |
-
define( '
|
26 |
-
define( '
|
27 |
|
28 |
-
load_plugin_textdomain( '
|
29 |
|
30 |
#comp merge
|
31 |
-
require_once(
|
32 |
|
33 |
-
require_once(
|
34 |
-
require_once(
|
35 |
|
36 |
-
require_once(
|
37 |
-
require_once(
|
38 |
-
require_once(
|
39 |
-
require_once(
|
40 |
-
require_once(
|
41 |
|
42 |
// ASSETS
|
43 |
-
require_once(
|
44 |
-
require_once(
|
45 |
-
require_once(
|
46 |
|
47 |
// PREMIUM
|
48 |
-
require_once(
|
49 |
-
require_once(
|
50 |
-
require_once(
|
51 |
|
52 |
// UPDATES
|
53 |
-
require_once(
|
54 |
-
require_once(
|
55 |
-
require_once(
|
56 |
-
require_once(
|
57 |
|
58 |
-
require_once(
|
59 |
|
60 |
-
require_once(
|
61 |
-
require_once(
|
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
|
23 |
|
24 |
/**
|
25 |
* Curent plugin.
|
26 |
-
* @var
|
27 |
*/
|
28 |
public $plugin;
|
29 |
|
30 |
-
public function __construct(
|
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
|
24 |
|
25 |
/**
|
26 |
* Current plugin
|
27 |
-
* @var
|
28 |
*/
|
29 |
var $plugin;
|
30 |
|
31 |
-
public function __construct(
|
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
|
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
|
33 |
*/
|
34 |
protected $plugin;
|
35 |
|
36 |
/**
|
37 |
-
* @param
|
38 |
* @param bool $defaultIsFooter
|
39 |
*/
|
40 |
-
public function __construct(
|
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
|
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
|
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
|
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.', '
|
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!', '
|
90 |
}
|
91 |
|
92 |
if( !$this->isWpCompatibility() ) {
|
93 |
$has_one = true;
|
94 |
-
$notice_text .= '- ' . sprintf(__('You need to update WordPress to %s or higher!', '
|
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\
|
4 |
|
5 |
use Exception;
|
6 |
-
use
|
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 |
-
*
|
25 |
-
* @
|
|
|
26 |
* @copyright (c) 2018 Webraftic Ltd
|
27 |
-
* @
|
28 |
*/
|
29 |
class Migrations {
|
30 |
-
|
31 |
protected $plugin;
|
32 |
-
|
33 |
/**
|
34 |
* Migrations constructor.
|
35 |
*
|
36 |
-
* @param
|
37 |
*
|
38 |
* @throws Exception
|
39 |
*/
|
40 |
-
public function __construct(
|
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",
|
51 |
-
|
52 |
-
add_action( "wbcr/factory/plugin_{$plugin_name}
|
53 |
-
add_action( "wbcr_factory_notices_000_list",
|
54 |
-
add_action( "wbcr_factory_notices_000_list",
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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', '
|
108 |
-
|
109 |
-
$notices[] =
|
110 |
'id' => 'migration_debug_bar',
|
111 |
'type' => 'error',
|
112 |
'dismissible' => false,
|
113 |
'dismiss_expires' => 0,
|
114 |
-
'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', '
|
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:", "
|
137 |
-
|
138 |
-
$notice_text .= __( "Old plugin version (debug):", "
|
139 |
-
$notice_text .= __( "Current plugin version:", "
|
140 |
-
$notice_text .= __( "Need migration:", "
|
141 |
-
$notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "
|
142 |
-
|
143 |
-
$notices[] =
|
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', '
|
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->
|
166 |
-
|
167 |
if ( ! $activated ) {
|
168 |
-
$this->plugin->
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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',
|
203 |
} else {
|
204 |
-
$plugin_versions = get_option( 'factory_plugin_versions',
|
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(
|
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 |
-
|
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->
|
|
|
|
|
|
|
|
|
|
|
|
|
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->
|
|
|
|
|
|
|
|
|
|
|
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',
|
339 |
} else {
|
340 |
-
$plugin_versions = get_option( 'factory_plugin_versions',
|
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 |
-
|
353 |
-
|
354 |
-
|
355 |
-
}
|
356 |
-
update_option( 'factory_plugin_versions', $plugin_versions );
|
357 |
}
|
358 |
-
|
359 |
-
|
360 |
-
|
|
|
|
|
|
|
|
|
361 |
}
|
362 |
-
|
363 |
/**
|
364 |
* Converts string representation of the version to the numeric.
|
365 |
*
|
366 |
* @since 1.0.0
|
367 |
*
|
368 |
-
* @param string $version
|
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
|
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
|
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
|
408 |
-
* @param bool
|
409 |
*/
|
410 |
private function find_file_or_folders( $path, $areFiles = true ) {
|
411 |
if ( ! is_dir( $path ) ) {
|
412 |
-
return
|
413 |
}
|
414 |
-
|
415 |
$entries = scandir( $path );
|
416 |
if ( empty( $entries ) ) {
|
417 |
-
return
|
418 |
}
|
419 |
-
|
420 |
-
$files =
|
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[] =
|
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 =
|
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.', '
|
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 ] =
|
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\
|
4 |
|
5 |
-
use
|
6 |
|
7 |
// Exit if accessed directly
|
8 |
if ( ! defined( 'ABSPATH' ) ) {
|
@@ -28,7 +28,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
28 |
class Notices {
|
29 |
|
30 |
/**
|
31 |
-
* @var
|
32 |
*/
|
33 |
protected $plugin;
|
34 |
/**
|
@@ -59,7 +59,7 @@ class Notices {
|
|
59 |
/**
|
60 |
* Инициализируем уведомлений сразу после загрузки модуля уведомлений
|
61 |
*
|
62 |
-
* @param
|
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 =
|
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\
|
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
|
18 |
|
19 |
/**
|
20 |
-
* Instance class
|
21 |
*
|
22 |
-
* @var
|
23 |
*/
|
24 |
public $request;
|
25 |
|
26 |
/**
|
27 |
-
* @var \WBCR\
|
28 |
*/
|
29 |
public $premium;
|
30 |
|
31 |
/**
|
32 |
* The Bootstrap Manager class
|
33 |
*
|
34 |
-
* @var
|
35 |
*/
|
36 |
public $bootstrap;
|
37 |
|
38 |
/**
|
39 |
* The Bootstrap Manager class
|
40 |
*
|
41 |
-
* @var
|
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[]
|
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
|
82 |
-
//$this->route = new
|
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
|
112 |
*/
|
113 |
-
public function setBootstap(
|
114 |
$this->bootstrap = $bootstrap;
|
115 |
}
|
116 |
|
117 |
/**
|
118 |
-
* @param
|
119 |
*/
|
120 |
-
public function setForms(
|
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( '
|
164 |
-
throw new Exception( 'The
|
165 |
}
|
166 |
|
167 |
-
|
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/
|
223 |
return;
|
224 |
}
|
225 |
|
226 |
/**
|
|
|
|
|
227 |
* @since 4.1.1 - deprecated
|
228 |
*/
|
229 |
-
|
230 |
$this
|
231 |
], '4.1.1', "wbcr/factory/plugin_activation" );
|
232 |
|
233 |
/**
|
234 |
-
*
|
|
|
|
|
235 |
*/
|
236 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
|
238 |
/**
|
|
|
|
|
239 |
* @since 4.1.1 - deprecated
|
240 |
*/
|
241 |
-
|
242 |
$this
|
243 |
-
], '4.1.1', "wbcr/factory/
|
244 |
|
245 |
/**
|
246 |
-
*
|
|
|
|
|
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( '
|
269 |
-
throw new Exception( 'The
|
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
|
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 |
-
|
366 |
|
367 |
/**
|
368 |
* @since 4.1.1 - add
|
369 |
*/
|
370 |
-
do_action( 'wbcr/
|
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( '
|
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\
|
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\
|
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\
|
472 |
}
|
473 |
}
|
474 |
|
@@ -490,11 +551,11 @@ abstract class Wbcr_Factory412_Plugin extends Wbcr_Factory412_Base {
|
|
490 |
}
|
491 |
|
492 |
// Создаем экземляр премиум менеджера, мы сможем к нему обращаться глобально.
|
493 |
-
$this->premium = WBCR\
|
494 |
|
495 |
// Подключаем премиум апгрейдер
|
496 |
if ( isset( $this->license_settings['has_updates'] ) && $this->license_settings['has_updates'] ) {
|
497 |
-
new WBCR\
|
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
|
532 |
}
|
533 |
|
534 |
public function newStyleList() {
|
535 |
-
return new
|
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
|
16 |
|
17 |
-
use WBCR\
|
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', '
|
125 |
-
array( 'libs/factory/forms', '
|
126 |
-
array( 'libs/factory/pages', '
|
127 |
);
|
128 |
|
129 |
|
130 |
/**
|
131 |
-
* @var \WBCR\
|
132 |
*/
|
133 |
protected $support;
|
134 |
|
135 |
/**
|
136 |
-
* @var \WBCR\
|
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\
|
175 |
-
$this->paths = new \WBCR\
|
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\
|
332 |
*/
|
333 |
public function get_support() {
|
334 |
return $this->support;
|
335 |
}
|
336 |
|
337 |
/**
|
338 |
-
* @return \WBCR\
|
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 |
-
|
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
|
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( '
|
15 |
-
class
|
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.', '
|
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!', '
|
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!', '
|
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.', '
|
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\
|
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\
|
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
|
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
|
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 |
-
|
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
|
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 |
-
|
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 '
|
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
|
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\
|
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\
|
4 |
|
5 |
use Exception;
|
6 |
-
use
|
7 |
|
8 |
// Exit if accessed directly
|
9 |
if ( ! defined( 'ABSPATH' ) ) {
|
@@ -19,12 +19,12 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
19 |
class Manager {
|
20 |
|
21 |
/**
|
22 |
-
* @var
|
23 |
*/
|
24 |
protected $plugin;
|
25 |
|
26 |
/**
|
27 |
-
* @var \WBCR\
|
28 |
*/
|
29 |
protected $provider;
|
30 |
|
@@ -36,25 +36,25 @@ class Manager {
|
|
36 |
/**
|
37 |
* Manager constructor.
|
38 |
*
|
39 |
-
* @param
|
40 |
* @param array $settings
|
41 |
*
|
42 |
* @throws Exception
|
43 |
*/
|
44 |
-
public function __construct(
|
45 |
$this->plugin = $plugin;
|
46 |
$this->settings = $settings;
|
47 |
//Plugin_Updates_Manager( $this->plugin, $this->updates['premium'], true );
|
48 |
}
|
49 |
|
50 |
/**
|
51 |
-
* @param
|
52 |
* @param array $settings
|
53 |
*
|
54 |
-
* @return \WBCR\
|
55 |
* @throws Exception
|
56 |
*/
|
57 |
-
public static function instance(
|
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\
|
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\
|
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\
|
4 |
|
5 |
use Exception;
|
6 |
-
use
|
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
|
25 |
*/
|
26 |
protected $plugin;
|
27 |
|
@@ -38,10 +38,10 @@ abstract class Provider {
|
|
38 |
/**
|
39 |
* Provider constructor.
|
40 |
*
|
41 |
-
* @param
|
42 |
* @param array $settings
|
43 |
*/
|
44 |
-
public function __construct(
|
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\
|
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\
|
4 |
|
5 |
use Exception;
|
6 |
use Plugin_Installer_Skin;
|
7 |
use Plugin_Upgrader;
|
8 |
-
use
|
9 |
-
use
|
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
|
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(
|
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
|
225 |
-
* @param
|
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.', '
|
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.', '
|
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.', '
|
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.', '
|
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\
|
4 |
|
5 |
use Exception;
|
6 |
use stdClass;
|
7 |
-
use
|
8 |
-
use WBCR\
|
9 |
|
10 |
// Exit if accessed directly
|
11 |
if ( ! defined( 'ABSPATH' ) ) {
|
@@ -30,7 +30,7 @@ class Upgrader {
|
|
30 |
protected $type = 'default';
|
31 |
|
32 |
/**
|
33 |
-
* @var
|
34 |
*/
|
35 |
protected $plugin;
|
36 |
|
@@ -78,13 +78,13 @@ class Upgrader {
|
|
78 |
*
|
79 |
* @since 4.1.1
|
80 |
*
|
81 |
-
* @param
|
82 |
* @param $args
|
83 |
* @param bool $is_premium
|
84 |
*
|
85 |
* @throws Exception
|
86 |
*/
|
87 |
-
public function __construct(
|
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( '
|
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\
|
4 |
|
5 |
// Exit if accessed directly
|
6 |
-
use
|
7 |
|
8 |
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
exit;
|
@@ -23,17 +23,17 @@ abstract class Repository {
|
|
23 |
protected $initialized = false;
|
24 |
|
25 |
/**
|
26 |
-
* @var
|
27 |
*/
|
28 |
protected $plugin;
|
29 |
|
30 |
/**
|
31 |
* Repository constructor.
|
32 |
*
|
33 |
-
* @param
|
34 |
* @param bool $is_premium
|
35 |
*/
|
36 |
-
abstract public function __construct(
|
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\
|
4 |
|
5 |
// Exit if accessed directly
|
6 |
-
use
|
7 |
|
8 |
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
exit;
|
@@ -20,10 +20,10 @@ class Wordpress_Repository extends Repository {
|
|
20 |
/**
|
21 |
* Wordpress constructor.
|
22 |
*
|
23 |
-
* @param
|
24 |
* @param bool $is_premium
|
25 |
*/
|
26 |
-
public function __construct(
|
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('
|
26 |
return;
|
27 |
}
|
28 |
|
29 |
-
define('
|
30 |
|
31 |
-
define('
|
32 |
|
33 |
// absolute path and URL to the files and resources of the module.
|
34 |
-
define('
|
35 |
-
define('
|
36 |
|
37 |
#comp merge
|
38 |
-
require_once(
|
39 |
-
require_once(
|
40 |
-
require_once(
|
41 |
|
42 |
-
require_once(
|
43 |
#endcomp
|
44 |
|
45 |
-
load_plugin_textdomain('
|
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 '
|
52 |
*
|
53 |
* @since 3.0.7
|
54 |
*/
|
55 |
-
if( !function_exists('
|
56 |
|
57 |
/**
|
58 |
-
* @param
|
59 |
* @throws Exception
|
60 |
*/
|
61 |
-
function
|
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(
|
69 |
-
require_once(
|
70 |
-
require_once(
|
71 |
-
require_once(
|
72 |
-
require_once(
|
73 |
-
require_once(
|
74 |
-
require_once(
|
75 |
-
require_once(
|
76 |
|
77 |
// registration of controls
|
78 |
$plugin->forms->registerControls(array(
|
79 |
array(
|
80 |
'type' => 'checkbox',
|
81 |
-
'class' => '
|
82 |
-
'include' =>
|
83 |
),
|
84 |
array(
|
85 |
'type' => 'list',
|
86 |
-
'class' => '
|
87 |
-
'include' =>
|
88 |
),
|
89 |
array(
|
90 |
'type' => 'dropdown',
|
91 |
-
'class' => '
|
92 |
-
'include' =>
|
93 |
),
|
94 |
array(
|
95 |
'type' => 'dropdown-and-colors',
|
96 |
-
'class' => '
|
97 |
-
'include' =>
|
98 |
),
|
99 |
array(
|
100 |
'type' => 'hidden',
|
101 |
-
'class' => '
|
102 |
-
'include' =>
|
103 |
),
|
104 |
array(
|
105 |
'type' => 'hidden',
|
106 |
-
'class' => '
|
107 |
-
'include' =>
|
108 |
),
|
109 |
array(
|
110 |
'type' => 'radio',
|
111 |
-
'class' => '
|
112 |
-
'include' =>
|
113 |
),
|
114 |
array(
|
115 |
'type' => 'radio-colors',
|
116 |
-
'class' => '
|
117 |
-
'include' =>
|
118 |
),
|
119 |
array(
|
120 |
'type' => 'textarea',
|
121 |
-
'class' => '
|
122 |
-
'include' =>
|
123 |
),
|
124 |
array(
|
125 |
'type' => 'textbox',
|
126 |
-
'class' => '
|
127 |
-
'include' =>
|
128 |
),
|
129 |
array(
|
130 |
'type' => 'multiple-textbox',
|
131 |
-
'class' => '
|
132 |
-
'include' =>
|
133 |
),
|
134 |
array(
|
135 |
'type' => 'datetimepicker-range',
|
136 |
-
'class' => '
|
137 |
-
'include' =>
|
138 |
),
|
139 |
array(
|
140 |
'type' => 'url',
|
141 |
-
'class' => '
|
142 |
-
'include' =>
|
143 |
),
|
144 |
array(
|
145 |
'type' => 'wp-editor',
|
146 |
-
'class' => '
|
147 |
-
'include' =>
|
148 |
),
|
149 |
array(
|
150 |
'type' => 'color',
|
151 |
-
'class' => '
|
152 |
-
'include' =>
|
153 |
),
|
154 |
array(
|
155 |
'type' => 'color-and-opacity',
|
156 |
-
'class' => '
|
157 |
-
'include' =>
|
158 |
),
|
159 |
array(
|
160 |
'type' => 'gradient',
|
161 |
-
'class' => '
|
162 |
-
'include' =>
|
163 |
),
|
164 |
array(
|
165 |
'type' => 'font',
|
166 |
-
'class' => '
|
167 |
-
'include' =>
|
168 |
),
|
169 |
array(
|
170 |
'type' => 'google-font',
|
171 |
-
'class' => '
|
172 |
-
'include' =>
|
173 |
),
|
174 |
array(
|
175 |
'type' => 'pattern',
|
176 |
-
'class' => '
|
177 |
-
'include' =>
|
178 |
),
|
179 |
array(
|
180 |
'type' => 'integer',
|
181 |
-
'class' => '
|
182 |
-
'include' =>
|
183 |
),
|
184 |
array(
|
185 |
'type' => 'control-group',
|
186 |
-
'class' => '
|
187 |
-
'include' =>
|
188 |
),
|
189 |
array(
|
190 |
'type' => 'paddings-editor',
|
191 |
-
'class' => '
|
192 |
-
'include' =>
|
193 |
),
|
194 |
));
|
195 |
|
@@ -197,53 +197,53 @@
|
|
197 |
$plugin->forms->registerHolders(array(
|
198 |
array(
|
199 |
'type' => 'tab',
|
200 |
-
'class' => '
|
201 |
-
'include' =>
|
202 |
),
|
203 |
array(
|
204 |
'type' => 'tab-item',
|
205 |
-
'class' => '
|
206 |
-
'include' =>
|
207 |
),
|
208 |
array(
|
209 |
'type' => 'accordion',
|
210 |
-
'class' => '
|
211 |
-
'include' =>
|
212 |
),
|
213 |
array(
|
214 |
'type' => 'accordion-item',
|
215 |
-
'class' => '
|
216 |
-
'include' =>
|
217 |
),
|
218 |
array(
|
219 |
'type' => 'control-group',
|
220 |
-
'class' => '
|
221 |
-
'include' =>
|
222 |
),
|
223 |
array(
|
224 |
'type' => 'control-group-item',
|
225 |
-
'class' => '
|
226 |
-
'include' =>
|
227 |
),
|
228 |
array(
|
229 |
'type' => 'form-group',
|
230 |
-
'class' => '
|
231 |
-
'include' =>
|
232 |
),
|
233 |
array(
|
234 |
'type' => 'more-link',
|
235 |
-
'class' => '
|
236 |
-
'include' =>
|
237 |
),
|
238 |
array(
|
239 |
'type' => 'div',
|
240 |
-
'class' => '
|
241 |
-
'include' =>
|
242 |
),
|
243 |
array(
|
244 |
'type' => 'columns',
|
245 |
-
'class' => '
|
246 |
-
'include' =>
|
247 |
)
|
248 |
));
|
249 |
|
@@ -251,23 +251,23 @@
|
|
251 |
$plugin->forms->registerCustomElements(array(
|
252 |
array(
|
253 |
'type' => 'html',
|
254 |
-
'class' => '
|
255 |
-
'include' =>
|
256 |
),
|
257 |
array(
|
258 |
'type' => 'separator',
|
259 |
-
'class' => '
|
260 |
-
'include' =>
|
261 |
),
|
262 |
));
|
263 |
|
264 |
// registration of form layouts
|
265 |
$plugin->forms->registerFormLayout(array(
|
266 |
'name' => 'bootstrap-3',
|
267 |
-
'class' => '
|
268 |
-
'include' =>
|
269 |
));
|
270 |
}
|
271 |
|
272 |
-
add_action('
|
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('
|
24 |
|
25 |
-
class
|
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', '
|
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', '
|
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('
|
24 |
}
|
25 |
|
26 |
-
class
|
27 |
|
28 |
public $type = 'color-and-opacity';
|
29 |
|
@@ -57,8 +57,8 @@
|
|
57 |
'way' => 'slider'
|
58 |
));
|
59 |
|
60 |
-
$this->color = new
|
61 |
-
$this->opacity = new
|
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('
|
24 |
|
25 |
-
class
|
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('
|
18 |
|
19 |
-
class
|
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('
|
18 |
-
class
|
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('
|
33 |
|
34 |
-
class
|
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
|
69 |
-
$this->range_2 = new
|
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
|
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
|
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('
|
41 |
|
42 |
-
class
|
43 |
|
44 |
public $type = 'dropdown-and-colors';
|
45 |
|
@@ -69,8 +69,8 @@
|
|
69 |
'name' => $this->options['name'] . '__colors',
|
70 |
));
|
71 |
|
72 |
-
$this->dropdown = new
|
73 |
-
$this->colors = new
|
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( '
|
25 |
|
26 |
-
class
|
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.', '
|
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 -', '
|
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 -', '
|
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('
|
24 |
|
25 |
-
class
|
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
|
58 |
-
$this->family = new
|
59 |
-
$this->color = new
|
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('
|
70 |
-
$fonts = apply_filters('
|
71 |
|
72 |
return $fonts;
|
73 |
}
|
@@ -77,10 +77,10 @@
|
|
77 |
|
78 |
$fonts = array(
|
79 |
|
80 |
-
array('inherit', __('(use default website font)', '
|
81 |
array(
|
82 |
'group',
|
83 |
-
__('Sans Serif:', '
|
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:', '
|
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:', '
|
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
|
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
|
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)', '
|
53 |
);
|
54 |
|
55 |
$fontsCommon = array(
|
56 |
'group',
|
57 |
-
__('Standard:', '
|
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:', '
|
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.', '
|
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.', '
|
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.', '
|
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('
|
29 |
-
class
|
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', '
|
70 |
-
factory.res.resHorizontal = '<?php _e( 'horizontal', '
|
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('
|
24 |
|
25 |
-
class
|
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('
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
class
|
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('
|
17 |
/**
|
18 |
* Tab Control Holder
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
-
class
|
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('
|
18 |
/**
|
19 |
* Columns Holder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
-
class
|
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('
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
class
|
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('
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
class
|
25 |
|
26 |
/**
|
27 |
* A holder type.
|
@@ -61,7 +61,7 @@
|
|
61 |
continue;
|
62 |
}
|
63 |
|
64 |
-
$builder = new
|
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('
|
18 |
/**
|
19 |
* Div Control Holder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
-
class
|
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('
|
18 |
/**
|
19 |
* Group Holder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
-
class
|
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('
|
18 |
|
19 |
/**
|
20 |
* Collapsed Group Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
class
|
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('
|
17 |
/**
|
18 |
* Tab Item Control Holder
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
-
class
|
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('
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
class
|
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
|
48 |
*/
|
49 |
public function __construct($options, $form)
|
50 |
{
|
@@ -88,7 +88,7 @@
|
|
88 |
$tab_icon = $element->options['icon'];
|
89 |
}
|
90 |
|
91 |
-
$builder = new
|
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('
|
36 |
|
37 |
-
class
|
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('
|
25 |
|
26 |
-
class
|
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.', '
|
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.', '
|
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('
|
19 |
|
20 |
-
class
|
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', '
|
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('
|
18 |
|
19 |
-
class
|
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:', '
|
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('
|
19 |
|
20 |
-
class
|
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('
|
56 |
-
$this->patterns = apply_filters('
|
57 |
|
58 |
$this->custom_patterns = $this->getOption('patterns', array());
|
59 |
|
60 |
-
$this->color = new
|
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', '
|
106 |
<i class="fa fa-flask"></i>
|
107 |
-
<span><?php _e('re-color', '
|
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:', '
|
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.', '
|
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('
|
31 |
|
32 |
-
class
|
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('
|
25 |
|
26 |
-
class
|
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('
|
24 |
|
25 |
-
class
|
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('
|
33 |
|
34 |
-
class
|
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
|
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('
|
22 |
|
23 |
-
class
|
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('
|
26 |
|
27 |
-
class
|
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'] =
|
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('
|
17 |
/**
|
18 |
* The base class for all controls.
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
-
abstract class
|
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
|
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
|
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('
|
18 |
/**
|
19 |
* The base class for control holders.
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
-
abstract class
|
24 |
|
25 |
/**
|
26 |
* Holder Elements.
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
-
* @var
|
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
|
47 |
*/
|
48 |
public function __construct($options, $form)
|
49 |
{
|
@@ -60,7 +60,7 @@
|
|
60 |
* Returns holder elements.
|
61 |
*
|
62 |
* @since 1.0.0
|
63 |
-
* @return
|
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('
|
18 |
|
19 |
/**
|
20 |
* The base class for all controls.
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
abstract class
|
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
|
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
|
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
|
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('
|
18 |
/**
|
19 |
* The base class for all controls.
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
-
abstract class
|
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('
|
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
|
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
|
41 |
*/
|
42 |
private $html_builder;
|
43 |
|
@@ -53,7 +53,7 @@
|
|
53 |
* A parent form.
|
54 |
*
|
55 |
* @since 1.0.0
|
56 |
-
* @var
|
57 |
*/
|
58 |
protected $form;
|
59 |
|
@@ -61,7 +61,7 @@
|
|
61 |
* A form layout.
|
62 |
*
|
63 |
* @since 1.0.0
|
64 |
-
* @var
|
65 |
*/
|
66 |
protected $layout;
|
67 |
|
@@ -94,7 +94,7 @@
|
|
94 |
*
|
95 |
* @since 1.0.0
|
96 |
* @param mixed[] $options A holder options.
|
97 |
-
* @param
|
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
|
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('
|
18 |
|
19 |
/**
|
20 |
* The base class for all form layouts.
|
21 |
*/
|
22 |
-
abstract class
|
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
|
46 |
*/
|
47 |
public function __construct($options, $form)
|
48 |
{
|
@@ -52,8 +52,8 @@
|
|
52 |
|
53 |
parent::__construct($options, $form);
|
54 |
|
55 |
-
$this->addCssClass('factory-forms-
|
56 |
-
$this->addCssClass('factory-forms-
|
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('
|
19 |
|
20 |
-
function
|
21 |
{
|
22 |
-
$plugin->forms = new
|
23 |
}
|
24 |
|
25 |
-
if( !class_exists('
|
26 |
|
27 |
-
class
|
28 |
|
29 |
// ----------------------------------------------------
|
30 |
// Static fields and methods
|
@@ -57,7 +57,7 @@
|
|
57 |
/**
|
58 |
* Registers a set of new controls.
|
59 |
*
|
60 |
-
* @see
|
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
|
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
|
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('
|
184 |
/**
|
185 |
* An abstraction for forms.
|
186 |
*/
|
187 |
-
class
|
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
|
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
|
249 |
*/
|
250 |
public $layout;
|
251 |
|
@@ -261,20 +261,20 @@
|
|
261 |
*
|
262 |
* @since 1.0.0
|
263 |
* @param array $options
|
264 |
-
* @param
|
265 |
*/
|
266 |
-
public function __construct(array $options = array(),
|
267 |
{
|
268 |
// register controls once, when the first form is created
|
269 |
-
if( !
|
270 |
|
271 |
-
do_action('
|
272 |
|
273 |
//if( !empty($plugin) ) {
|
274 |
-
do_action('
|
275 |
//}
|
276 |
|
277 |
-
|
278 |
}
|
279 |
|
280 |
$this->scope = isset($options['scope']) ? $options['scope'] : null;
|
@@ -289,14 +289,14 @@
|
|
289 |
$this->form_layout = 'bootstrap-3';
|
290 |
}
|
291 |
|
292 |
-
|
293 |
}
|
294 |
|
295 |
/**
|
296 |
* Sets a provider for the control.
|
297 |
*
|
298 |
* @since 1.0.0
|
299 |
-
* @param
|
300 |
* @return void
|
301 |
*/
|
302 |
public function setProvider($provider)
|
@@ -332,14 +332,14 @@
|
|
332 |
*/
|
333 |
public function getItems()
|
334 |
{
|
335 |
-
return apply_filters('
|
336 |
}
|
337 |
|
338 |
/**
|
339 |
* Returns form controls (control objects).
|
340 |
*
|
341 |
* @since 1.0.0
|
342 |
-
* @return
|
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
|
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
|
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
|
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
|
437 |
*/
|
438 |
public function createControl($item)
|
439 |
{
|
@@ -441,7 +441,7 @@
|
|
441 |
|
442 |
if( is_array($item) ) {
|
443 |
|
444 |
-
$control_data =
|
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
|
469 |
*/
|
470 |
public function createHolder($item)
|
471 |
{
|
@@ -473,7 +473,7 @@
|
|
473 |
|
474 |
if( is_array($item) ) {
|
475 |
|
476 |
-
$holderData =
|
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
|
495 |
*/
|
496 |
public function createCustomElement($item)
|
497 |
{
|
@@ -499,7 +499,7 @@
|
|
499 |
|
500 |
if( is_array($item) ) {
|
501 |
|
502 |
-
$data =
|
503 |
require_once($data['include']);
|
504 |
|
505 |
$options = $item;
|
@@ -523,12 +523,12 @@
|
|
523 |
public function html($options = array())
|
524 |
{
|
525 |
|
526 |
-
if( !isset(
|
527 |
die(sprintf('[ERROR] The form layout %s was not found.', $this->form_layout));
|
528 |
}
|
529 |
|
530 |
// include a render code
|
531 |
-
$layout_data =
|
532 |
require_once($layout_data['include']);
|
533 |
|
534 |
$this->connectAssets();
|
@@ -552,7 +552,7 @@
|
|
552 |
{
|
553 |
|
554 |
$this->connectAssetsForItems();
|
555 |
-
$layout_data =
|
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 =
|
606 |
} elseif( self::isControlHolder($type) ) {
|
607 |
-
$haystack =
|
608 |
}
|
609 |
|
610 |
if( isset($haystack[$type]) ) {
|
@@ -660,7 +660,7 @@
|
|
660 |
*/
|
661 |
public static function isControl($item)
|
662 |
{
|
663 |
-
return isset(
|
664 |
}
|
665 |
|
666 |
/**
|
@@ -672,7 +672,7 @@
|
|
672 |
*/
|
673 |
public static function isControlHolder($item)
|
674 |
{
|
675 |
-
return isset(
|
676 |
}
|
677 |
|
678 |
/**
|
@@ -684,7 +684,7 @@
|
|
684 |
*/
|
685 |
public static function isCustomElement($item)
|
686 |
{
|
687 |
-
return isset(
|
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('
|
18 |
|
19 |
/**
|
20 |
* The base class for control holders.
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
abstract class
|
25 |
|
26 |
/**
|
27 |
* Holder Elements.
|
28 |
*
|
29 |
* @since 1.0.0
|
30 |
-
* @var
|
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
|
48 |
*/
|
49 |
public function __construct($options, $form)
|
50 |
{
|
@@ -56,7 +56,7 @@
|
|
56 |
* Returns holder elements.
|
57 |
*
|
58 |
* @since 1.0.0
|
59 |
-
* @return
|
60 |
*/
|
61 |
public function getElements()
|
62 |
{
|
@@ -84,7 +84,7 @@
|
|
84 |
$is_first_item = false;
|
85 |
}
|
86 |
|
87 |
-
do_action('
|
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('
|
18 |
/**
|
19 |
* Html Attribute Builder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
-
class
|
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('
|
18 |
|
19 |
/**
|
20 |
* Factory Meta Value Provider
|
@@ -24,7 +24,7 @@
|
|
24 |
*
|
25 |
* @since 1.0.0
|
26 |
*/
|
27 |
-
class
|
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('
|
17 |
|
18 |
/**
|
19 |
* Factory Options Value Provider
|
@@ -22,7 +22,7 @@
|
|
22 |
*
|
23 |
* @since 1.0.0
|
24 |
*/
|
25 |
-
class
|
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(
|
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('
|
18 |
/**
|
19 |
* The interface for all value provides.
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
-
interface
|
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('
|
18 |
/**
|
19 |
* A form layout based on Twitter Bootstrap 3
|
20 |
*/
|
21 |
-
class
|
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
|
31 |
*/
|
32 |
public function __construct($options, $form)
|
33 |
{
|
@@ -68,7 +68,7 @@
|
|
68 |
}
|
69 |
|
70 |
/**
|
71 |
-
* @param
|
72 |
*/
|
73 |
public function beforeControl($control)
|
74 |
{
|
@@ -116,7 +116,7 @@
|
|
116 |
}
|
117 |
|
118 |
/**
|
119 |
-
* @param
|
120 |
*/
|
121 |
public function afterControl($control)
|
122 |
{
|
@@ -168,7 +168,7 @@
|
|
168 |
}
|
169 |
|
170 |
/**
|
171 |
-
* @param
|
172 |
* @param int $index
|
173 |
* @param int $total
|
174 |
*/
|
@@ -193,7 +193,7 @@
|
|
193 |
}
|
194 |
|
195 |
/**
|
196 |
-
* @param
|
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( '
|
18 |
return;
|
19 |
}
|
20 |
|
21 |
-
define( '
|
22 |
-
define( '
|
23 |
-
define( '
|
24 |
|
25 |
#comp merge
|
26 |
// Freemius
|
27 |
-
require_once(
|
28 |
-
require_once(
|
29 |
-
require_once(
|
30 |
-
require_once(
|
31 |
-
require_once(
|
32 |
|
33 |
-
require_once(
|
34 |
|
35 |
-
require_once(
|
36 |
|
37 |
if ( ! class_exists( 'Freemius_Api_WordPress' ) ) {
|
38 |
-
require_once
|
39 |
}
|
40 |
|
41 |
-
require_once(
|
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\
|
4 |
|
5 |
use Freemius_Api_WordPress;
|
6 |
use Freemius_Exception;
|
7 |
-
use
|
8 |
|
9 |
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
exit;
|
@@ -33,7 +33,7 @@ final class Api {
|
|
33 |
private $api;
|
34 |
|
35 |
/**
|
36 |
-
* @var
|
37 |
*/
|
38 |
private $plugin;
|
39 |
|
@@ -48,14 +48,14 @@ final class Api {
|
|
48 |
private static $clock_diff;
|
49 |
|
50 |
/**
|
51 |
-
* @param
|
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(
|
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
|
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(
|
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\
|
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\
|
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\
|
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\
|
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\
|
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\
|
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\
|
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\
|
4 |
-
|
5 |
-
use WBCR\
|
6 |
-
use WBCR\
|
7 |
-
use WBCR\
|
8 |
-
use WBCR\
|
9 |
-
use WBCR\
|
10 |
-
use
|
11 |
-
use WBCR\
|
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\
|
46 |
*/
|
47 |
private $site_api;
|
48 |
|
49 |
/**
|
50 |
-
* @var \WBCR\
|
51 |
*/
|
52 |
private $plugin_api;
|
53 |
|
54 |
/**
|
55 |
-
* @var \WBCR\
|
56 |
*/
|
57 |
private $user_api;
|
58 |
|
@@ -84,11 +84,11 @@ final class Provider extends License_Provider {
|
|
84 |
/**
|
85 |
* Manager constructor.
|
86 |
*
|
87 |
-
* @param
|
88 |
*
|
89 |
* @throws Exception
|
90 |
*/
|
91 |
-
public function __construct(
|
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\
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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\
|
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\
|
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\
|
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\
|
4 |
|
5 |
// Exit if accessed directly
|
6 |
use Exception;
|
7 |
-
use
|
8 |
-
use WBCR\
|
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\
|
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
|
32 |
*
|
33 |
* @throws Exception
|
34 |
*/
|
35 |
-
public function __construct(
|
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\
|
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('
|
23 |
return;
|
24 |
}
|
25 |
|
26 |
-
define('
|
27 |
|
28 |
-
define('
|
29 |
|
30 |
-
define('
|
31 |
-
define('
|
32 |
|
33 |
if( !defined('FACTORY_FLAT_ADMIN') ) {
|
34 |
define('FACTORY_FLAT_ADMIN', true);
|
35 |
}
|
36 |
|
37 |
-
load_plugin_textdomain('
|
38 |
|
39 |
-
require(
|
40 |
-
require(
|
41 |
-
require(
|
42 |
-
require(
|
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( '
|
18 |
|
19 |
-
class
|
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(
|
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( '
|
231 |
|
232 |
if ( $this->hidden ) {
|
233 |
return;
|
234 |
}
|
235 |
|
236 |
-
$this->internal = apply_filters( '
|
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( '
|
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('
|
18 |
|
19 |
-
class
|
20 |
|
21 |
/**
|
22 |
* Page id used to call.
|
@@ -26,7 +26,7 @@
|
|
26 |
|
27 |
/**
|
28 |
* Current Factory Plugin.
|
29 |
-
* @var
|
30 |
*/
|
31 |
public $plugin;
|
32 |
|
@@ -38,10 +38,10 @@
|
|
38 |
//private $default_actions = array();
|
39 |
|
40 |
/**
|
41 |
-
* @param
|
42 |
* @throws Exception
|
43 |
*/
|
44 |
-
public function __construct(
|
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/
|
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', '
|
18 |
-
add_action('network_admin_menu', '
|
19 |
|
20 |
-
if( !class_exists('
|
21 |
/**
|
22 |
* A base class to manage pages.
|
23 |
*
|
24 |
* @since 1.0.0
|
25 |
*/
|
26 |
-
class
|
27 |
|
28 |
/**
|
29 |
-
* @var
|
30 |
*/
|
31 |
private static $pages = array();
|
32 |
|
33 |
/**
|
34 |
-
* @param
|
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(
|
63 |
{
|
64 |
if( isset(self::$pages[$plugin->getPluginName()]) ) {
|
65 |
$pages = self::$pages[$plugin->getPluginName()];
|
@@ -75,7 +75,7 @@
|
|
75 |
}
|
76 |
|
77 |
/**
|
78 |
-
* @param
|
79 |
* @return array
|
80 |
*/
|
81 |
public static function getIds($plugin)
|
@@ -93,14 +93,14 @@
|
|
93 |
}
|
94 |
}
|
95 |
|
96 |
-
if( !function_exists('
|
97 |
/**
|
98 |
*
|
99 |
-
* @param
|
100 |
* @param string $page_id
|
101 |
* @return string
|
102 |
*/
|
103 |
-
function
|
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-
|
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-
|
21 |
color: #9a9a9a;
|
22 |
}
|
23 |
-
#WBCR .wbcr-factory-pages-
|
24 |
color: #ffc107;
|
25 |
}
|
26 |
-
#WBCR .wbcr-factory-pages-
|
27 |
color: #ffeb3b;
|
28 |
}
|
29 |
-
#WBCR .wbcr-factory-pages-
|
30 |
padding: 0 20px;
|
31 |
}
|
32 |
-
#WBCR .wbcr-factory-pages-
|
33 |
font-weight: normal;
|
34 |
}
|
35 |
-
#WBCR .wbcr-factory-pages-
|
36 |
max-width: 300px;
|
37 |
}
|
38 |
-
#WBCR .wbcr-factory-pages-
|
39 |
text-align: right;
|
40 |
padding-right: 20px;
|
41 |
}
|
42 |
-
#WBCR .wbcr-factory-pages-
|
43 |
display: inline-block;
|
44 |
vertical-align: bottom;
|
45 |
}
|
46 |
-
#WBCR .wbcr-factory-pages-
|
47 |
-
#WBCR .wbcr-factory-pages-
|
48 |
outline: none;
|
49 |
}
|
50 |
-
#WBCR .wbcr-factory-pages-
|
51 |
font-weight: bold;
|
52 |
margin: 0 !important;
|
53 |
border: 0;
|
54 |
border-radius: 0;
|
55 |
padding: 15px;
|
56 |
}
|
57 |
-
#WBCR .wbcr-factory-pages-
|
58 |
margin-top: 0 !important;
|
59 |
}
|
60 |
-
#WBCR .wbcr-factory-pages-
|
61 |
background: #fff3d0;
|
62 |
}
|
63 |
-
#WBCR .wbcr-factory-pages-
|
64 |
background: #fffde9;
|
65 |
}
|
66 |
-
#WBCR .wbcr-factory-pages-
|
67 |
background: #de716d;
|
68 |
}
|
69 |
-
#WBCR .wbcr-factory-pages-
|
70 |
background: #ec8c89;
|
71 |
}
|
72 |
-
#WBCR .wbcr-factory-pages-
|
73 |
background: #d0ecc4;
|
74 |
}
|
75 |
-
#WBCR .wbcr-factory-pages-
|
76 |
background: #e0eadb;
|
77 |
}
|
78 |
-
#WBCR .wbcr-factory-pages-
|
79 |
padding: 20px 20px 40px;
|
80 |
}
|
81 |
-
#WBCR .wbcr-factory-pages-
|
82 |
display: block;
|
83 |
font-size: 11px;
|
84 |
font-weight: lighter;
|
85 |
color: #179347;
|
86 |
}
|
87 |
-
#WBCR .wbcr-factory-pages-
|
88 |
-
#WBCR .wbcr-factory-pages-
|
89 |
position: relative;
|
90 |
background: #e6e6e6;
|
91 |
overflow: hidden;
|
92 |
}
|
93 |
-
#WBCR .wbcr-factory-pages-
|
94 |
-
#WBCR .wbcr-factory-pages-
|
95 |
display: block;
|
96 |
content: '';
|
97 |
clear: both;
|
98 |
}
|
99 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
106 |
margin-top: 0;
|
107 |
}
|
108 |
-
#WBCR .wbcr-factory-pages-
|
109 |
font-size: 15px;
|
110 |
}
|
111 |
-
#WBCR .wbcr-factory-pages-
|
112 |
color: #8c8888;
|
113 |
font-size: 12px;
|
114 |
}
|
115 |
-
#WBCR .wbcr-factory-pages-
|
116 |
margin-left: 230px;
|
117 |
padding: 80px 0 0 0;
|
118 |
vertical-align: top;
|
119 |
background: #fff;
|
120 |
}
|
121 |
-
#WBCR .wbcr-factory-pages-
|
122 |
-
#WBCR .wbcr-factory-pages-
|
123 |
-
#WBCR .wbcr-factory-pages-
|
124 |
border: 0;
|
125 |
}
|
126 |
-
#WBCR .wbcr-factory-pages-
|
127 |
background: #efefef !important;
|
128 |
margin-bottom: -2px !important;
|
129 |
border-bottom: 1px solid #efefef !important;
|
130 |
}
|
131 |
-
#WBCR .wbcr-factory-pages-
|
132 |
margin: 0;
|
133 |
}
|
134 |
-
#WBCR .wbcr-factory-pages-
|
135 |
background: #f7f7f7;
|
136 |
}
|
137 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
143 |
-
#WBCR .wbcr-factory-pages-
|
144 |
box-shadow: none;
|
145 |
outline: none;
|
146 |
}
|
147 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
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-
|
172 |
display: inline-block;
|
173 |
vertical-align: middle;
|
174 |
}
|
175 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
187 |
position: relative;
|
188 |
float: right;
|
189 |
margin: 12px;
|
190 |
}
|
191 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
215 |
box-shadow: none;
|
216 |
min-width: 100px;
|
217 |
background-color: #8bc34a;
|
218 |
color: #fff;
|
219 |
}
|
220 |
-
#WBCR .wbcr-factory-pages-
|
221 |
background: #9dbb7b;
|
222 |
color: #fff;
|
223 |
}
|
224 |
-
#WBCR .wbcr-factory-pages-
|
225 |
box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
|
226 |
}
|
227 |
-
#WBCR .wbcr-factory-pages-
|
228 |
box-shadow: none;
|
229 |
min-width: 200px;
|
230 |
background-color: #9e9e9e;
|
231 |
color: #fff;
|
232 |
}
|
233 |
-
#WBCR .wbcr-factory-pages-
|
234 |
background: #797979;
|
235 |
color: #fff;
|
236 |
}
|
237 |
-
#WBCR .wbcr-factory-pages-
|
238 |
box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
|
239 |
}
|
240 |
-
#WBCR .wbcr-factory-pages-
|
241 |
float: left;
|
242 |
vertical-align: top;
|
243 |
width: 230px;
|
244 |
background: #e6e6e6;
|
245 |
}
|
246 |
-
#WBCR .wbcr-factory-pages-
|
247 |
padding: 0;
|
248 |
margin-bottom: 0;
|
249 |
margin-top: 80px;
|
250 |
}
|
251 |
-
#WBCR .wbcr-factory-pages-
|
252 |
display: block;
|
253 |
background: #efefef;
|
254 |
margin: 1px 0;
|
255 |
}
|
256 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
268 |
display: block;
|
269 |
font-weight: bold;
|
270 |
}
|
271 |
-
#WBCR .wbcr-factory-pages-
|
272 |
display: block;
|
273 |
font-size: 13px;
|
274 |
font-weight: normal;
|
275 |
text-transform: none;
|
276 |
color: #9a9a9a;
|
277 |
}
|
278 |
-
#WBCR .wbcr-factory-pages-
|
279 |
float: right;
|
280 |
color: #ccc;
|
281 |
}
|
282 |
-
#WBCR .wbcr-factory-pages-
|
283 |
clear: both;
|
284 |
}
|
285 |
-
#WBCR .wbcr-factory-pages-
|
286 |
background: #f7f6f6;
|
287 |
}
|
288 |
-
#WBCR .wbcr-factory-pages-
|
289 |
color: #9a9a9a;
|
290 |
}
|
291 |
-
#WBCR .wbcr-factory-pages-
|
292 |
-
#WBCR .wbcr-factory-pages-
|
293 |
-
#WBCR .wbcr-factory-pages-
|
294 |
-
#WBCR .wbcr-factory-pages-
|
295 |
-
#WBCR .wbcr-factory-pages-
|
296 |
outline: 0 !important;
|
297 |
box-shadow: none !important;
|
298 |
}
|
299 |
-
#WBCR .wbcr-factory-pages-
|
300 |
background: #fff;
|
301 |
}
|
302 |
-
#WBCR .wbcr-factory-pages-
|
303 |
color: #ff5722;
|
304 |
font-weight: bold;
|
305 |
border-left: 5px solid #ff5722;
|
306 |
}
|
307 |
-
#WBCR .wbcr-factory-pages-
|
308 |
color: #9a9a9a;
|
309 |
}
|
310 |
-
#WBCR .wbcr-factory-pages-
|
311 |
-
#WBCR .wbcr-factory-pages-
|
312 |
display: inline-block;
|
313 |
vertical-align: top;
|
314 |
}
|
315 |
-
#WBCR .wbcr-factory-pages-
|
316 |
width: 74.6%;
|
317 |
}
|
318 |
-
#WBCR .wbcr-factory-pages-
|
319 |
width: 100%;
|
320 |
}
|
321 |
-
#WBCR .wbcr-factory-pages-
|
322 |
margin-top: 15px;
|
323 |
}
|
324 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
331 |
padding-top: 0 !important;
|
332 |
}
|
333 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
341 |
margin: 0 0 20px;
|
342 |
}
|
343 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
353 |
display: none;
|
354 |
}
|
355 |
-
#WBCR .wbcr-factory-pages-
|
356 |
background: #fff4d0;
|
357 |
}
|
358 |
-
#WBCR .wbcr-factory-pages-
|
359 |
background: #e2ffc0;
|
360 |
}
|
361 |
-
#WBCR .wbcr-factory-pages-
|
362 |
background: #ffebe9;
|
363 |
}
|
364 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
377 |
background: #E91E63;
|
378 |
}
|
379 |
-
#WBCR .wbcr-factory-pages-
|
380 |
background: #9e9e9e;
|
381 |
}
|
382 |
-
#WBCR .wbcr-factory-pages-
|
383 |
background: #8bc34a;
|
384 |
}
|
385 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
394 |
display: block;
|
395 |
margin: 30px auto 0;
|
396 |
outline: none;
|
397 |
}
|
398 |
-
#WBCR .wbcr-factory-pages-
|
399 |
-
#WBCR .wbcr-factory-pages-
|
400 |
box-shadow: none;
|
401 |
}
|
402 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
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-
|
418 |
width: 50px;
|
419 |
height: 50px;
|
420 |
font-size: 50px;
|
421 |
color: #FFC107;
|
422 |
line-height: normal;
|
423 |
}
|
424 |
-
#WBCR .wbcr-factory-pages-
|
425 |
color: #7b6111;
|
426 |
}
|
427 |
-
#WBCR .wbcr-factory-pages-
|
428 |
color: #9e9e9e;
|
429 |
}
|
430 |
-
#WBCR .wbcr-factory-pages-
|
431 |
margin-top: 20px;
|
432 |
text-align: center;
|
433 |
}
|
434 |
-
#WBCR .wbcr-factory-pages-
|
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-
|
445 |
background-color: #ffce3a;
|
446 |
}
|
447 |
-
#WBCR .wbcr-factory-pages-
|
448 |
padding: 20px;
|
449 |
background: #ffffff;
|
450 |
}
|
451 |
-
#WBCR .wbcr-factory-pages-
|
452 |
-
#WBCR .wbcr-factory-pages-
|
453 |
display: none;
|
454 |
}
|
455 |
-
#WBCR .wbcr-factory-pages-
|
456 |
font-size: 18px;
|
457 |
margin-top: 10px;
|
458 |
}
|
459 |
-
#WBCR .wbcr-factory-pages-
|
460 |
padding: 10px;
|
461 |
background: #ffedeb;
|
462 |
border: 1px solid #ffdfdc;
|
463 |
margin: 15px 0;
|
464 |
}
|
465 |
-
#WBCR .wbcr-factory-pages-
|
466 |
margin-bottom: 15px;
|
467 |
color: #7b7b7b;
|
468 |
}
|
469 |
@media screen and (max-width: 1367px) {
|
470 |
-
#WBCR .wbcr-factory-pages-
|
471 |
width: 69.6%;
|
472 |
}
|
473 |
-
#WBCR .wbcr-factory-pages-
|
474 |
width: 30%;
|
475 |
}
|
476 |
}
|
477 |
@media screen and (max-width: 1320px) {
|
478 |
-
#WBCR .wbcr-factory-pages-
|
479 |
width: 100%;
|
480 |
}
|
481 |
-
#WBCR .wbcr-factory-pages-
|
482 |
display: none !important;
|
483 |
}
|
484 |
-
#WBCR .wbcr-factory-pages-
|
485 |
display: none !important;
|
486 |
}
|
487 |
-
#WBCR .wbcr-factory-pages-
|
488 |
display: none !important;
|
489 |
}
|
490 |
}
|
491 |
@media screen and (max-width: 950px) {
|
492 |
-
#WBCR .wbcr-factory-pages-
|
493 |
width: 70px;
|
494 |
}
|
495 |
-
#WBCR .wbcr-factory-pages-
|
496 |
font-size: 0;
|
497 |
}
|
498 |
-
#WBCR .wbcr-factory-pages-
|
499 |
font-size: 0;
|
500 |
}
|
501 |
-
#WBCR .wbcr-factory-pages-
|
502 |
display: none !important;
|
503 |
}
|
504 |
-
#WBCR .wbcr-factory-pages-
|
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('
|
18 |
/**
|
19 |
-
* Class
|
20 |
*/
|
21 |
-
abstract class
|
22 |
|
23 |
//public $menu_target = 'options-general.php';
|
24 |
|
@@ -110,12 +110,12 @@
|
|
110 |
public $page_menu = array();
|
111 |
|
112 |
/**
|
113 |
-
* @param
|
114 |
*/
|
115 |
-
public function __construct(
|
116 |
{
|
117 |
-
$this->menuIcon =
|
118 |
-
//$allow_multisite = apply_filters('
|
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', '
|
129 |
|
130 |
$this->setPageMenu();
|
131 |
}
|
@@ -169,7 +169,7 @@
|
|
169 |
/**
|
170 |
* Requests assets (js and css) for the page.
|
171 |
*
|
172 |
-
* @see
|
173 |
*
|
174 |
* @since 1.0.0
|
175 |
* @return void
|
@@ -193,7 +193,7 @@
|
|
193 |
'control.checkbox'
|
194 |
), 'bootstrap');
|
195 |
|
196 |
-
$this->styles->add(
|
197 |
}
|
198 |
|
199 |
/**
|
@@ -207,7 +207,7 @@
|
|
207 |
* @since 4.0.8 - добавлен
|
208 |
* @since 4.0.9 - является устаревшим
|
209 |
*/
|
210 |
-
$plugin_title =
|
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('
|
290 |
-
|
291 |
}
|
292 |
|
293 |
/**
|
294 |
* @since 4.0.1 - является устаревшим
|
295 |
*/
|
296 |
-
|
297 |
$this->plugin->getPluginName(),
|
298 |
$this->getResultId()
|
299 |
-
), '4.0.1', '
|
300 |
|
301 |
/**
|
302 |
* @since 4.0.9 - является устаревшим
|
303 |
*/
|
304 |
-
|
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 =
|
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.", '
|
342 |
}*/
|
343 |
// Метод предназначен для вызова в дочернем классе
|
344 |
}
|
@@ -416,7 +416,7 @@
|
|
416 |
/**
|
417 |
* @since 4.0.9 - является устаревшим
|
418 |
*/
|
419 |
-
|
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!', '
|
440 |
)
|
441 |
);
|
442 |
|
443 |
/**
|
444 |
* @since 4.0.9 - является устаревшим
|
445 |
*/
|
446 |
-
$notices =
|
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', '
|
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 =
|
682 |
$widgets,
|
683 |
$position,
|
684 |
$this->plugin,
|
@@ -696,12 +696,12 @@
|
|
696 |
|
697 |
protected function showOptions()
|
698 |
{
|
699 |
-
$form = new
|
700 |
'scope' => rtrim($this->plugin->getPrefix(), '_'),
|
701 |
'name' => $this->getResultId() . "-options"
|
702 |
), $this->plugin);
|
703 |
|
704 |
-
$form->setProvider(new
|
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.', '
|
745 |
exit;
|
746 |
}
|
747 |
|
748 |
/**
|
749 |
* @since 4.0.9 - является устаревшим
|
750 |
*/
|
751 |
-
|
752 |
$form,
|
753 |
$this->plugin,
|
754 |
$this
|
@@ -767,7 +767,7 @@
|
|
767 |
/**
|
768 |
* @since 4.0.9 - является устаревшим
|
769 |
*/
|
770 |
-
|
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-
|
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-
|
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-
|
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
|
8 |
|
9 |
public function install() {
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
*
|
32 |
-
* our plugin uses a new database structure.
|
33 |
*
|
34 |
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
35 |
-
* @since 1.3.
|
36 |
-
* @
|
37 |
*/
|
38 |
-
public function
|
39 |
-
|
40 |
-
|
41 |
-
WRIO_Logger::error( 'Plugin migration: Class RIO_Process_Queue is not found!' );
|
42 |
-
|
43 |
-
return;
|
44 |
}
|
45 |
|
46 |
-
|
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
|
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 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
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.
|
|
|
|
|
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.
|
8 |
* Text Domain: robin-image-optimizer
|
9 |
* Domain Path: /languages/
|
10 |
* Author URI: https://robin-image-optimizer.webcraftic.com
|
11 |
-
* Framework 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', '
|
81 |
-
array( 'libs/factory/forms', '
|
82 |
-
array( 'libs/factory/pages', '
|
83 |
-
array( 'libs/factory/clearfy', '
|
84 |
-
array( 'libs/factory/freemius', '
|
85 |
)
|
86 |
);
|
87 |
|
88 |
-
$wrio_compatibility = new
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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;">
|