Version Description
Download this release
Release Info
Developer | webcraftic |
Plugin | Robin image optimizer — save money on image compression |
Version | 1.1.5 |
Comparing to | |
See all releases |
Code changes from version 1.0.8 to 1.1.5
- admin/activation.php +6 -6
- admin/ajax/backup.php +66 -0
- admin/ajax/check-servers-status.php +56 -0
- admin/ajax/optimization.php +46 -0
- admin/ajax/select-server.php +31 -0
- admin/assets/css/base-statistic.css +82 -5
- admin/assets/css/base-statistic.less +109 -11
- admin/assets/img/quick-start-loader.gif +0 -0
- admin/assets/js/bulk-optimozation.js +13 -9
- admin/assets/js/check-servers-status.js +82 -0
- admin/assets/js/restore-backup.js +2 -2
- admin/assets/js/statistic.js +2 -2
- admin/boot.php +39 -4
- admin/pages/log.php +42 -12
- admin/pages/settings.php +186 -200
- admin/pages/statistic.php +255 -142
- includes/class.plugin.php +81 -169
- includes/classes/class.attachment.php +83 -22
- includes/classes/class.backup.php +176 -94
- includes/classes/class.cron.php +14 -12
- includes/classes/class.image-processor-abstract.php +6 -2
- includes/classes/class.image-processor-clearfy1.php +139 -0
- includes/classes/class.image-processor-resmush.php +3 -3
- includes/classes/class.image-processor-webcraftic.php +110 -0
- includes/classes/class.image-statistic.php +1 -0
- includes/classes/class.logger.php +1 -1
- includes/classes/class.media-library.php +54 -56
- includes/classes/class.optimization-tools.php +47 -0
- includes/functions.php +63 -19
- languages/robin-image-optimizer-ru_RU.po +610 -610
- 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/css-min/index.php +0 -0
- libs/factory/bootstrap/assets/images/index.php +0 -0
- libs/factory/bootstrap/assets/index.php +0 -0
- 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/assets/js-min/index.php +0 -0
- libs/factory/bootstrap/boot.php +6 -6
- libs/factory/bootstrap/includes/functions.php +20 -20
- libs/factory/bootstrap/includes/index.php +0 -0
- libs/factory/bootstrap/index.php +0 -0
- libs/factory/clearfy/assets/css/clearfy-base.css +180 -0
- libs/factory/clearfy/assets/css/clearfy-base.less +170 -0
- libs/factory/clearfy/assets/css/index.php +0 -0
- libs/factory/clearfy/assets/index.php +0 -0
- libs/factory/clearfy/assets/js/globals.js +203 -0
- libs/factory/clearfy/assets/js/index.php +0 -0
- libs/factory/clearfy/boot.php +22 -12
- libs/factory/clearfy/includes/check-clearfy-compatibility.php +306 -0
- libs/factory/clearfy/includes/class.configurate.php +57 -4
- libs/factory/clearfy/includes/class.helpers.php +201 -11
- libs/factory/clearfy/includes/index.php +0 -0
- libs/factory/clearfy/index.php +0 -0
- libs/factory/clearfy/langs/index.php +0 -0
- libs/factory/clearfy/langs/wbcr_factory_clearfy_203-fr-FR.mo +0 -0
- libs/factory/clearfy/langs/wbcr_factory_clearfy_203-fr-FR.po +0 -129
- libs/factory/clearfy/langs/wbcr_factory_clearfy_203-ru_RU.mo +0 -0
- libs/factory/clearfy/langs/wbcr_factory_clearfy_203-ru_RU.po +0 -124
- libs/factory/clearfy/langs/wbcr_factory_clearfy_206-ru_RU.mo +0 -0
- libs/factory/clearfy/langs/wbcr_factory_clearfy_206-ru_RU.po +307 -0
- libs/factory/clearfy/pages/class.pages.php +376 -0
- libs/factory/clearfy/pages/index.php +0 -0
- libs/factory/clearfy/pages/more-features.php +24 -24
- libs/factory/core/boot.php +16 -14
- libs/factory/core/includes/activation/activator.class.php +5 -144
- libs/factory/core/includes/activation/index.php +0 -0
- libs/factory/core/includes/activation/update.class.php +4 -4
- libs/factory/core/includes/assets-managment/assets-list.class.php +5 -49
- libs/factory/core/includes/assets-managment/index.php +0 -0
- libs/factory/core/includes/assets-managment/script-list.class.php +86 -14
- libs/factory/core/includes/assets-managment/style-list.class.php +41 -4
- libs/factory/core/includes/base.class.php +363 -217
- libs/factory/core/includes/check-compatibility.php +128 -0
- libs/factory/core/includes/functions.php +78 -36
- libs/factory/core/includes/index.php +0 -0
- libs/factory/core/includes/plugin.class.php +102 -219
- libs/factory/core/includes/request.class.php +29 -11
- libs/factory/core/index.php +0 -0
- libs/factory/core/langs/index.php +0 -0
- libs/factory/core/langs/wbcr_factory_409-ru_RU.mo +0 -0
- libs/factory/core/langs/wbcr_factory_409-ru_RU.po +128 -0
- libs/factory/forms/assets/css/index.php +0 -0
- libs/factory/forms/assets/index.php +0 -0
- libs/factory/forms/boot.php +96 -94
- 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/index.php +0 -0
- 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/index.php +0 -0
- 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 +49 -53
- libs/factory/forms/includes/holder.class.php +6 -6
- libs/factory/forms/includes/html-builder.class.php +2 -2
- libs/factory/forms/includes/index.php +0 -0
- libs/factory/forms/includes/providers/index.php +0 -0
- libs/factory/forms/includes/providers/meta-value-provider.class.php +2 -2
- libs/factory/forms/includes/providers/options-value-provider.class.php +13 -11
- libs/factory/forms/includes/providers/value-provider.interface.php +2 -2
- libs/factory/forms/index.php +0 -0
- libs/factory/forms/langs/index.php +0 -0
- libs/factory/forms/langs/wbcr_factory_forms_407-fr-FR.mo +0 -0
- libs/factory/forms/langs/wbcr_factory_forms_407-fr-FR.po +0 -104
- libs/factory/forms/langs/{wbcr_factory_forms_407-ru_RU.mo → wbcr_factory_forms_410-ru_RU.mo} +0 -0
- libs/factory/forms/langs/{wbcr_factory_forms_407-ru_RU.po → wbcr_factory_forms_410-ru_RU.po} +0 -0
- libs/factory/forms/layouts/bootstrap-3/bootstrap-3.php +7 -7
- libs/factory/forms/layouts/bootstrap-3/index.php +0 -0
- libs/factory/forms/layouts/index.php +0 -0
- libs/factory/pages/boot.php +12 -9
- libs/factory/pages/includes/admin-page.class.php +74 -51
- libs/factory/pages/includes/index.php +0 -0
- libs/factory/pages/includes/page.class.php +27 -8
- libs/factory/pages/index.php +0 -0
- libs/factory/pages/langs/index.php +0 -0
- libs/factory/pages/langs/wbcr_factory_pages_407-ru_RU.mo +0 -0
- libs/factory/pages/langs/wbcr_factory_pages_407-ru_RU.po +0 -99
- libs/factory/pages/langs/{wbcr_factory_pages_407-fr_FR.mo → wbcr_factory_pages_410-fr_FR.mo} +0 -0
- libs/factory/pages/langs/{wbcr_factory_pages_407-fr_FR.po → wbcr_factory_pages_410-fr_FR.po} +0 -0
- libs/factory/pages/langs/wbcr_factory_pages_410-ru_RU.mo +0 -0
- libs/factory/pages/langs/wbcr_factory_pages_410-ru_RU.po +98 -0
- libs/factory/pages/pages.php +30 -10
- libs/factory/pages/templates/assets/css/impressive.page.template.css +507 -430
- libs/factory/pages/templates/assets/css/impressive.page.template.less +136 -42
- libs/factory/pages/templates/assets/css/index.php +0 -0
- libs/factory/pages/templates/assets/img/index.php +0 -0
- libs/factory/pages/templates/assets/index.php +0 -0
- libs/factory/pages/templates/impressive-page.class.php +301 -278
- libs/factory/pages/templates/index.php +0 -0
- readme.txt +24 -3
- robin-image-optimizer.php +90 -64
- uninstall.php +1 -1
- updates/{010008.php → 010009.php} +2 -2
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 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
class WIO_Activation extends
|
18 |
|
19 |
/**
|
20 |
* Runs activation actions.
|
@@ -23,9 +23,11 @@
|
|
23 |
*/
|
24 |
public function activate()
|
25 |
{
|
26 |
-
WIO_Plugin::app()->updateOption('image_optimization_server', '
|
27 |
WIO_Plugin::app()->updateOption('backup_origin_images', 1);
|
28 |
WIO_Plugin::app()->updateOption('save_exif_data', 1);
|
|
|
|
|
29 |
}
|
30 |
|
31 |
/**
|
@@ -35,8 +37,6 @@
|
|
35 |
*/
|
36 |
public function deactivate()
|
37 |
{
|
38 |
-
|
39 |
-
wp_clear_scheduled_hook('wio_optimize_images');
|
40 |
-
}
|
41 |
}
|
42 |
}
|
5 |
*
|
6 |
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
7 |
* @copyright (c) 09.09.2017, Webcraftic
|
8 |
+
* @see Factory409_Activator
|
9 |
* @version 1.0
|
10 |
*/
|
11 |
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
class WIO_Activation extends Wbcr_Factory409_Activator {
|
18 |
|
19 |
/**
|
20 |
* Runs activation actions.
|
23 |
*/
|
24 |
public function activate()
|
25 |
{
|
26 |
+
WIO_Plugin::app()->updateOption('image_optimization_server', 'server_1');
|
27 |
WIO_Plugin::app()->updateOption('backup_origin_images', 1);
|
28 |
WIO_Plugin::app()->updateOption('save_exif_data', 1);
|
29 |
+
|
30 |
+
WIO_Cron::check();
|
31 |
}
|
32 |
|
33 |
/**
|
37 |
*/
|
38 |
public function deactivate()
|
39 |
{
|
40 |
+
WIO_Cron::stop();
|
|
|
|
|
41 |
}
|
42 |
}
|
admin/ajax/backup.php
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Backup
|
4 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
5 |
+
* @copyright (c) 22.10.2018, Webcraftic
|
6 |
+
* @version 1.0
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* AJAX обработчик массовой оптимизации изображений со страницы статистики
|
11 |
+
*/
|
12 |
+
add_action('wp_ajax_wio_restore_backup', function () {
|
13 |
+
check_admin_referer('wio-iph');
|
14 |
+
|
15 |
+
$max_process_per_request = 5;
|
16 |
+
$total = $_POST['total'];
|
17 |
+
|
18 |
+
$media_library = new WIO_MediaLibrary();
|
19 |
+
|
20 |
+
if( $total == '?' ) {
|
21 |
+
$total = $media_library->getOptimizedCount();
|
22 |
+
}
|
23 |
+
$restored_data = $media_library->restoreAllFromBackup($max_process_per_request);
|
24 |
+
|
25 |
+
$restored_data['total'] = $total;
|
26 |
+
if( $total ) {
|
27 |
+
$restored_data['percent'] = 100 - ($restored_data['remain'] * 100 / $total);
|
28 |
+
} else {
|
29 |
+
$restored_data['percent'] = 0;
|
30 |
+
}
|
31 |
+
|
32 |
+
// если изображения закончились - посылаем команду завершения
|
33 |
+
if( $restored_data['remain'] <= 0 ) {
|
34 |
+
$restored_data['end'] = true;
|
35 |
+
}
|
36 |
+
wp_send_json($restored_data);
|
37 |
+
});
|
38 |
+
|
39 |
+
/**
|
40 |
+
* AJAX обработчик очистки папки с бекапами
|
41 |
+
*/
|
42 |
+
add_action('wp_ajax_wio_clear_backup', function () {
|
43 |
+
check_admin_referer('wio-iph');
|
44 |
+
|
45 |
+
$backup = new WIO_Backup();
|
46 |
+
$backup->removeBackupDir();
|
47 |
+
wp_send_json(true);
|
48 |
+
});
|
49 |
+
|
50 |
+
/**
|
51 |
+
* AJAX обработчик массовой сохранения уровня сжатия
|
52 |
+
*/
|
53 |
+
add_action('wp_ajax_wio_settings_update_level', function () {
|
54 |
+
check_admin_referer('wio-iph');
|
55 |
+
|
56 |
+
$level = $_POST['level'];
|
57 |
+
|
58 |
+
if( !$level ) {
|
59 |
+
die();
|
60 |
+
}
|
61 |
+
if( !in_array($level, array('normal', 'aggresive', 'ultra')) ) {
|
62 |
+
die();
|
63 |
+
}
|
64 |
+
WIO_Plugin::app()->updateOption('image_optimization_level', $level);
|
65 |
+
die();
|
66 |
+
});
|
admin/ajax/check-servers-status.php
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Ajax действие, которое выполняется для проверки статуса серверов
|
4 |
+
*
|
5 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* @copyright (c) 2018 Webraftic Ltd
|
7 |
+
* @version 1.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if( !defined('ABSPATH') ) {
|
12 |
+
exit;
|
13 |
+
}
|
14 |
+
|
15 |
+
function wbcr_rio_check_servers_status()
|
16 |
+
{
|
17 |
+
$server_name = WIO_Plugin::app()->request->post('server_name');
|
18 |
+
|
19 |
+
if( empty($server_name) || !in_array($server_name, array('server_1', 'server_2', 'server_3', 'server_4')) ) {
|
20 |
+
wp_send_json_error(array('error' => 'Server name is empty!'));
|
21 |
+
}
|
22 |
+
|
23 |
+
$return_data = array('server_name' => $server_name);
|
24 |
+
|
25 |
+
$server_url = wbcr_rio_get_server_url($server_name);
|
26 |
+
|
27 |
+
$method = 'POST';
|
28 |
+
if( $server_name == 'server_4' ) {
|
29 |
+
$api_url = $server_url . '/upload/' . wbcr_rio_generate_random_string(16) . '/';
|
30 |
+
} else if($server_name == 'server_3') {
|
31 |
+
$api_url = $server_url . '/s.w.org/images/home/screen-themes.png';
|
32 |
+
$method = 'GET';
|
33 |
+
} else {
|
34 |
+
$api_url = $server_url;
|
35 |
+
}
|
36 |
+
|
37 |
+
$request = wp_remote_request($api_url, array(
|
38 |
+
'method' => $method
|
39 |
+
));
|
40 |
+
|
41 |
+
if( is_wp_error($request) ) {
|
42 |
+
$return_data['error'] = $request->get_error_message();
|
43 |
+
wp_send_json_error($return_data);
|
44 |
+
}
|
45 |
+
|
46 |
+
$response_code = wp_remote_retrieve_response_code($request);
|
47 |
+
|
48 |
+
if( $response_code != 200 ) {
|
49 |
+
$return_data['error'] = 'Server response ' . $response_code;
|
50 |
+
wp_send_json_error($return_data);
|
51 |
+
}
|
52 |
+
|
53 |
+
wp_send_json_success($return_data);
|
54 |
+
}
|
55 |
+
|
56 |
+
add_action('wp_ajax_wbcr_rio_check_servers_status', 'wbcr_rio_check_servers_status');
|
admin/ajax/optimization.php
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Optimization
|
4 |
+
*
|
5 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* @copyright (c) 22.10.2018, Webcraftic
|
7 |
+
* @version 1.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
/**
|
11 |
+
* AJAX обработчик массовой оптимизации изображений со страницы статистики
|
12 |
+
*/
|
13 |
+
add_action('wp_ajax_wio_process_images', function () {
|
14 |
+
check_admin_referer('wio-iph');
|
15 |
+
|
16 |
+
$cron_mode = (bool)WIO_Plugin::app()->request->request('cron_mode');
|
17 |
+
$reset_current_error = (bool)WIO_Plugin::app()->request->request('reset_current_error');
|
18 |
+
|
19 |
+
$media_library = new WIO_MediaLibrary();
|
20 |
+
if ( $reset_current_error ) {
|
21 |
+
$media_library->resetCurrentErrors(); // сбрасываем текущие ошибки оптимизации
|
22 |
+
}
|
23 |
+
|
24 |
+
if( $cron_mode ) {
|
25 |
+
$cron_running = WIO_Plugin::app()->getOption('cron_running', false);
|
26 |
+
if( $cron_running ) {
|
27 |
+
WIO_Plugin::app()->updateOption('cron_running', false);
|
28 |
+
WIO_Cron::stop();
|
29 |
+
} else {
|
30 |
+
WIO_Plugin::app()->updateOption('cron_running', true);
|
31 |
+
WIO_Cron::start();
|
32 |
+
}
|
33 |
+
|
34 |
+
wp_send_json(true);
|
35 |
+
die();
|
36 |
+
}
|
37 |
+
$max_process_per_request = 1;
|
38 |
+
$optimized_data = $media_library->processUnoptimizedAttachments($max_process_per_request);
|
39 |
+
|
40 |
+
// если изображения закончились - посылаем команду завершения
|
41 |
+
if( $optimized_data['remain'] <= 0 ) {
|
42 |
+
$optimized_data['end'] = true;
|
43 |
+
}
|
44 |
+
|
45 |
+
wp_send_json($optimized_data);
|
46 |
+
});
|
admin/ajax/select-server.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Ajax действие, которое выполняется для выбора нового сервера оптимизации
|
4 |
+
*
|
5 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* @copyright (c) 2018 Webraftic Ltd
|
7 |
+
* @version 1.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if( !defined('ABSPATH') ) {
|
12 |
+
exit;
|
13 |
+
}
|
14 |
+
|
15 |
+
function wbcr_rio_select_server()
|
16 |
+
{
|
17 |
+
$server_name = WIO_Plugin::app()->request->post('server_name');
|
18 |
+
|
19 |
+
if( empty($server_name) ) {
|
20 |
+
wp_send_json_error(array('error' => 'Server name is empty!'));
|
21 |
+
}
|
22 |
+
|
23 |
+
check_ajax_referer('wbcr_rio_select_' . $server_name);
|
24 |
+
|
25 |
+
WIO_Plugin::app()->updateOption('image_optimization_server', $server_name);
|
26 |
+
|
27 |
+
wp_send_json_success();
|
28 |
+
}
|
29 |
+
|
30 |
+
add_action('wp_ajax_wbcr_rio_select_server', 'wbcr_rio_select_server');
|
31 |
+
|
admin/assets/css/base-statistic.css
CHANGED
@@ -35,13 +35,90 @@
|
|
35 |
#WBCR .wio-clear {
|
36 |
clear: both;
|
37 |
}
|
38 |
-
#WBCR .
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
padding: 20px;
|
40 |
-
|
41 |
-
background: #ffffff;
|
42 |
-
margin-bottom: 40px;
|
43 |
font-size: 15px;
|
44 |
-
color: #
|
|
|
45 |
}
|
46 |
#WBCR .wio-columns {
|
47 |
overflow: hidden;
|
35 |
#WBCR .wio-clear {
|
36 |
clear: both;
|
37 |
}
|
38 |
+
#WBCR .wbcr-rio-servers {
|
39 |
+
margin-top: 30px;
|
40 |
+
background: none;
|
41 |
+
padding: 0;
|
42 |
+
}
|
43 |
+
#WBCR .wbcr-rio-servers h4 {
|
44 |
+
font-size: 15px;
|
45 |
+
font-weight: 700;
|
46 |
+
}
|
47 |
+
#WBCR .wbcr-rio-servers button {
|
48 |
+
padding: 5px 10px;
|
49 |
+
border: 0;
|
50 |
+
font-size: 11px;
|
51 |
+
text-transform: uppercase !important;
|
52 |
+
font-weight: bold;
|
53 |
+
border-radius: 4px;
|
54 |
+
outline: none;
|
55 |
+
background: #f3f3f3;
|
56 |
+
color: #656565;
|
57 |
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
|
58 |
+
}
|
59 |
+
#WBCR .wbcr-rio-servers button:active {
|
60 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
|
61 |
+
}
|
62 |
+
#WBCR .wbcr-rio-servers button.wbcr-rio-loading {
|
63 |
+
width: 56px;
|
64 |
+
font-size: 0;
|
65 |
+
background: #f3f3f3 url("../img/quick-start-loader.gif") center no-repeat;
|
66 |
+
}
|
67 |
+
#WBCR .wbcr-rio-servers button.wbcr-rio-selected {
|
68 |
+
background: #f3efe2;
|
69 |
+
color: #d8d8d8;
|
70 |
+
}
|
71 |
+
#WBCR .wbcr-rio-servers button.wbcr-rio-selected:active {
|
72 |
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
|
73 |
+
}
|
74 |
+
#WBCR .wbcr-rio-servers table {
|
75 |
+
width: 100%;
|
76 |
+
box-sizing: border-box;
|
77 |
+
border-spacing: 3px;
|
78 |
+
background: #fff;
|
79 |
+
border: 2px dashed #cac9c9;
|
80 |
+
border-left: 0;
|
81 |
+
border-right: 0;
|
82 |
+
}
|
83 |
+
#WBCR .wbcr-rio-servers table th,
|
84 |
+
#WBCR .wbcr-rio-servers table td {
|
85 |
+
padding: 16px 10px;
|
86 |
+
text-align: center;
|
87 |
+
}
|
88 |
+
#WBCR .wbcr-rio-servers table th {
|
89 |
+
background: #f3f3f3;
|
90 |
+
color: #777777;
|
91 |
+
box-shadow: 0 1px 0 #d8d8d8;
|
92 |
+
}
|
93 |
+
#WBCR .wbcr-rio-servers table th:nth-child(2n+1) {
|
94 |
+
background: #f9f9f9;
|
95 |
+
}
|
96 |
+
#WBCR .wbcr-rio-servers table .wbcr-rio-server-check-proccess {
|
97 |
+
display: inline-block;
|
98 |
+
height: 10px;
|
99 |
+
width: 30px;
|
100 |
+
background: url("../img/quick-start-loader.gif") center no-repeat;
|
101 |
+
}
|
102 |
+
#WBCR .wbcr-rio-servers table .wbcr-rio-servers-list-item-selected {
|
103 |
+
background: #fffbed;
|
104 |
+
color: #cec5a8;
|
105 |
+
font-weight: 600;
|
106 |
+
}
|
107 |
+
#WBCR .wbcr-rio-servers table .wbcr-rio-server-success {
|
108 |
+
color: #8CC152;
|
109 |
+
}
|
110 |
+
#WBCR .wbcr-rio-servers table .wbcr-rio-server-error {
|
111 |
+
color: #fb5d49;
|
112 |
+
}
|
113 |
+
#WBCR .wbcr-rio-servers table .wbcr-rio-server-warning {
|
114 |
+
color: #ffb635;
|
115 |
+
}
|
116 |
+
#WBCR .wbcr-rio-servers .wbcr-rio-warning-message {
|
117 |
padding: 20px;
|
118 |
+
background: #efefef;
|
|
|
|
|
119 |
font-size: 15px;
|
120 |
+
color: #b7b7b7;
|
121 |
+
font-style: italic;
|
122 |
}
|
123 |
#WBCR .wio-columns {
|
124 |
overflow: hidden;
|
admin/assets/css/base-statistic.less
CHANGED
@@ -9,18 +9,116 @@
|
|
9 |
@negativeColor: #D2D3D6;
|
10 |
@neutralColor: #828282;
|
11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
#WBCR {
|
13 |
.wio-clear {
|
14 |
clear: both;
|
15 |
}
|
16 |
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
}
|
25 |
|
26 |
.wio-columns {
|
@@ -260,8 +358,8 @@
|
|
260 |
.wio-optimize-button {
|
261 |
width: 180px;
|
262 |
padding: 12px 30px;
|
263 |
-
background:
|
264 |
-
color:
|
265 |
border: 0;
|
266 |
box-shadow: none;
|
267 |
font-size: 14px;
|
@@ -274,8 +372,8 @@
|
|
274 |
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
|
275 |
}
|
276 |
&.wio-running {
|
277 |
-
color:
|
278 |
-
background:
|
279 |
}
|
280 |
}
|
281 |
|
9 |
@negativeColor: #D2D3D6;
|
10 |
@neutralColor: #828282;
|
11 |
|
12 |
+
@errorColor: #fb5d49;
|
13 |
+
@waringColor: #ffb635;
|
14 |
+
|
15 |
+
@greyButtonBg: #f3f3f3;
|
16 |
+
@greyButtonColor: #656565;
|
17 |
+
|
18 |
+
@greenButtonBg: #c9deb2;
|
19 |
+
@greenButtonColor: #586549;
|
20 |
+
|
21 |
+
@orangeButtonBg: #fdd599;
|
22 |
+
@orangeButtonColor: #a57b3c;
|
23 |
+
|
24 |
#WBCR {
|
25 |
.wio-clear {
|
26 |
clear: both;
|
27 |
}
|
28 |
|
29 |
+
// Right sidebar
|
30 |
+
|
31 |
+
.wbcr-rio-servers {
|
32 |
+
margin-top: 30px;
|
33 |
+
background: none;
|
34 |
+
padding: 0;
|
35 |
+
|
36 |
+
h4 {
|
37 |
+
font-size: 15px;
|
38 |
+
font-weight: 700;
|
39 |
+
}
|
40 |
+
|
41 |
+
button {
|
42 |
+
padding: 5px 10px;
|
43 |
+
border: 0;
|
44 |
+
font-size: 11px;
|
45 |
+
text-transform: uppercase !important;
|
46 |
+
font-weight: bold;
|
47 |
+
border-radius: 4px;
|
48 |
+
outline: none;
|
49 |
+
background: @greyButtonBg;
|
50 |
+
color: @greyButtonColor;
|
51 |
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
|
52 |
+
|
53 |
+
&:active {
|
54 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
|
55 |
+
}
|
56 |
+
|
57 |
+
&.wbcr-rio-loading {
|
58 |
+
width: 56px;
|
59 |
+
font-size: 0;
|
60 |
+
background: @greyButtonBg url("../img/quick-start-loader.gif") center no-repeat;
|
61 |
+
}
|
62 |
+
|
63 |
+
&.wbcr-rio-selected {
|
64 |
+
background: #f3efe2;
|
65 |
+
color: #d8d8d8;
|
66 |
+
&:active {
|
67 |
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
|
68 |
+
}
|
69 |
+
}
|
70 |
+
}
|
71 |
+
|
72 |
+
table {
|
73 |
+
width: 100%;
|
74 |
+
box-sizing: border-box;
|
75 |
+
border-spacing: 3px;
|
76 |
+
background: #fff;
|
77 |
+
border: 2px dashed #cac9c9;
|
78 |
+
border-left: 0;
|
79 |
+
border-right: 0;
|
80 |
+
|
81 |
+
th, td {
|
82 |
+
padding: 16px 10px;
|
83 |
+
text-align: center;
|
84 |
+
}
|
85 |
+
th {
|
86 |
+
background: #f3f3f3;
|
87 |
+
color: #777777;
|
88 |
+
box-shadow: 0 1px 0 rgb(216, 216, 216);
|
89 |
+
&:nth-child(2n+1) {
|
90 |
+
background: #f9f9f9
|
91 |
+
}
|
92 |
+
}
|
93 |
+
.wbcr-rio-server-check-proccess {
|
94 |
+
display: inline-block;
|
95 |
+
height: 10px;
|
96 |
+
width: 30px;
|
97 |
+
background: url("../img/quick-start-loader.gif") center no-repeat;
|
98 |
+
}
|
99 |
+
.wbcr-rio-servers-list-item-selected {
|
100 |
+
background: #fffbed;
|
101 |
+
color: #cec5a8;
|
102 |
+
font-weight: 600;
|
103 |
+
}
|
104 |
+
.wbcr-rio-server-success {
|
105 |
+
color: @positiveColor;
|
106 |
+
}
|
107 |
+
.wbcr-rio-server-error {
|
108 |
+
color: @errorColor;
|
109 |
+
}
|
110 |
+
.wbcr-rio-server-warning {
|
111 |
+
color: @waringColor;
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
.wbcr-rio-warning-message {
|
116 |
+
padding: 20px;
|
117 |
+
background: #efefef;
|
118 |
+
font-size: 15px;
|
119 |
+
color: #b7b7b7;
|
120 |
+
font-style: italic;
|
121 |
+
}
|
122 |
}
|
123 |
|
124 |
.wio-columns {
|
358 |
.wio-optimize-button {
|
359 |
width: 180px;
|
360 |
padding: 12px 30px;
|
361 |
+
background: @greenButtonBg;
|
362 |
+
color: @greenButtonColor;
|
363 |
border: 0;
|
364 |
box-shadow: none;
|
365 |
font-size: 14px;
|
372 |
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5);
|
373 |
}
|
374 |
&.wio-running {
|
375 |
+
color: @orangeButtonColor;
|
376 |
+
background: @orangeButtonBg url("../img/Spinner-1s-33px.gif") 10px center no-repeat;
|
377 |
}
|
378 |
}
|
379 |
|
admin/assets/img/quick-start-loader.gif
ADDED
Binary file
|
admin/assets/js/bulk-optimozation.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
jQuery(function($){
|
2 |
var ajaxUrl = ajaxurl;
|
3 |
-
|
4 |
$('#wio-start-optimization').on('click', function(){
|
5 |
if ( $(this).hasClass( 'wio-nobackup' ) ) {
|
6 |
result = confirm( $(this).attr('data-confirm') );
|
@@ -17,11 +17,14 @@ jQuery(function($){
|
|
17 |
$('#wio-start-msg-top').show();
|
18 |
}
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
|
|
|
|
|
|
25 |
if ( ! cron_mode ) {
|
26 |
send_post_data(ai_data);
|
27 |
} else {
|
@@ -44,7 +47,7 @@ jQuery(function($){
|
|
44 |
|
45 |
function send_post_data(data){
|
46 |
if ( $('#wio-start-optimization').hasClass( 'wio-running' ) ) {
|
47 |
-
|
48 |
$.post(ajaxUrl, data, function(response) {
|
49 |
|
50 |
if ( ! response.end ) {
|
@@ -94,12 +97,13 @@ jQuery(function($){
|
|
94 |
window.wio_chart.data.datasets[0].data[2] = statistic.error; // errors
|
95 |
window.wio_chart.update();
|
96 |
}
|
97 |
-
|
98 |
function bytesToSize(bytes) {
|
99 |
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
100 |
if (bytes == 0) return '0 Byte';
|
101 |
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
|
102 |
-
|
|
|
103 |
}
|
104 |
|
105 |
$('#wio-level-buttons button').on('click', function() {
|
1 |
jQuery(function($){
|
2 |
var ajaxUrl = ajaxurl;
|
3 |
+
var ai_data;
|
4 |
$('#wio-start-optimization').on('click', function(){
|
5 |
if ( $(this).hasClass( 'wio-nobackup' ) ) {
|
6 |
result = confirm( $(this).attr('data-confirm') );
|
17 |
$('#wio-start-msg-top').show();
|
18 |
}
|
19 |
|
20 |
+
if ( typeof(ai_data) === 'undefined' ) {
|
21 |
+
var ai_data = {
|
22 |
+
'action': 'wio_process_images',
|
23 |
+
'_wpnonce': $('#wio-iph-nonce').val(),
|
24 |
+
'cron_mode': 0,
|
25 |
+
'reset_current_errors': 1
|
26 |
+
};
|
27 |
+
}
|
28 |
if ( ! cron_mode ) {
|
29 |
send_post_data(ai_data);
|
30 |
} else {
|
47 |
|
48 |
function send_post_data(data){
|
49 |
if ( $('#wio-start-optimization').hasClass( 'wio-running' ) ) {
|
50 |
+
data.reset_current_errors = 0; // текущие ошибки сбрасываем только
|
51 |
$.post(ajaxUrl, data, function(response) {
|
52 |
|
53 |
if ( ! response.end ) {
|
97 |
window.wio_chart.data.datasets[0].data[2] = statistic.error; // errors
|
98 |
window.wio_chart.update();
|
99 |
}
|
100 |
+
|
101 |
function bytesToSize(bytes) {
|
102 |
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
103 |
if (bytes == 0) return '0 Byte';
|
104 |
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
|
105 |
+
if (i == 0) return bytes + ' ' + sizes[i];
|
106 |
+
return (bytes / Math.pow(1024, i)).toFixed(2) + ' ' + sizes[i];
|
107 |
}
|
108 |
|
109 |
$('#wio-level-buttons button').on('click', function() {
|
admin/assets/js/check-servers-status.js
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function($) {
|
2 |
+
var checkServersStatus = {
|
3 |
+
init: function() {
|
4 |
+
this.checkStatus();
|
5 |
+
|
6 |
+
$('.wbcr-rio-select-server-button').click(function() {
|
7 |
+
var serverName = $(this).data('server'),
|
8 |
+
nonce = $(this).data('nonce'),
|
9 |
+
self = $(this);
|
10 |
+
|
11 |
+
if( self.hasClass('wbcr-rio-selected') ) {
|
12 |
+
return false;
|
13 |
+
}
|
14 |
+
|
15 |
+
if( !serverName ) {
|
16 |
+
alert('Undefined error, no server selected');
|
17 |
+
return;
|
18 |
+
}
|
19 |
+
|
20 |
+
var data = {
|
21 |
+
'action': 'wbcr_rio_select_server',
|
22 |
+
'server_name': serverName,
|
23 |
+
'_wpnonce': nonce
|
24 |
+
};
|
25 |
+
|
26 |
+
self.addClass('wbcr-rio-loading');
|
27 |
+
|
28 |
+
$.post(ajaxurl, data, function(response) {
|
29 |
+
$('.wbcr-rio-servers-list-item').removeClass('wbcr-rio-servers-list-item-selected');
|
30 |
+
$('.wbcr-rio-select-server-button').removeClass('wbcr-rio-selected');
|
31 |
+
|
32 |
+
self.addClass('wbcr-rio-selected').removeClass('wbcr-rio-loading');
|
33 |
+
self.closest('tr').addClass('wbcr-rio-servers-list-item-selected');
|
34 |
+
});
|
35 |
+
});
|
36 |
+
},
|
37 |
+
|
38 |
+
checkStatus: function() {
|
39 |
+
var data = {
|
40 |
+
'action': 'wbcr_rio_check_servers_status'
|
41 |
+
};
|
42 |
+
|
43 |
+
var servers = ['server_1', 'server_2', /*'server_4',*/ 'server_3'];
|
44 |
+
|
45 |
+
for( var i = 0; i < servers.length; i++ ) {
|
46 |
+
|
47 |
+
data['server_name'] = servers[i];
|
48 |
+
|
49 |
+
$('.wbcr-rio-' + servers[i]).find('.wbcr-rio-server-status').html('<div class="wbcr-rio-server-check-proccess"></div>');
|
50 |
+
|
51 |
+
$.post(ajaxurl, data, function(response) {
|
52 |
+
var serverName = response.data.server_name,
|
53 |
+
serverElement = $('.wbcr-rio-' + serverName).find('.wbcr-rio-server-status');
|
54 |
+
|
55 |
+
if( !response || !response.data || !response.success ) {
|
56 |
+
if( !response || !response.data ) {
|
57 |
+
console.log('[Error]: Response error');
|
58 |
+
console.log(response);
|
59 |
+
return;
|
60 |
+
}
|
61 |
+
|
62 |
+
serverElement.removeClass('wbcr-rio-server-warning').removeClass('wbcr-rio-server-success');
|
63 |
+
serverElement.addClass('wbcr-rio-server-error').html('Down');
|
64 |
+
return;
|
65 |
+
}
|
66 |
+
|
67 |
+
serverElement.removeClass('wbcr-rio-server-warning').removeClass('wbcr-rio-server-error');
|
68 |
+
serverElement.addClass('wbcr-rio-server-success').html('Stable');
|
69 |
+
});
|
70 |
+
}
|
71 |
+
}
|
72 |
+
};
|
73 |
+
|
74 |
+
$(document).ready(function() {
|
75 |
+
checkServersStatus.init();
|
76 |
+
});
|
77 |
+
})(jQuery);
|
78 |
+
|
79 |
+
|
80 |
+
|
81 |
+
|
82 |
+
|
admin/assets/js/restore-backup.js
CHANGED
@@ -11,7 +11,7 @@ jQuery(function($){
|
|
11 |
var ai_data = {
|
12 |
'total' : '?',
|
13 |
'action': 'wio_restore_backup',
|
14 |
-
'_wpnonce': $('#wio-iph-nonce').val()
|
15 |
};
|
16 |
send_post_data(ai_data);
|
17 |
return false;
|
@@ -25,7 +25,7 @@ jQuery(function($){
|
|
25 |
}
|
26 |
var data = {
|
27 |
'action': 'wio_clear_backup',
|
28 |
-
'_wpnonce': $('#wio-iph-nonce').val()
|
29 |
};
|
30 |
$.post(ajaxUrl, data, function(response) {
|
31 |
$('#wio-clear-backup-msg').show();
|
11 |
var ai_data = {
|
12 |
'total' : '?',
|
13 |
'action': 'wio_restore_backup',
|
14 |
+
'_wpnonce': $('#wio-iph-nonce').val()
|
15 |
};
|
16 |
send_post_data(ai_data);
|
17 |
return false;
|
25 |
}
|
26 |
var data = {
|
27 |
'action': 'wio_clear_backup',
|
28 |
+
'_wpnonce': $('#wio-iph-nonce').val()
|
29 |
};
|
30 |
$.post(ajaxUrl, data, function(response) {
|
31 |
$('#wio-clear-backup-msg').show();
|
admin/assets/js/statistic.js
CHANGED
@@ -2,6 +2,7 @@ jQuery(function($) {
|
|
2 |
|
3 |
var chat_html_id = 'wio-main-chart';
|
4 |
var ctx = document.getElementById( chat_html_id );
|
|
|
5 |
window.wio_chart = new Chart( ctx, {
|
6 |
type: 'doughnut',
|
7 |
data: {
|
@@ -18,7 +19,7 @@ jQuery(function($) {
|
|
18 |
],
|
19 |
borderWidth: 0,
|
20 |
label: 'Dataset 1'
|
21 |
-
}]
|
22 |
},
|
23 |
options: {
|
24 |
legend: {
|
@@ -32,5 +33,4 @@ jQuery(function($) {
|
|
32 |
cutoutPercentage: 80
|
33 |
}
|
34 |
} );
|
35 |
-
|
36 |
});
|
2 |
|
3 |
var chat_html_id = 'wio-main-chart';
|
4 |
var ctx = document.getElementById( chat_html_id );
|
5 |
+
|
6 |
window.wio_chart = new Chart( ctx, {
|
7 |
type: 'doughnut',
|
8 |
data: {
|
19 |
],
|
20 |
borderWidth: 0,
|
21 |
label: 'Dataset 1'
|
22 |
+
}]
|
23 |
},
|
24 |
options: {
|
25 |
legend: {
|
33 |
cutoutPercentage: 80
|
34 |
}
|
35 |
} );
|
|
|
36 |
});
|
admin/boot.php
CHANGED
@@ -11,6 +11,40 @@
|
|
11 |
exit;
|
12 |
}
|
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
/**
|
15 |
* Виджет отзывов
|
16 |
*
|
@@ -20,21 +54,22 @@
|
|
20 |
*/
|
21 |
function wio_rating_widget_url($page_url, $plugin_name)
|
22 |
{
|
23 |
-
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') && ($plugin_name == WIO_Plugin::app()->getPluginName())
|
|
|
24 |
return 'https://wordpress.org/support/plugin/robin-image-optimizer/reviews/#new-post';
|
25 |
}
|
26 |
|
27 |
return $page_url;
|
28 |
}
|
29 |
|
30 |
-
add_filter('
|
31 |
|
32 |
/**
|
33 |
* Widget with the offer to buy Clearfy Business
|
34 |
*
|
35 |
* @param array $widgets
|
36 |
* @param string $position
|
37 |
-
* @param
|
38 |
*/
|
39 |
function wio_donate_widget($widgets, $position, $plugin)
|
40 |
{
|
@@ -69,7 +104,7 @@
|
|
69 |
return $widgets;
|
70 |
}
|
71 |
|
72 |
-
add_filter('
|
73 |
|
74 |
|
75 |
|
11 |
exit;
|
12 |
}
|
13 |
|
14 |
+
/**
|
15 |
+
* Widget with the offer to buy Clearfy Business
|
16 |
+
*
|
17 |
+
* @param array $widgets
|
18 |
+
* @param string $position
|
19 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
20 |
+
*/
|
21 |
+
add_filter('wbcr/factory/pages/impressive/widgets', function ($widgets, $position, $plugin) {
|
22 |
+
if( $plugin->getPluginName() == WIO_Plugin::app()->getPluginName() ) {
|
23 |
+
if( $position == 'right' ) {
|
24 |
+
unset($widgets['donate_widget']);
|
25 |
+
unset($widgets['info_widget']);
|
26 |
+
//unset($widgets['businnes_suggetion']);
|
27 |
+
}
|
28 |
+
}
|
29 |
+
|
30 |
+
return $widgets;
|
31 |
+
}, 20, 3);
|
32 |
+
|
33 |
+
/***
|
34 |
+
* Flush configuration after saving the settings
|
35 |
+
*
|
36 |
+
* @param WHM_Plugin $plugin
|
37 |
+
* @param Wbcr_FactoryPages410_ImpressiveThemplate $obj
|
38 |
+
* @return bool
|
39 |
+
*/
|
40 |
+
/*add_action('wbcr_factory_409_imppage_after_form_save', function ($plugin, $obj) {
|
41 |
+
$is_rio = WIO_Plugin::app()->getPluginName() == $plugin->getPluginName();
|
42 |
+
|
43 |
+
if( $is_rio ) {
|
44 |
+
WIO_Cron::check();
|
45 |
+
}
|
46 |
+
}, 10, 2);*/
|
47 |
+
|
48 |
/**
|
49 |
* Виджет отзывов
|
50 |
*
|
54 |
*/
|
55 |
function wio_rating_widget_url($page_url, $plugin_name)
|
56 |
{
|
57 |
+
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') && ($plugin_name == WIO_Plugin::app()->getPluginName())
|
58 |
+
) {
|
59 |
return 'https://wordpress.org/support/plugin/robin-image-optimizer/reviews/#new-post';
|
60 |
}
|
61 |
|
62 |
return $page_url;
|
63 |
}
|
64 |
|
65 |
+
add_filter('wbcr_factory_pages_410_imppage_rating_widget_url', 'wio_rating_widget_url', 10, 2);
|
66 |
|
67 |
/**
|
68 |
* Widget with the offer to buy Clearfy Business
|
69 |
*
|
70 |
* @param array $widgets
|
71 |
* @param string $position
|
72 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
73 |
*/
|
74 |
function wio_donate_widget($widgets, $position, $plugin)
|
75 |
{
|
104 |
return $widgets;
|
105 |
}
|
106 |
|
107 |
+
add_filter('wbcr/factory/pages/impressive/widgets', 'wio_donate_widget', 10, 3);
|
108 |
|
109 |
|
110 |
|
admin/pages/log.php
CHANGED
@@ -17,28 +17,60 @@
|
|
17 |
* @copyright (c) 2018, Webcraftic
|
18 |
* @version 1.0
|
19 |
*/
|
20 |
-
class WIO_LogPage extends
|
21 |
|
22 |
/**
|
23 |
* The id of the page in the admin menu.
|
24 |
*
|
25 |
* Mainly used to navigate between pages.
|
26 |
-
* @see
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
* @var string
|
30 |
*/
|
31 |
public $id = 'io_logs'; // Уникальный идентификатор страницы
|
|
|
32 |
public $page_menu_dashicon = 'dashicons-admin-tools'; // Иконка для закладки страницы, дашикон
|
|
|
33 |
public $page_parent_page = null; // Уникальный идентификатор родительской страницы
|
|
|
34 |
public $type = 'page';
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
/**
|
37 |
-
* @param
|
38 |
*/
|
39 |
-
public function __construct(
|
40 |
{
|
41 |
$this->menu_title = __('Error Log', 'robin-image-optimizer');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
parent::__construct($plugin);
|
43 |
}
|
44 |
|
@@ -49,8 +81,8 @@
|
|
49 |
*/
|
50 |
public function getMenuScope()
|
51 |
{
|
52 |
-
if(
|
53 |
-
$this->page_parent_page = '
|
54 |
|
55 |
return 'wbcr_clearfy';
|
56 |
}
|
@@ -61,7 +93,7 @@
|
|
61 |
/**
|
62 |
* Requests assets (js and css) for the page.
|
63 |
*
|
64 |
-
* @see
|
65 |
*
|
66 |
* @since 1.0.0
|
67 |
* @return void
|
@@ -79,9 +111,7 @@
|
|
79 |
// Метод позволяет менять заголовок меню, в зависимости от сборки плагина.
|
80 |
public function getMenuTitle()
|
81 |
{
|
82 |
-
return defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON')
|
83 |
-
? __('Image optimizer', 'robin-image-optimizer')
|
84 |
-
: __('Error Log', 'robin-image-optimizer');
|
85 |
}
|
86 |
|
87 |
/**
|
@@ -89,7 +119,7 @@
|
|
89 |
*/
|
90 |
public function showPageContent()
|
91 |
{
|
92 |
-
$logger =
|
93 |
?>
|
94 |
<div class="wbcr-factory-page-group-header" style="margin-top:0;">
|
95 |
<strong><?php _e('Error Log', 'robin-image-optimizer') ?></strong>
|
17 |
* @copyright (c) 2018, Webcraftic
|
18 |
* @version 1.0
|
19 |
*/
|
20 |
+
class WIO_LogPage extends Wbcr_FactoryClearfy206_PageBase {
|
21 |
|
22 |
/**
|
23 |
* The id of the page in the admin menu.
|
24 |
*
|
25 |
* Mainly used to navigate between pages.
|
26 |
+
* @see FactoryPages410_AdminPage
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
* @var string
|
30 |
*/
|
31 |
public $id = 'io_logs'; // Уникальный идентификатор страницы
|
32 |
+
|
33 |
public $page_menu_dashicon = 'dashicons-admin-tools'; // Иконка для закладки страницы, дашикон
|
34 |
+
|
35 |
public $page_parent_page = null; // Уникальный идентификатор родительской страницы
|
36 |
+
|
37 |
public $type = 'page';
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @var bool
|
41 |
+
*/
|
42 |
+
//public $available_for_multisite = true;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @var bool
|
46 |
+
*/
|
47 |
+
public $clearfy_collaboration = false;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Показывать правый сайдбар?
|
51 |
+
* Сайдбар будет показан на внутренних страницах шаблона.
|
52 |
+
*
|
53 |
+
* @var bool
|
54 |
+
*/
|
55 |
+
public $show_right_sidebar_in_options = false;
|
56 |
+
|
57 |
/**
|
58 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
59 |
*/
|
60 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
61 |
{
|
62 |
$this->menu_title = __('Error Log', 'robin-image-optimizer');
|
63 |
+
|
64 |
+
if( is_multisite() && defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
65 |
+
$clearfy_is_active_for_network = is_plugin_active_for_network(Wbcr_FactoryClearfy_Compatibility::getClearfyBasePath());
|
66 |
+
|
67 |
+
if( WIO_Plugin::app()->isNetworkActive() && $clearfy_is_active_for_network ) {
|
68 |
+
$this->clearfy_collaboration = true;
|
69 |
+
}
|
70 |
+
} else if( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
71 |
+
$this->clearfy_collaboration = true;
|
72 |
+
}
|
73 |
+
|
74 |
parent::__construct($plugin);
|
75 |
}
|
76 |
|
81 |
*/
|
82 |
public function getMenuScope()
|
83 |
{
|
84 |
+
if( $this->clearfy_collaboration ) {
|
85 |
+
$this->page_parent_page = 'io_general';
|
86 |
|
87 |
return 'wbcr_clearfy';
|
88 |
}
|
93 |
/**
|
94 |
* Requests assets (js and css) for the page.
|
95 |
*
|
96 |
+
* @see Wbcr_FactoryPages410_AdminPage
|
97 |
*
|
98 |
* @since 1.0.0
|
99 |
* @return void
|
111 |
// Метод позволяет менять заголовок меню, в зависимости от сборки плагина.
|
112 |
public function getMenuTitle()
|
113 |
{
|
114 |
+
return defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ? __('Image optimizer', 'robin-image-optimizer') : __('Error Log', 'robin-image-optimizer');
|
|
|
|
|
115 |
}
|
116 |
|
117 |
/**
|
119 |
*/
|
120 |
public function showPageContent()
|
121 |
{
|
122 |
+
$logger = new WIO_Logger();
|
123 |
?>
|
124 |
<div class="wbcr-factory-page-group-header" style="margin-top:0;">
|
125 |
<strong><?php _e('Error Log', 'robin-image-optimizer') ?></strong>
|
admin/pages/settings.php
CHANGED
@@ -7,7 +7,7 @@
|
|
7 |
*/
|
8 |
|
9 |
// Exit if accessed directly
|
10 |
-
if( !
|
11 |
exit;
|
12 |
}
|
13 |
|
@@ -17,13 +17,13 @@
|
|
17 |
* @copyright (c) 2018, Webcraftic
|
18 |
* @version 1.0
|
19 |
*/
|
20 |
-
class WIO_SettingsPage extends
|
21 |
|
22 |
/**
|
23 |
* The id of the page in the admin menu.
|
24 |
*
|
25 |
* Mainly used to navigate between pages.
|
26 |
-
* @see
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
* @var string
|
@@ -33,98 +33,73 @@
|
|
33 |
public $page_parent_page = null; // Уникальный идентификатор родительской страницы
|
34 |
|
35 |
/**
|
36 |
-
* @
|
37 |
*/
|
38 |
-
public
|
39 |
-
// Заголовок страницы
|
40 |
-
$this->menu_title = __( 'Main Settings', 'robin-image-optimizer' );
|
41 |
-
parent::__construct( $plugin );
|
42 |
-
$this->hooks();
|
43 |
-
}
|
44 |
|
45 |
/**
|
46 |
-
*
|
47 |
-
* Меню текущего плагина будет добавлено в общее меню Clearfy
|
48 |
-
* @return string
|
49 |
*/
|
50 |
-
public
|
51 |
-
if(defined('WBCR_CLEARFY_PLUGIN_ACTIVE')) {
|
52 |
-
$this->page_parent_page = 'image_optimizer';
|
53 |
-
return 'wbcr_clearfy';
|
54 |
-
}
|
55 |
|
56 |
-
return $this->plugin->getPluginName();
|
57 |
-
}
|
58 |
-
|
59 |
-
public function hooks() {
|
60 |
-
add_action( 'wp_ajax_wio_restore_backup', array( $this, 'ajaxRestoreBackup' ) );
|
61 |
-
add_action( 'wp_ajax_wio_clear_backup', array( $this, 'ajaxClearBackupDir' ) );
|
62 |
-
add_action( 'wp_ajax_wio_settings_update_level', array( $this, 'ajaxUpdateLevel' ) );
|
63 |
-
}
|
64 |
-
|
65 |
/**
|
66 |
-
*
|
|
|
|
|
|
|
67 |
*/
|
68 |
-
public
|
69 |
-
|
70 |
-
$max_process_per_request = 5;
|
71 |
-
$total = $_POST['total'];
|
72 |
-
$media_library = WIO_Plugin::app()->getMediaLibrary();
|
73 |
-
if ( $total == '?' ) {
|
74 |
-
$total = $media_library->getOptimizedCount();
|
75 |
-
}
|
76 |
-
$restored_data = $media_library->restoreAllFromBackup( $max_process_per_request );
|
77 |
-
|
78 |
-
$restored_data['total'] = $total;
|
79 |
-
if ( $total ) {
|
80 |
-
$restored_data['percent'] = 100 - ( $restored_data['remain'] * 100 / $total );
|
81 |
-
} else {
|
82 |
-
$restored_data['percent'] = 0;
|
83 |
-
}
|
84 |
-
// если изображения закончились - посылаем команду завершения
|
85 |
-
if ( $restored_data['remain'] <= 0 ) {
|
86 |
-
$restored_data['end'] = true;
|
87 |
-
}
|
88 |
-
wp_send_json( $restored_data );
|
89 |
-
}
|
90 |
-
|
91 |
/**
|
92 |
-
*
|
93 |
*/
|
94 |
-
public function
|
95 |
-
|
96 |
-
|
97 |
-
$
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
}
|
100 |
-
|
101 |
/**
|
102 |
-
*
|
|
|
|
|
103 |
*/
|
104 |
-
public function
|
105 |
-
|
106 |
-
$
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
if ( ! in_array( $level, array( 'normal', 'aggresive', 'ultra' ) ) ) {
|
111 |
-
die();
|
112 |
}
|
113 |
-
|
114 |
-
|
115 |
}
|
116 |
-
|
117 |
/**
|
118 |
* Подключаем скрипты и стили для страницы
|
119 |
*
|
120 |
-
* @see
|
121 |
*
|
122 |
* @since 1.0.0
|
123 |
* @return void
|
124 |
*/
|
125 |
-
public function assets(
|
126 |
-
|
127 |
-
$
|
|
|
128 |
|
129 |
// Add Clearfy styles for HMWP pages
|
130 |
if( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
@@ -137,17 +112,18 @@
|
|
137 |
* Выводим предупреждения
|
138 |
*
|
139 |
*/
|
140 |
-
protected function warningNotice()
|
|
|
141 |
$upload_dir = wp_upload_dir();
|
142 |
-
if
|
143 |
-
$this->printErrorNotice(
|
144 |
}
|
145 |
$wio_backup = $upload_dir['basedir'] . '/wio_backup/';
|
146 |
-
if
|
147 |
-
$this->printErrorNotice(
|
148 |
}
|
149 |
-
if
|
150 |
-
$this->printErrorNotice(
|
151 |
}
|
152 |
}
|
153 |
|
@@ -159,12 +135,13 @@
|
|
159 |
* @since 1.0.0
|
160 |
* @return mixed[]
|
161 |
*/
|
162 |
-
public function
|
|
|
163 |
$options = array();
|
164 |
|
165 |
$options[] = array(
|
166 |
'type' => 'html',
|
167 |
-
'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __(
|
168 |
);
|
169 |
|
170 |
$options[] = array(
|
@@ -173,45 +150,54 @@
|
|
173 |
'title' => __('Optimization server', 'robin-image-optimizer'),
|
174 |
'data' => array(
|
175 |
array(
|
176 |
-
'
|
177 |
__('Server 1 (recommended) - image size limit up to 5 MB', 'robin-image-optimizer'),
|
178 |
|
179 |
),
|
180 |
array(
|
181 |
-
'
|
182 |
__('Server 2 - image size limit up to 1 MB', 'robin-image-optimizer')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
183 |
)
|
184 |
),
|
185 |
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
186 |
'hint' => __('We use several free servers for image optimization and can’t fully guarantee their stable performance. The server can be not available in some countries due to the political reasons. There is a solution: if one of the servers is not available or can’t optimize the image, you can try to switch to the alternative server. Each server has individual limitations for image weight and optimization level. By default, you have the best server with minimum limitations.', 'robin-image-optimizer'),
|
187 |
-
'default' => '
|
188 |
-
);
|
189 |
|
190 |
// Радио переключатель
|
191 |
$options[] = array(
|
192 |
-
'type'
|
193 |
-
'name'
|
194 |
-
'way'
|
195 |
-
'title' => __(
|
196 |
-
'data'
|
197 |
array(
|
198 |
'normal',
|
199 |
-
__(
|
200 |
-
__(
|
201 |
),
|
202 |
array(
|
203 |
'aggresive',
|
204 |
-
__(
|
205 |
-
__(
|
206 |
),
|
207 |
array(
|
208 |
'ultra',
|
209 |
-
__(
|
210 |
-
__(
|
211 |
)
|
212 |
),
|
213 |
-
'layout'
|
214 |
-
'hint'
|
215 |
'default' => 'normal',
|
216 |
/*'events' => array(
|
217 |
'disable_certain_post_types_comments' => array(
|
@@ -229,92 +215,92 @@
|
|
229 |
|
230 |
// Переключатель
|
231 |
$options[] = array(
|
232 |
-
'type'
|
233 |
-
'way'
|
234 |
-
'name'
|
235 |
-
'title'
|
236 |
-
'layout'
|
237 |
-
'hint'
|
238 |
'default' => false
|
239 |
);
|
240 |
|
241 |
// Переключатель
|
242 |
$options[] = array(
|
243 |
-
'type'
|
244 |
-
'way'
|
245 |
-
'name'
|
246 |
-
'title'
|
247 |
-
'layout'
|
248 |
-
'hint'
|
249 |
'default' => true
|
250 |
);
|
251 |
|
252 |
// Переключатель
|
253 |
$options[] = array(
|
254 |
-
'type'
|
255 |
-
'way'
|
256 |
-
'name'
|
257 |
-
'title'
|
258 |
-
'layout'
|
259 |
-
'hint'
|
260 |
'default' => false
|
261 |
);
|
262 |
|
263 |
// восстановление
|
264 |
$options[] = array(
|
265 |
'type' => 'html',
|
266 |
-
'html' => array(
|
267 |
);
|
268 |
|
269 |
// Переключатель
|
270 |
$options[] = array(
|
271 |
-
'type'
|
272 |
-
'way'
|
273 |
-
'name'
|
274 |
-
'title'
|
275 |
-
'layout'
|
276 |
-
'hint'
|
277 |
'default' => true
|
278 |
);
|
279 |
|
280 |
$options[] = array(
|
281 |
'type' => 'html',
|
282 |
-
'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __(
|
283 |
);
|
284 |
|
285 |
// Переключатель
|
286 |
$options[] = array(
|
287 |
-
'type'
|
288 |
-
'way'
|
289 |
-
'name'
|
290 |
-
'title'
|
291 |
-
'layout'
|
292 |
-
'hint'
|
293 |
-
'default'
|
294 |
// когда чекбокс включен показываем поле с классом .factory-control-resize_larger_w
|
295 |
'eventsOn' => array(
|
296 |
'show' => '.factory-control-resize_larger_w'
|
297 |
),
|
298 |
// когда чекбокс выключен, скрываем поле с классом .factory-control-resize_larger_w
|
299 |
'eventsOff' => array(
|
300 |
-
'hide'
|
301 |
)
|
302 |
);
|
303 |
|
304 |
// Текстовое поле
|
305 |
$options[] = array(
|
306 |
-
'type'
|
307 |
-
'name'
|
308 |
-
'title'
|
309 |
-
'layout'
|
310 |
-
'hint'
|
311 |
'default' => '1600'
|
312 |
);
|
313 |
|
314 |
// получаем зарегистрированные размеры изображений
|
315 |
$wp_image_sizes = wio_get_image_sizes();
|
316 |
$wio_image_sizes = array();
|
317 |
-
foreach(
|
318 |
$wio_image_sizes[] = array(
|
319 |
$key,
|
320 |
$key . ' - ' . $value['width'] . 'x' . $value['height'],
|
@@ -322,32 +308,32 @@
|
|
322 |
}
|
323 |
|
324 |
$options[] = array(
|
325 |
-
'type'
|
326 |
-
'way'
|
327 |
-
'name'
|
328 |
-
'title'
|
329 |
-
'data'
|
330 |
-
'layout'
|
331 |
-
'hint'
|
332 |
'default' => 'thumbnail,medium'
|
333 |
);
|
334 |
|
335 |
// cron
|
336 |
$options[] = array(
|
337 |
'type' => 'html',
|
338 |
-
'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __(
|
339 |
);
|
340 |
|
341 |
// автооптимизация
|
342 |
$options[] = array(
|
343 |
-
'type'
|
344 |
-
'way'
|
345 |
-
'name'
|
346 |
-
'title'
|
347 |
-
'layout'
|
348 |
-
'hint'
|
349 |
-
'default'
|
350 |
-
'eventsOn'
|
351 |
'show' => '#wbcr-io-shedule-options'
|
352 |
),
|
353 |
'eventsOff' => array(
|
@@ -356,80 +342,80 @@
|
|
356 |
);
|
357 |
|
358 |
$group_items[] = array(
|
359 |
-
'type'
|
360 |
-
'way'
|
361 |
-
'name'
|
362 |
-
'data'
|
363 |
-
array(
|
364 |
-
array(
|
365 |
-
array(
|
366 |
-
array(
|
367 |
-
array(
|
368 |
-
array(
|
369 |
-
array(
|
370 |
),
|
371 |
'default' => 'wio_5_min',
|
372 |
-
'title'
|
373 |
-
'hint'
|
374 |
);
|
375 |
|
376 |
-
|
377 |
$group_items[] = array(
|
378 |
-
'type'
|
379 |
-
'name'
|
380 |
-
'title'
|
381 |
-
'layout'
|
382 |
-
'hint'
|
383 |
'default' => '3'
|
384 |
);
|
385 |
|
386 |
$options[] = array(
|
387 |
-
'type'
|
388 |
-
'id'
|
389 |
'items' => $group_items
|
390 |
);
|
391 |
|
392 |
$formOptions = array();
|
393 |
|
394 |
$formOptions[] = array(
|
395 |
-
'type'
|
396 |
'items' => $options,
|
397 |
//'cssClass' => 'postbox'
|
398 |
);
|
399 |
|
400 |
-
return apply_filters(
|
401 |
}
|
402 |
|
403 |
/**
|
404 |
* Кнопка восстановления изображений
|
405 |
*
|
406 |
*/
|
407 |
-
public function rollbackButton()
|
|
|
408 |
?>
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt="">
|
414 |
</span>
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
</div>
|
426 |
</div>
|
427 |
-
<p id="wio-restore-backup-msg" style="display:none;"><?php _e( 'Restore completed.', 'robin-image-optimizer' ); ?></p>
|
428 |
-
<p id="wio-clear-backup-msg" style="display:none;"><?php _e( 'The backup folder was cleared.', 'robin-image-optimizer' ); ?></p>
|
429 |
</div>
|
|
|
|
|
|
|
430 |
</div>
|
431 |
-
|
432 |
-
<?php
|
433 |
-
}
|
434 |
|
|
|
|
|
435 |
}
|
7 |
*/
|
8 |
|
9 |
// Exit if accessed directly
|
10 |
+
if( !defined('ABSPATH') ) {
|
11 |
exit;
|
12 |
}
|
13 |
|
17 |
* @copyright (c) 2018, Webcraftic
|
18 |
* @version 1.0
|
19 |
*/
|
20 |
+
class WIO_SettingsPage extends Wbcr_FactoryClearfy206_PageBase {
|
21 |
|
22 |
/**
|
23 |
* The id of the page in the admin menu.
|
24 |
*
|
25 |
* Mainly used to navigate between pages.
|
26 |
+
* @see FactoryPages410_AdminPage
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
* @var string
|
33 |
public $page_parent_page = null; // Уникальный идентификатор родительской страницы
|
34 |
|
35 |
/**
|
36 |
+
* @var bool
|
37 |
*/
|
38 |
+
//public $available_for_multisite = true;
|
|
|
|
|
|
|
|
|
|
|
39 |
|
40 |
/**
|
41 |
+
* @var bool
|
|
|
|
|
42 |
*/
|
43 |
+
public $clearfy_collaboration = false;
|
|
|
|
|
|
|
|
|
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
/**
|
46 |
+
* Показывать правый сайдбар?
|
47 |
+
* Сайдбар будет показан на внутренних страницах шаблона.
|
48 |
+
*
|
49 |
+
* @var bool
|
50 |
*/
|
51 |
+
public $show_right_sidebar_in_options = false;
|
52 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
/**
|
54 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
55 |
*/
|
56 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
57 |
+
{
|
58 |
+
// Заголовок страницы
|
59 |
+
$this->menu_title = __('Main Settings', 'robin-image-optimizer');
|
60 |
+
$this->page_menu_short_description = __('Plugin configuration', 'robin-image-optimizer');
|
61 |
+
|
62 |
+
if( is_multisite() && defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
63 |
+
$clearfy_is_active_for_network = is_plugin_active_for_network(Wbcr_FactoryClearfy_Compatibility::getClearfyBasePath());
|
64 |
+
|
65 |
+
if( WIO_Plugin::app()->isNetworkActive() && $clearfy_is_active_for_network ) {
|
66 |
+
$this->clearfy_collaboration = true;
|
67 |
+
}
|
68 |
+
} else if( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
69 |
+
$this->clearfy_collaboration = true;
|
70 |
+
}
|
71 |
+
|
72 |
+
parent::__construct($plugin);
|
73 |
}
|
74 |
+
|
75 |
/**
|
76 |
+
* Подменяем простраинство имен для меню плагина, если активирован плагин Clearfy
|
77 |
+
* Меню текущего плагина будет добавлено в общее меню Clearfy
|
78 |
+
* @return string
|
79 |
*/
|
80 |
+
public function getMenuScope()
|
81 |
+
{
|
82 |
+
if( $this->clearfy_collaboration ) {
|
83 |
+
$this->page_parent_page = 'io_general';
|
84 |
+
|
85 |
+
return 'wbcr_clearfy';
|
|
|
|
|
86 |
}
|
87 |
+
|
88 |
+
return $this->plugin->getPluginName();
|
89 |
}
|
90 |
+
|
91 |
/**
|
92 |
* Подключаем скрипты и стили для страницы
|
93 |
*
|
94 |
+
* @see Wbcr_FactoryPages410_AdminPage
|
95 |
*
|
96 |
* @since 1.0.0
|
97 |
* @return void
|
98 |
*/
|
99 |
+
public function assets($scripts, $styles)
|
100 |
+
{
|
101 |
+
parent::assets($scripts, $styles);
|
102 |
+
$this->scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/restore-backup.js');
|
103 |
|
104 |
// Add Clearfy styles for HMWP pages
|
105 |
if( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
112 |
* Выводим предупреждения
|
113 |
*
|
114 |
*/
|
115 |
+
protected function warningNotice()
|
116 |
+
{
|
117 |
$upload_dir = wp_upload_dir();
|
118 |
+
if( !is_writable($upload_dir['basedir']) ) {
|
119 |
+
$this->printErrorNotice(__('Folder wp-content/uploads/ is unavailable for writing', 'robin-image-optimizer'));
|
120 |
}
|
121 |
$wio_backup = $upload_dir['basedir'] . '/wio_backup/';
|
122 |
+
if( file_exists($wio_backup) and !is_writable($wio_backup) ) {
|
123 |
+
$this->printErrorNotice(__('Folder wp-content/uploads/wio-backup/ is unavailable for writing', 'robin-image-optimizer'));
|
124 |
}
|
125 |
+
if( defined('DISABLE_WP_CRON') and DISABLE_WP_CRON == true ) {
|
126 |
+
$this->printErrorNotice(__('Cron is disabled in wp-config.php', 'robin-image-optimizer'));
|
127 |
}
|
128 |
}
|
129 |
|
135 |
* @since 1.0.0
|
136 |
* @return mixed[]
|
137 |
*/
|
138 |
+
public function getPageOptions()
|
139 |
+
{
|
140 |
$options = array();
|
141 |
|
142 |
$options[] = array(
|
143 |
'type' => 'html',
|
144 |
+
'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __('Main Settings', 'robin-image-optimizer') . '</strong><p>' . __('This section you can set main images optimization settings.', 'robin-image-optimizer') . '</p></div>'
|
145 |
);
|
146 |
|
147 |
$options[] = array(
|
150 |
'title' => __('Optimization server', 'robin-image-optimizer'),
|
151 |
'data' => array(
|
152 |
array(
|
153 |
+
'server_1',
|
154 |
__('Server 1 (recommended) - image size limit up to 5 MB', 'robin-image-optimizer'),
|
155 |
|
156 |
),
|
157 |
array(
|
158 |
+
'server_2',
|
159 |
__('Server 2 - image size limit up to 1 MB', 'robin-image-optimizer')
|
160 |
+
|
161 |
+
),
|
162 |
+
/*array(
|
163 |
+
'server_4',
|
164 |
+
__('Server 4 - image compressor test', 'robin-image-optimizer')
|
165 |
+
),*/
|
166 |
+
array(
|
167 |
+
'server_3',
|
168 |
+
__("Server 3 - you can't use it on a localhost", 'robin-image-optimizer')
|
169 |
)
|
170 |
),
|
171 |
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
172 |
'hint' => __('We use several free servers for image optimization and can’t fully guarantee their stable performance. The server can be not available in some countries due to the political reasons. There is a solution: if one of the servers is not available or can’t optimize the image, you can try to switch to the alternative server. Each server has individual limitations for image weight and optimization level. By default, you have the best server with minimum limitations.', 'robin-image-optimizer'),
|
173 |
+
'default' => 'server_1',
|
174 |
+
);
|
175 |
|
176 |
// Радио переключатель
|
177 |
$options[] = array(
|
178 |
+
'type' => 'dropdown',
|
179 |
+
'name' => 'image_optimization_level',
|
180 |
+
'way' => 'buttons',
|
181 |
+
'title' => __('Compression mode', 'robin-image-optimizer'),
|
182 |
+
'data' => array(
|
183 |
array(
|
184 |
'normal',
|
185 |
+
__('Lossless', 'robin-image-optimizer'),
|
186 |
+
__('This mode provides lossless compression and your images will be optimized without visible changes. If you want an ideal image quality, we recommend this mode. The size of the files will be reduced approximately 2 times. If this is not enough for you, try other modes.', 'robin-image-optimizer')
|
187 |
),
|
188 |
array(
|
189 |
'aggresive',
|
190 |
+
__('Lossy', 'robin-image-optimizer'),
|
191 |
+
__('This mode provides an ideal optimization of your images without significant quality loss. The file size will be reduced approximately 5 times with a slight decrease in image quality. In most cases that cannot be seen with the naked eye.', 'robin-image-optimizer')
|
192 |
),
|
193 |
array(
|
194 |
'ultra',
|
195 |
+
__('High', 'robin-image-optimizer'),
|
196 |
+
__('This mode will use all available optimization methods for maximum image compression. The file size will be reduced approximately 7 times. The quality of some images may deteriorate slightly. Use this mode if you need the maximum weight reduction, and you are ready to accept the loss of image quality.', 'robin-image-optimizer')
|
197 |
)
|
198 |
),
|
199 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
200 |
+
'hint' => __('Select the compression mode appropriate for your case.', 'robin-image-optimizer'),
|
201 |
'default' => 'normal',
|
202 |
/*'events' => array(
|
203 |
'disable_certain_post_types_comments' => array(
|
215 |
|
216 |
// Переключатель
|
217 |
$options[] = array(
|
218 |
+
'type' => 'checkbox',
|
219 |
+
'way' => 'buttons',
|
220 |
+
'name' => 'auto_optimize_when_upload',
|
221 |
+
'title' => __('Auto optimization on upload', 'robin-image-optimizer'),
|
222 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
223 |
+
'hint' => __('Automatically compress all images that you upload directly to the WordPress media library, when editing pages and posts or using themes and plugins.', 'robin-image-optimizer'),
|
224 |
'default' => false
|
225 |
);
|
226 |
|
227 |
// Переключатель
|
228 |
$options[] = array(
|
229 |
+
'type' => 'checkbox',
|
230 |
+
'way' => 'buttons',
|
231 |
+
'name' => 'backup_origin_images',
|
232 |
+
'title' => __('Backup images', 'robin-image-optimizer'),
|
233 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
234 |
+
'hint' => __('Before optimizing, all your images will be saved in a separate folder for future recovery.', 'robin-image-optimizer'),
|
235 |
'default' => true
|
236 |
);
|
237 |
|
238 |
// Переключатель
|
239 |
$options[] = array(
|
240 |
+
'type' => 'checkbox',
|
241 |
+
'way' => 'buttons',
|
242 |
+
'name' => 'error_log',
|
243 |
+
'title' => __('Error Log', 'robin-image-optimizer'),
|
244 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
245 |
+
'hint' => __('Enable error logging. The log will be displayed on a separate tab.', 'robin-image-optimizer'),
|
246 |
'default' => false
|
247 |
);
|
248 |
|
249 |
// восстановление
|
250 |
$options[] = array(
|
251 |
'type' => 'html',
|
252 |
+
'html' => array($this, 'rollbackButton'),
|
253 |
);
|
254 |
|
255 |
// Переключатель
|
256 |
$options[] = array(
|
257 |
+
'type' => 'checkbox',
|
258 |
+
'way' => 'buttons',
|
259 |
+
'name' => 'save_exif_data',
|
260 |
+
'title' => __('Leave EXIF data', 'robin-image-optimizer'),
|
261 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
262 |
+
'hint' => __('EXIF is information stored in photos: camera model, shutter speed, exposure compensation, ISO, GPS, etc. By default, the plugin removes EXIF extended data. If your project is dedicated to photography and you need to display this data, then enable this option.', 'robin-image-optimizer'),
|
263 |
'default' => true
|
264 |
);
|
265 |
|
266 |
$options[] = array(
|
267 |
'type' => 'html',
|
268 |
+
'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __('Optimization', 'robin-image-optimizer') . '</strong><p>' . __('Here you can specify additional image optimization options.', 'robin-image-optimizer') . '</p></div>'
|
269 |
);
|
270 |
|
271 |
// Переключатель
|
272 |
$options[] = array(
|
273 |
+
'type' => 'checkbox',
|
274 |
+
'way' => 'buttons',
|
275 |
+
'name' => 'resize_larger',
|
276 |
+
'title' => __('Resizing large images', 'robin-image-optimizer'),
|
277 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
278 |
+
'hint' => __('When you upload images from a camera or stock, they may be too high resolution and it is not necessary for web. The option allows you to automatically change images resolution on upload.', 'robin-image-optimizer'),
|
279 |
+
'default' => false,
|
280 |
// когда чекбокс включен показываем поле с классом .factory-control-resize_larger_w
|
281 |
'eventsOn' => array(
|
282 |
'show' => '.factory-control-resize_larger_w'
|
283 |
),
|
284 |
// когда чекбокс выключен, скрываем поле с классом .factory-control-resize_larger_w
|
285 |
'eventsOff' => array(
|
286 |
+
'hide' => '.factory-control-resize_larger_w'
|
287 |
)
|
288 |
);
|
289 |
|
290 |
// Текстовое поле
|
291 |
$options[] = array(
|
292 |
+
'type' => 'textbox',
|
293 |
+
'name' => 'resize_larger_w',
|
294 |
+
'title' => __('Enter the maximum size (px)', 'robin-image-optimizer'),
|
295 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
296 |
+
'hint' => __('Set the maximum images resolution on the long side. For horizontal images, this will be the width, and for vertical images - the height. The resolution of the images will be changed proportionally according to the set value.', 'robin-image-optimizer'),
|
297 |
'default' => '1600'
|
298 |
);
|
299 |
|
300 |
// получаем зарегистрированные размеры изображений
|
301 |
$wp_image_sizes = wio_get_image_sizes();
|
302 |
$wio_image_sizes = array();
|
303 |
+
foreach($wp_image_sizes as $key => $value) {
|
304 |
$wio_image_sizes[] = array(
|
305 |
$key,
|
306 |
$key . ' - ' . $value['width'] . 'x' . $value['height'],
|
308 |
}
|
309 |
|
310 |
$options[] = array(
|
311 |
+
'type' => 'list',
|
312 |
+
'way' => 'checklist',
|
313 |
+
'name' => 'allowed_sizes_thumbnail',
|
314 |
+
'title' => __('Optimize thumbnails', 'robin-image-optimizer'),
|
315 |
+
'data' => $wio_image_sizes,
|
316 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
317 |
+
'hint' => __('Choose which sizes of thumbnails should be optimized and uncheck those that do not need optimization.', 'robin-image-optimizer'),
|
318 |
'default' => 'thumbnail,medium'
|
319 |
);
|
320 |
|
321 |
// cron
|
322 |
$options[] = array(
|
323 |
'type' => 'html',
|
324 |
+
'html' => '<div class="wbcr-factory-page-group-header"><strong>' . __('Scheduled optimization', 'robin-image-optimizer') . '</strong><p>' . __('Schedule your images optimization.', 'robin-image-optimizer') . '</p></div>'
|
325 |
);
|
326 |
|
327 |
// автооптимизация
|
328 |
$options[] = array(
|
329 |
+
'type' => 'checkbox',
|
330 |
+
'way' => 'buttons',
|
331 |
+
'name' => 'image_autooptimize_mode',
|
332 |
+
'title' => __('Enable Scheduled Optimization', 'robin-image-optimizer'),
|
333 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
334 |
+
'hint' => __('You can enable image optimization on schedule. The plugin will optimize specified number of images automatically after selected time.', 'robin-image-optimizer'),
|
335 |
+
'default' => false,
|
336 |
+
'eventsOn' => array(
|
337 |
'show' => '#wbcr-io-shedule-options'
|
338 |
),
|
339 |
'eventsOff' => array(
|
342 |
);
|
343 |
|
344 |
$group_items[] = array(
|
345 |
+
'type' => 'dropdown',
|
346 |
+
'way' => 'buttons',
|
347 |
+
'name' => 'image_autooptimize_shedule_time',
|
348 |
+
'data' => array(
|
349 |
+
array('wio_1_min', __('1 min', 'robin-image-optimizer')),
|
350 |
+
array('wio_2_min', __('2 min', 'robin-image-optimizer')),
|
351 |
+
array('wio_5_min', __('5 min', 'robin-image-optimizer')),
|
352 |
+
array('wio_10_min', __('10 min', 'robin-image-optimizer')),
|
353 |
+
array('wio_30_min', __('30 min', 'robin-image-optimizer')),
|
354 |
+
array('wio_hourly', __('Hour', 'robin-image-optimizer')),
|
355 |
+
array('wio_daily', __('Day', 'robin-image-optimizer')),
|
356 |
),
|
357 |
'default' => 'wio_5_min',
|
358 |
+
'title' => __('Run every', 'robin-image-optimizer'),
|
359 |
+
'hint' => __('Select time at which the task will be repeated.', 'robin-image-optimizer')
|
360 |
);
|
361 |
|
|
|
362 |
$group_items[] = array(
|
363 |
+
'type' => 'textbox',
|
364 |
+
'name' => 'image_autooptimize_items_number_per_interation',
|
365 |
+
'title' => __('Images per iteration', 'robin-image-optimizer'),
|
366 |
+
'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
367 |
+
'hint' => __('Specify the number of images that will be optimized during the job. For example, if you enter 5 and select 5 min, the plugin will optimize 5 images every 5 minutes.', 'robin-image-optimizer'),
|
368 |
'default' => '3'
|
369 |
);
|
370 |
|
371 |
$options[] = array(
|
372 |
+
'type' => 'div',
|
373 |
+
'id' => 'wbcr-io-shedule-options',
|
374 |
'items' => $group_items
|
375 |
);
|
376 |
|
377 |
$formOptions = array();
|
378 |
|
379 |
$formOptions[] = array(
|
380 |
+
'type' => 'form-group',
|
381 |
'items' => $options,
|
382 |
//'cssClass' => 'postbox'
|
383 |
);
|
384 |
|
385 |
+
return apply_filters('wbcr_wio_settings_form_options', $formOptions);
|
386 |
}
|
387 |
|
388 |
/**
|
389 |
* Кнопка восстановления изображений
|
390 |
*
|
391 |
*/
|
392 |
+
public function rollbackButton()
|
393 |
+
{
|
394 |
?>
|
395 |
+
<div class="form-group form-group-checkbox factory-control-save_exif_data">
|
396 |
+
<label for="wbcr_io_save_exif_data" class="col-sm-6 control-label">
|
397 |
+
<?php _e('Manage backups', 'robin-image-optimizer'); ?>
|
398 |
+
<span class="factory-hint-icon factory-hint-icon-grey" data-toggle="factory-tooltip" data-placement="right" title="" data-original-title="<?php _e('You can restore the original images from a backup or clear them.', 'robin-image-optimizer'); ?>">
|
399 |
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt="">
|
400 |
</span>
|
401 |
+
</label>
|
402 |
+
<input type="hidden" value="<?php echo wp_create_nonce('wio-iph') ?>" id="wio-iph-nonce">
|
403 |
+
|
404 |
+
<div class="control-group col-sm-6">
|
405 |
+
<div class="factory-buttons-way btn-group">
|
406 |
+
<a class="btn btn-default" id="wio-restore-backup-btn" data-confirm="<?php _e('Are you sure?', 'robin-image-optimizer'); ?>" href="#"><?php _e('Restore', 'robin-image-optimizer'); ?></a>
|
407 |
+
<a class="btn btn-default" id="wio-clear-backup-btn" data-confirm="<?php _e('Are you sure that you want to clear image backups folder?', 'robin-image-optimizer'); ?>" href="#"><?php _e('Clear Backup', 'robin-image-optimizer'); ?></a>
|
408 |
+
</div>
|
409 |
+
<div class="progress" id="wio-restore-backup-progress" style="display:none;">
|
410 |
+
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">
|
|
|
411 |
</div>
|
|
|
|
|
412 |
</div>
|
413 |
+
<p id="wio-restore-backup-msg" style="display:none;"><?php _e('Restore completed.', 'robin-image-optimizer'); ?></p>
|
414 |
+
|
415 |
+
<p id="wio-clear-backup-msg" style="display:none;"><?php _e('The backup folder was cleared.', 'robin-image-optimizer'); ?></p>
|
416 |
</div>
|
417 |
+
</div>
|
|
|
|
|
418 |
|
419 |
+
<?php
|
420 |
+
}
|
421 |
}
|
admin/pages/statistic.php
CHANGED
@@ -7,28 +7,30 @@
|
|
7 |
*/
|
8 |
|
9 |
// Exit if accessed directly
|
10 |
-
if( !
|
11 |
exit;
|
12 |
}
|
13 |
|
14 |
/**
|
|
|
15 |
* Класс отвечает за работу страницы статистики
|
16 |
* @author Eugene Jokerov <jokerov@gmail.com>
|
17 |
* @copyright (c) 2018, Webcraftic
|
18 |
* @version 1.0
|
|
|
19 |
*/
|
20 |
-
class WIO_StatisticPage extends
|
21 |
|
22 |
/**
|
23 |
* The id of the page in the admin menu.
|
24 |
*
|
25 |
* Mainly used to navigate between pages.
|
26 |
-
* @see
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
* @var string
|
30 |
*/
|
31 |
-
public $id = '
|
32 |
public $type = 'page'; // Этот произвольный тип страницы
|
33 |
public $plugin;
|
34 |
|
@@ -38,17 +40,38 @@
|
|
38 |
public $page_menu_position = 20;
|
39 |
public $page_parent_page = null; // Уникальный идентификатор родительской страницы
|
40 |
public $page_menu_dashicon = 'dashicons-chart-line'; // Иконка для закладки страницы, дашикон
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
42 |
/**
|
43 |
-
* @param
|
44 |
*/
|
45 |
-
public function __construct(
|
46 |
-
|
47 |
-
|
|
|
|
|
48 |
// Если плагин загружен, как самостоятельный, то мы меняем настройки страницы и делаем ее внешней,
|
49 |
// а не внутренней страницей родительского плагина. Внешнии страницы добавляются в Wordpress меню "Общие"
|
50 |
|
51 |
-
if( !
|
52 |
// true - внутреняя, false- внешняя страница
|
53 |
$this->internal = false;
|
54 |
// меню к которому, нужно прикрепить ссылку на страницу
|
@@ -57,11 +80,20 @@
|
|
57 |
$this->add_link_to_plugin_actions = true;
|
58 |
}
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
$this->plugin = $plugin;
|
61 |
$this->hooks();
|
62 |
|
63 |
-
parent::__construct(
|
64 |
-
|
65 |
}
|
66 |
|
67 |
/**
|
@@ -69,181 +101,242 @@
|
|
69 |
* Меню текущего плагина будет добавлено в общее меню Clearfy
|
70 |
* @return string
|
71 |
*/
|
72 |
-
public function getMenuScope()
|
73 |
-
|
|
|
74 |
$this->internal = true;
|
|
|
75 |
return 'wbcr_clearfy';
|
76 |
}
|
77 |
|
78 |
return $this->plugin->getPluginName();
|
79 |
}
|
80 |
|
81 |
-
|
82 |
-
|
83 |
-
return
|
84 |
-
? __( 'Image optimizer', 'robin-image-optimizer' )
|
85 |
-
: __( 'General', 'robin-image-optimizer' );
|
86 |
}
|
87 |
|
88 |
/**
|
89 |
-
*
|
|
|
90 |
*/
|
91 |
-
public function
|
92 |
-
|
93 |
-
|
94 |
-
add_action( 'wbcr_clearfy_page_enqueue_scripts', array($this, 'registerWidgetScripts'), 10, 3 );
|
95 |
}
|
96 |
-
|
97 |
-
|
98 |
/**
|
99 |
-
*
|
100 |
*/
|
101 |
-
public function
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
if ( $cron_mode ) {
|
106 |
-
$cron_running = WIO_Plugin::app()->getOption( 'cron_running', false );
|
107 |
-
if ( $cron_running ) {
|
108 |
-
WIO_Plugin::app()->updateOption( 'cron_running', false );
|
109 |
-
} else {
|
110 |
-
WIO_Plugin::app()->updateOption( 'cron_running', true );
|
111 |
-
}
|
112 |
-
wp_send_json( true );
|
113 |
-
die();
|
114 |
-
}
|
115 |
-
$max_process_per_request = 5;
|
116 |
-
$optimized_data = $media_library->processUnoptimizedAttachments( $max_process_per_request );
|
117 |
-
|
118 |
-
// если изображения закончились - посылаем команду завершения
|
119 |
-
if ( $optimized_data['remain'] <= 0 ) {
|
120 |
-
$optimized_data['end'] = true;
|
121 |
}
|
122 |
-
|
|
|
123 |
}
|
124 |
|
125 |
/**
|
126 |
* Подключаем скрипты и стили для страницы
|
127 |
*
|
128 |
-
* @see
|
129 |
*
|
130 |
* @since 1.0.0
|
131 |
* @return void
|
132 |
*/
|
133 |
-
public function assets($scripts, $styles)
|
|
|
134 |
parent::assets($scripts, $styles);
|
135 |
|
136 |
-
$this->styles->add(
|
|
|
|
|
|
|
|
|
137 |
|
138 |
-
$this->scripts->add(
|
139 |
-
$this->scripts->add( WIO_PLUGIN_URL . '/admin/assets/js/statistic.js' );
|
140 |
-
$this->scripts->add( WIO_PLUGIN_URL . '/admin/assets/js/bulk-optimozation.js' );
|
141 |
|
142 |
// Add Clearfy styles for HMWP pages
|
143 |
if( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
144 |
$this->styles->add(WCL_PLUGIN_URL . '/admin/assets/css/general.css');
|
145 |
}
|
146 |
}
|
147 |
-
|
148 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
|
150 |
/**
|
151 |
* Prints the content of the page
|
152 |
*
|
153 |
-
* @see libs\factory\pages\themplates\
|
154 |
*/
|
155 |
-
public function showPageContent()
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
$image_statistics = $statistics->get();
|
160 |
-
$backup_origin_images = WIO_Plugin::app()->getOption( 'backup_origin_images', false );
|
161 |
-
$logger = WIO_Plugin::app()->getLogger();
|
162 |
-
//$logger->add( 'Тестовая ошибка' );
|
163 |
?>
|
164 |
<div class="wbcr-factory-page-group-header" style="margin-top:0;">
|
165 |
-
<strong><?php _e(
|
166 |
|
167 |
<p>
|
168 |
-
<?php _e(
|
169 |
</p>
|
170 |
</div>
|
171 |
|
172 |
<div class="wbcr-factory-page-group-body" style="padding:20px">
|
173 |
-
<div class="wio-warning-message">
|
174 |
-
<?php
|
175 |
-
if($this->plugin->getOption('image_optimization_server', 'resmush') == 'resmush'){
|
176 |
-
echo __('There are limitations for the specified server (server 1) – you can’t optimize images with the size greater than <span style="color:red">5MB</span>. But you can enable the “Resizing large images” feature to reduce the image weight due to the proportional resizing before sending the file to the optimization server. ', 'robin-image-optimizer');
|
177 |
-
} else {
|
178 |
-
echo __('There are limitations for the specified server (server 2) – you can’t optimize images with the size greater than <span style="color:red">1MB</span>. But you can enable the “Resizing large images” feature to reduce the image weight due to the proportional resizing before sending the file to the optimization server. Note: this server supports only one compression mode – “Normal”.', 'robin-image-optimizer');
|
179 |
-
}
|
180 |
-
?>
|
181 |
-
</div>
|
182 |
<div class="wio-columns wio-page-statistic">
|
183 |
-
|
184 |
<div>
|
185 |
<div class="wio-chart-container wio-overview-chart-container">
|
186 |
-
<canvas id="wio-main-chart" width="180" height="180" data-unoptimized="<?php echo esc_attr(
|
187 |
-
<div id="wio-overview-chart-percent" class="wio-chart-percent"><?php echo esc_attr(
|
|
|
188 |
<p class="wio-global-optim-phrase wio-clear">
|
189 |
-
<?php _e(
|
|
|
|
|
190 |
</p>
|
191 |
</div>
|
192 |
-
|
193 |
<div style="margin-left:200px;">
|
194 |
<div id="wio-overview-chart-legend">
|
195 |
<ul class="wio-doughnut-legend">
|
196 |
-
<li
|
197 |
-
|
198 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
199 |
</ul>
|
200 |
</div>
|
201 |
-
<h3 class="screen-reader-text"><?php _e(
|
202 |
-
|
203 |
<!--<div class="wio-number-you-optimized">
|
204 |
<p>
|
205 |
-
<span id="wio-total-optimized-attachments" class="wio-number"><?php echo esc_attr(
|
206 |
<span class="wio-text">
|
207 |
-
<?php _e(
|
208 |
</span>
|
209 |
</p>
|
210 |
</div>-->
|
211 |
-
|
212 |
<div class="wio-bars" style="width: 90%">
|
213 |
-
<p><?php _e(
|
|
|
214 |
<div class="wio-bar-negative base-transparent wio-right-outside-number">
|
215 |
-
<div id="wio-original-bar" class="wio-progress" style="width: 100%"
|
|
|
|
|
216 |
</div>
|
|
|
217 |
|
218 |
-
<p><?php _e( 'Optimized size', 'robin-image-optimizer' ); ?></p>
|
219 |
<div class="wio-bar-primary base-transparent wio-right-outside-number">
|
220 |
-
<div id="wio-optimized-bar" class="wio-progress" style="width: <?php echo (
|
|
|
|
|
221 |
</div>
|
222 |
-
|
223 |
</div>
|
224 |
-
|
225 |
<div class="wio-number-you-optimized">
|
226 |
<p>
|
227 |
-
<span id="wio-total-optimized-attachments-pct" class="wio-number"><?php echo esc_attr(
|
|
|
228 |
<span class="wio-text">
|
229 |
-
<?php _e(
|
230 |
</span>
|
231 |
</p>
|
232 |
</div>
|
233 |
</div>
|
234 |
</div>
|
235 |
-
|
236 |
<div>
|
237 |
-
<input type="hidden" value="<?php echo wp_create_nonce(
|
238 |
|
239 |
<p>
|
240 |
<?php $this->button(); ?>
|
241 |
-
<span id="wio-start-msg-complete"><?php _e(
|
|
|
|
|
|
|
|
|
242 |
</p>
|
243 |
-
<p id="wio-start-msg-top"><?php _e( 'Optimization in progress. Remained', 'robin-image-optimizer' ); ?> <span id="wio-total-unoptimized"><?php echo esc_attr( $image_statistics['unoptimized'] ); ?></span> <?php _e( 'images.', 'robin-image-optimizer' ); ?></p>
|
244 |
</div>
|
245 |
</div>
|
246 |
</div>
|
|
|
247 |
<?php
|
248 |
}
|
249 |
|
@@ -251,38 +344,40 @@
|
|
251 |
* Кнопка запуска оптимизации
|
252 |
*
|
253 |
*/
|
254 |
-
public function button()
|
255 |
-
|
256 |
-
$
|
|
|
257 |
$button_classes = array(
|
258 |
'wio-optimize-button'
|
259 |
);
|
260 |
-
if(
|
261 |
$button_classes[] = 'wio-nobackup';
|
262 |
}
|
263 |
-
$button_name = __(
|
264 |
if( $is_cron_mode ) {
|
265 |
$button_classes[] = 'wio-cron-mode';
|
266 |
-
$cron_running = WIO_Plugin::app()->getOption(
|
267 |
-
if
|
268 |
$button_classes[] = 'wio-running';
|
269 |
-
$button_name = __(
|
270 |
} else {
|
271 |
-
$button_name = __(
|
272 |
}
|
273 |
}
|
274 |
?>
|
275 |
-
<button type="button" id="wio-start-optimization" data-confirm="<?php _e(
|
276 |
-
|
277 |
}
|
278 |
|
279 |
/**
|
280 |
* @param string $page_id
|
281 |
-
* @param
|
282 |
-
* @param
|
283 |
*/
|
284 |
-
public function registerWidgetScripts($page_id, $scripts, $styles)
|
285 |
-
|
|
|
286 |
// Add scripts
|
287 |
$scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/Chart.min.js');
|
288 |
$scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/bulk-optimozation.js');
|
@@ -297,70 +392,88 @@
|
|
297 |
* Виджет для clearfy
|
298 |
*
|
299 |
*/
|
300 |
-
public function widget()
|
|
|
301 |
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
?>
|
307 |
|
308 |
<div class="col-sm-12">
|
309 |
<div class="wio-image-optimize-board wbcr-clearfy-board">
|
310 |
-
<h4 class="wio-text-left"><?php _e(
|
311 |
-
<div class="wio-columns wio-widget">
|
312 |
-
|
313 |
|
|
|
314 |
<div class="wio-col col-chart">
|
315 |
<div class="wio-chart-container wio-overview-chart-container">
|
316 |
-
<canvas id="wio-main-chart" width="130" height="130" data-unoptimized="<?php echo esc_attr(
|
317 |
-
<div id="wio-overview-chart-percent" class="wio-chart-percent"><?php echo esc_attr(
|
|
|
318 |
</div>
|
319 |
<div id="wio-overview-chart-legend">
|
320 |
<ul class="wio-doughnut-legend">
|
321 |
-
<li
|
322 |
-
|
323 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
324 |
</ul>
|
325 |
</div>
|
326 |
<div class="wio-bars">
|
327 |
-
<p><?php _e(
|
|
|
328 |
<div class="wio-bar-negative base-transparent wio-right-outside-number">
|
329 |
-
<div id="wio-original-bar" class="wio-progress" style="width: 100%"
|
|
|
|
|
330 |
</div>
|
|
|
331 |
|
332 |
-
<p><?php _e( 'Optimized size', 'robin-image-optimizer' ); ?></p>
|
333 |
<div class="wio-bar-primary base-transparent wio-right-outside-number">
|
334 |
-
<div id="wio-optimized-bar" class="wio-progress" style="width: <?php echo (
|
|
|
|
|
335 |
</div>
|
336 |
-
|
337 |
</div>
|
338 |
</div>
|
339 |
<ul class="wio-widget-bottom">
|
340 |
<li>
|
341 |
-
<input type="hidden" value="<?php echo wp_create_nonce(
|
342 |
|
343 |
<p>
|
344 |
<?php $this->button(); ?>
|
345 |
-
<span id="wio-start-msg-complete"><?php _e(
|
|
|
|
|
|
|
|
|
346 |
</p>
|
347 |
-
<p id="wio-start-msg-top"><?php _e( 'Optimization in progress. Remained', 'robin-image-optimizer' ); ?> <span id="wio-total-unoptimized"><?php echo esc_attr( $image_statistics['unoptimized'] ); ?></span></p>
|
348 |
</li>
|
349 |
<li>
|
350 |
-
|
351 |
<div class="factory-dropdown factory-from-control-dropdown factory-buttons-way" data-way="buttons">
|
352 |
<div id="wio-level-buttons" class="btn-group factory-buttons-group">
|
353 |
-
<button type="button" data-level="normal" class="btn btn-default btn-small <?php if( $default_level == 'normal' ) : ?>active<?php endif; ?>"><?php _e(
|
354 |
-
<button type="button" data-level="aggresive" class="btn btn-default btn-small <?php if( $default_level == 'aggresive' ) : ?>active<?php endif; ?>"><?php _e(
|
355 |
-
<button type="button" data-level="ultra" class="btn btn-default btn-small <?php if( $default_level == 'ultra' ) : ?>active<?php endif; ?>"><?php _e(
|
356 |
</div>
|
357 |
</div>
|
358 |
</li>
|
359 |
</ul>
|
360 |
</div>
|
361 |
</div>
|
362 |
-
|
363 |
-
|
364 |
}
|
365 |
-
|
366 |
}
|
7 |
*/
|
8 |
|
9 |
// Exit if accessed directly
|
10 |
+
if( !defined('ABSPATH') ) {
|
11 |
exit;
|
12 |
}
|
13 |
|
14 |
/**
|
15 |
+
* Class WIO_StatisticPage
|
16 |
* Класс отвечает за работу страницы статистики
|
17 |
* @author Eugene Jokerov <jokerov@gmail.com>
|
18 |
* @copyright (c) 2018, Webcraftic
|
19 |
* @version 1.0
|
20 |
+
* @method string getDonateWidget() - get widget content donate
|
21 |
*/
|
22 |
+
class WIO_StatisticPage extends Wbcr_FactoryClearfy206_PageBase {
|
23 |
|
24 |
/**
|
25 |
* The id of the page in the admin menu.
|
26 |
*
|
27 |
* Mainly used to navigate between pages.
|
28 |
+
* @see FactoryPages410_AdminPage
|
29 |
*
|
30 |
* @since 1.0.0
|
31 |
* @var string
|
32 |
*/
|
33 |
+
public $id = 'io_general'; // Уникальный идентификатор страницы
|
34 |
public $type = 'page'; // Этот произвольный тип страницы
|
35 |
public $plugin;
|
36 |
|
40 |
public $page_menu_position = 20;
|
41 |
public $page_parent_page = null; // Уникальный идентификатор родительской страницы
|
42 |
public $page_menu_dashicon = 'dashicons-chart-line'; // Иконка для закладки страницы, дашикон
|
43 |
+
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @var bool
|
47 |
+
*/
|
48 |
+
//public $available_for_multisite = true;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @var bool
|
52 |
+
*/
|
53 |
+
public $clearfy_collaboration = false;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Показывать правый сайдбар?
|
57 |
+
* Сайдбар будет показан на внутренних страницах шаблона.
|
58 |
+
*
|
59 |
+
* @var bool
|
60 |
+
*/
|
61 |
+
public $show_right_sidebar_in_options = false;
|
62 |
|
63 |
/**
|
64 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
65 |
*/
|
66 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
67 |
+
{
|
68 |
+
$this->menu_title = __('Robin image optimizer', 'robin-image-optimizer');
|
69 |
+
$this->page_menu_short_description = __('Compress bulk of images', 'robin-image-optimizer');
|
70 |
+
|
71 |
// Если плагин загружен, как самостоятельный, то мы меняем настройки страницы и делаем ее внешней,
|
72 |
// а не внутренней страницей родительского плагина. Внешнии страницы добавляются в Wordpress меню "Общие"
|
73 |
|
74 |
+
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ) {
|
75 |
// true - внутреняя, false- внешняя страница
|
76 |
$this->internal = false;
|
77 |
// меню к которому, нужно прикрепить ссылку на страницу
|
80 |
$this->add_link_to_plugin_actions = true;
|
81 |
}
|
82 |
|
83 |
+
if( is_multisite() && defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
84 |
+
$clearfy_is_active_for_network = is_plugin_active_for_network(Wbcr_FactoryClearfy_Compatibility::getClearfyBasePath());
|
85 |
+
|
86 |
+
if( WIO_Plugin::app()->isNetworkActive() && $clearfy_is_active_for_network ) {
|
87 |
+
$this->clearfy_collaboration = true;
|
88 |
+
}
|
89 |
+
} else if( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
90 |
+
$this->clearfy_collaboration = true;
|
91 |
+
}
|
92 |
+
|
93 |
$this->plugin = $plugin;
|
94 |
$this->hooks();
|
95 |
|
96 |
+
parent::__construct($plugin);
|
|
|
97 |
}
|
98 |
|
99 |
/**
|
101 |
* Меню текущего плагина будет добавлено в общее меню Clearfy
|
102 |
* @return string
|
103 |
*/
|
104 |
+
public function getMenuScope()
|
105 |
+
{
|
106 |
+
if( $this->clearfy_collaboration ) {
|
107 |
$this->internal = true;
|
108 |
+
|
109 |
return 'wbcr_clearfy';
|
110 |
}
|
111 |
|
112 |
return $this->plugin->getPluginName();
|
113 |
}
|
114 |
|
115 |
+
public function getPageTitle()
|
116 |
+
{
|
117 |
+
return $this->clearfy_collaboration ? __('Image optimizer', 'robin-image-optimizer') : __('General', 'robin-image-optimizer');
|
|
|
|
|
118 |
}
|
119 |
|
120 |
/**
|
121 |
+
* Метод позволяет менять заголовок меню, в зависимости от сборки плагина.
|
122 |
+
* @return string|void
|
123 |
*/
|
124 |
+
public function getMenuTitle()
|
125 |
+
{
|
126 |
+
return $this->clearfy_collaboration ? __('Image optimizer', 'robin-image-optimizer') : __('Robin image optimizer', 'robin-image-optimizer');
|
|
|
127 |
}
|
128 |
+
|
|
|
129 |
/**
|
130 |
+
* Устанавливаем хуки
|
131 |
*/
|
132 |
+
public function hooks()
|
133 |
+
{
|
134 |
+
if( defined('WBCR_CLEARFY_PLUGIN_VERSION') && version_compare(WBCR_CLEARFY_PLUGIN_VERSION, '1.4.2', '>=') ) {
|
135 |
+
add_action('wbcr_clearfy_quick_boards', array($this, 'widget'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
}
|
137 |
+
|
138 |
+
add_action('wbcr/clearfy/page_assets', array($this, 'registerWidgetScripts'), 10, 3);
|
139 |
}
|
140 |
|
141 |
/**
|
142 |
* Подключаем скрипты и стили для страницы
|
143 |
*
|
144 |
+
* @see Wbcr_FactoryPages410_AdminPage
|
145 |
*
|
146 |
* @since 1.0.0
|
147 |
* @return void
|
148 |
*/
|
149 |
+
public function assets($scripts, $styles)
|
150 |
+
{
|
151 |
parent::assets($scripts, $styles);
|
152 |
|
153 |
+
$this->styles->add(WIO_PLUGIN_URL . '/admin/assets/css/base-statistic.css');
|
154 |
+
|
155 |
+
$this->scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/Chart.min.js');
|
156 |
+
$this->scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/statistic.js');
|
157 |
+
$this->scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/bulk-optimozation.js');
|
158 |
|
159 |
+
$this->scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/check-servers-status.js');
|
|
|
|
|
160 |
|
161 |
// Add Clearfy styles for HMWP pages
|
162 |
if( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
|
163 |
$this->styles->add(WCL_PLUGIN_URL . '/admin/assets/css/general.css');
|
164 |
}
|
165 |
}
|
|
|
166 |
|
167 |
+
public function printServersTable()
|
168 |
+
{
|
169 |
+
$selected_server = $this->plugin->getOption('image_optimization_server', 'server_1');
|
170 |
+
|
171 |
+
$servers = array(
|
172 |
+
'server_1' => 'Server 1',
|
173 |
+
'server_2' => 'Server 2',
|
174 |
+
'server_3' => 'Server 3',
|
175 |
+
//'server_4' => 'Server 4'
|
176 |
+
);
|
177 |
+
?>
|
178 |
+
|
179 |
+
<div class="wbcr-rio-servers">
|
180 |
+
<div class="wbcr-factory-page-group-header" style="margin-bottom:0;">
|
181 |
+
<strong><?php _e('Servers', 'image-optimizer'); ?></strong>
|
182 |
+
|
183 |
+
<p><?php _e('Please, find the list of available servers for image optimization below. If the server has a state “<b style="color:red">Down</b>”, it means that the server is not available, and you should choose another one. “<b style="color:green">Stable</b>” means that the server is available and you can use it.', 'image-optimizer') ?></p>
|
184 |
+
</div>
|
185 |
+
<div class="wbcr-factory-page-group-body">
|
186 |
+
<table class="wbcr-rio-servers-list">
|
187 |
+
<tr>
|
188 |
+
<th><?php _e('Server', 'image-optimizer'); ?></th>
|
189 |
+
<th><?php _e('Status', 'image-optimizer'); ?></th>
|
190 |
+
<th><?php _e('Limits', 'image-optimizer'); ?></th>
|
191 |
+
<th><?php _e('Actions', 'image-optimizer'); ?></th>
|
192 |
+
</tr>
|
193 |
+
<?php foreach($servers as $server_name => $server_title): ?>
|
194 |
+
<?php
|
195 |
+
$server_list_item_classes = $server_name == $selected_server ? ' wbcr-rio-servers-list-item-selected' : '';
|
196 |
+
$server_button_classes = $server_name == $selected_server ? ' wbcr-rio-selected' : '';
|
197 |
+
?>
|
198 |
+
<tr class="wbcr-rio-servers-list-item wbcr-rio-<?= $server_name ?><?= $server_list_item_classes ?>">
|
199 |
+
<td><?= $server_title ?></td>
|
200 |
+
<td class="wbcr-rio-server-status wbcr-rio-server-success"><?php _e('Stable', 'image-optimizer'); ?></td>
|
201 |
+
<td>
|
202 |
+
<?php if( $server_name == 'server_1' ): ?>
|
203 |
+
<?php _e('IMG > 5MB', 'image-optimizer'); ?>
|
204 |
+
<?php elseif( $server_name == 'server_2' ): ?>
|
205 |
+
<?php _e('IMG > 1MB', 'image-optimizer'); ?>
|
206 |
+
<?php else: ?>
|
207 |
+
<?php _e('No limits', 'image-optimizer'); ?>
|
208 |
+
<?php endif; ?>
|
209 |
+
</td>
|
210 |
+
<td>
|
211 |
+
<button class="wbcr-rio-select-server-button<?= $server_button_classes ?>" data-nonce="<?= wp_create_nonce('wbcr_rio_select_' . $server_name) ?>" data-server="<?= $server_name ?>">
|
212 |
+
<?php _e('Select', 'image-optimizer'); ?>
|
213 |
+
</button>
|
214 |
+
</td>
|
215 |
+
</tr>
|
216 |
+
<?php endforeach; ?>
|
217 |
+
</table>
|
218 |
+
<div class="wbcr-rio-warning-message">
|
219 |
+
<?php
|
220 |
+
$server = $this->plugin->getOption('image_optimization_server', 'server_1');
|
221 |
+
|
222 |
+
if( $server == 'server_1' ) {
|
223 |
+
echo __('There are limitations for the specified server (server 1) – you can’t optimize images with the size greater than <span style="color:red">5MB</span>. But you can enable the “Resizing large images” feature to reduce the image weight due to the proportional resizing before sending the file to the optimization server. ', 'robin-image-optimizer');
|
224 |
+
} else if( $server == 'server_2' ) {
|
225 |
+
echo __('There are limitations for the specified server (server 2) – you can’t optimize images with the size greater than <span style="color:red">1MB</span>. But you can enable the “Resizing large images” feature to reduce the image weight due to the proportional resizing before sending the file to the optimization server. Note: this server supports only one compression mode – “Normal”.', 'robin-image-optimizer');
|
226 |
+
} else if( $server == 'server_3' ) {
|
227 |
+
echo __("There are limitations for the specified server (server 3) – you can't use it on a localhost.", 'robin-image-optimizer');
|
228 |
+
} else {
|
229 |
+
echo __("This server has no limitations.", 'robin-image-optimizer');
|
230 |
+
}
|
231 |
+
?>
|
232 |
+
</div>
|
233 |
+
</div>
|
234 |
+
</div>
|
235 |
+
<?php
|
236 |
+
}
|
237 |
|
238 |
/**
|
239 |
* Prints the content of the page
|
240 |
*
|
241 |
+
* @see libs\factory\pages\themplates\FactoryPages410_ImpressiveThemplate
|
242 |
*/
|
243 |
+
public function showPageContent()
|
244 |
+
{
|
245 |
+
$statistics = new WIO_Image_Statistic();
|
246 |
+
$image_statistics = $statistics->get();
|
|
|
|
|
|
|
|
|
247 |
?>
|
248 |
<div class="wbcr-factory-page-group-header" style="margin-top:0;">
|
249 |
+
<strong><?php _e('Image optimization dashboard', 'robin-image-optimizer') ?></strong>
|
250 |
|
251 |
<p>
|
252 |
+
<?php _e('Monitor image optimization statistics and run on demand or scheduled optimization.', 'robin-image-optimizer') ?>
|
253 |
</p>
|
254 |
</div>
|
255 |
|
256 |
<div class="wbcr-factory-page-group-body" style="padding:20px">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
257 |
<div class="wio-columns wio-page-statistic">
|
|
|
258 |
<div>
|
259 |
<div class="wio-chart-container wio-overview-chart-container">
|
260 |
+
<canvas id="wio-main-chart" width="180" height="180" data-unoptimized="<?php echo esc_attr($image_statistics['unoptimized']); ?>" data-optimized="<?php echo esc_attr($image_statistics['optimized']); ?>" data-errors="<?php echo esc_attr($image_statistics['error']); ?>" style="display: block;"></canvas>
|
261 |
+
<div id="wio-overview-chart-percent" class="wio-chart-percent"><?php echo esc_attr($image_statistics['optimized_percent']); ?>
|
262 |
+
<span>%</span></div>
|
263 |
<p class="wio-global-optim-phrase wio-clear">
|
264 |
+
<?php _e('You optimized', 'robin-image-optimizer'); ?>
|
265 |
+
<span class="wio-total-percent"><?php echo esc_attr($image_statistics['optimized_percent']); ?>
|
266 |
+
%</span> <?php _e("of your website's images", 'robin-image-optimizer'); ?>
|
267 |
</p>
|
268 |
</div>
|
|
|
269 |
<div style="margin-left:200px;">
|
270 |
<div id="wio-overview-chart-legend">
|
271 |
<ul class="wio-doughnut-legend">
|
272 |
+
<li>
|
273 |
+
<span style="background-color:#d6d6d6"></span><?php _e('Unoptimized', 'robin-image-optimizer'); ?>
|
274 |
+
-
|
275 |
+
<span class="wio-num" id="wio-unoptimized-num"><?php echo esc_attr($image_statistics['unoptimized']); ?></span>
|
276 |
+
</li>
|
277 |
+
<li>
|
278 |
+
<span style="background-color:#8bc34a"></span><?php _e('Optimized', 'robin-image-optimizer'); ?>
|
279 |
+
-
|
280 |
+
<span class="wio-num" id="wio-optimized-num"><?php echo esc_attr($image_statistics['optimized']); ?></span>
|
281 |
+
</li>
|
282 |
+
<li>
|
283 |
+
<span style="background-color:#f1b1b6"></span><?php _e('Error', 'robin-image-optimizer'); ?>
|
284 |
+
-
|
285 |
+
<span class="wio-num" id="wio-error-num"><?php echo esc_attr($image_statistics['error']); ?></span>
|
286 |
+
</li>
|
287 |
</ul>
|
288 |
</div>
|
289 |
+
<h3 class="screen-reader-text"><?php _e('Statistics', 'robin-image-optimizer'); ?></h3>
|
|
|
290 |
<!--<div class="wio-number-you-optimized">
|
291 |
<p>
|
292 |
+
<span id="wio-total-optimized-attachments" class="wio-number"><?php echo esc_attr($image_statistics['optimized']); ?></span>
|
293 |
<span class="wio-text">
|
294 |
+
<?php _e("that's the number of original images<br> you optimized with Image Optimizer", 'robin-image-optimizer'); ?>
|
295 |
</span>
|
296 |
</p>
|
297 |
</div>-->
|
|
|
298 |
<div class="wio-bars" style="width: 90%">
|
299 |
+
<p><?php _e('Original size', 'robin-image-optimizer'); ?></p>
|
300 |
+
|
301 |
<div class="wio-bar-negative base-transparent wio-right-outside-number">
|
302 |
+
<div id="wio-original-bar" class="wio-progress" style="width: 100%">
|
303 |
+
<span class="wio-barnb" id="wio-original-size"><?php echo esc_attr($statistics->convertToReadableSize($image_statistics['original_size'])); ?></span>
|
304 |
+
</div>
|
305 |
</div>
|
306 |
+
<p><?php _e('Optimized size', 'robin-image-optimizer'); ?></p>
|
307 |
|
|
|
308 |
<div class="wio-bar-primary base-transparent wio-right-outside-number">
|
309 |
+
<div id="wio-optimized-bar" class="wio-progress" style="width: <?php echo ($image_statistics['percent_line']) ? esc_attr($image_statistics['percent_line']) : 100; ?>%">
|
310 |
+
<span class="wio-barnb" id="wio-optimized-size"><?php echo esc_attr($statistics->convertToReadableSize($image_statistics['optimized_size'])); ?></span>
|
311 |
+
</div>
|
312 |
</div>
|
|
|
313 |
</div>
|
|
|
314 |
<div class="wio-number-you-optimized">
|
315 |
<p>
|
316 |
+
<span id="wio-total-optimized-attachments-pct" class="wio-number"><?php echo esc_attr($image_statistics['save_size_percent']); ?>
|
317 |
+
%</span>
|
318 |
<span class="wio-text">
|
319 |
+
<?php _e("that's the size you saved <br>by using Image Optimizer", 'robin-image-optimizer'); ?>
|
320 |
</span>
|
321 |
</p>
|
322 |
</div>
|
323 |
</div>
|
324 |
</div>
|
|
|
325 |
<div>
|
326 |
+
<input type="hidden" value="<?php echo wp_create_nonce('wio-iph') ?>" id="wio-iph-nonce">
|
327 |
|
328 |
<p>
|
329 |
<?php $this->button(); ?>
|
330 |
+
<span id="wio-start-msg-complete"><?php _e('All images from the media library are optimized.', 'robin-image-optimizer'); ?></span>
|
331 |
+
</p>
|
332 |
+
|
333 |
+
<p id="wio-start-msg-top"><?php _e('Optimization in progress. Remained', 'robin-image-optimizer'); ?>
|
334 |
+
<span id="wio-total-unoptimized"><?php echo esc_attr($image_statistics['unoptimized']); ?></span> <?php _e('images.', 'robin-image-optimizer'); ?>
|
335 |
</p>
|
|
|
336 |
</div>
|
337 |
</div>
|
338 |
</div>
|
339 |
+
<?php $this->printServersTable(); ?>
|
340 |
<?php
|
341 |
}
|
342 |
|
344 |
* Кнопка запуска оптимизации
|
345 |
*
|
346 |
*/
|
347 |
+
public function button()
|
348 |
+
{
|
349 |
+
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
350 |
+
$is_cron_mode = WIO_Plugin::app()->getOption('image_autooptimize_mode', false);
|
351 |
$button_classes = array(
|
352 |
'wio-optimize-button'
|
353 |
);
|
354 |
+
if( !$backup_origin_images ) {
|
355 |
$button_classes[] = 'wio-nobackup';
|
356 |
}
|
357 |
+
$button_name = __('Run', 'robin-image-optimizer');
|
358 |
if( $is_cron_mode ) {
|
359 |
$button_classes[] = 'wio-cron-mode';
|
360 |
+
$cron_running = WIO_Plugin::app()->getOption('cron_running', false);
|
361 |
+
if( $cron_running ) {
|
362 |
$button_classes[] = 'wio-running';
|
363 |
+
$button_name = __('Stop', 'robin-image-optimizer');
|
364 |
} else {
|
365 |
+
$button_name = __('Run', 'robin-image-optimizer');
|
366 |
}
|
367 |
}
|
368 |
?>
|
369 |
+
<button type="button" id="wio-start-optimization" data-confirm="<?php _e('Do you want to start optimization without backup?', 'robin-image-optimizer'); ?>" data-start="<?php _e('Resume', 'robin-image-optimizer'); ?>" data-stop="<?php _e('Stop', 'robin-image-optimizer'); ?>" class="<?php echo join(' ', $button_classes); ?>"><?php echo esc_attr($button_name); ?></button>
|
370 |
+
<?php
|
371 |
}
|
372 |
|
373 |
/**
|
374 |
* @param string $page_id
|
375 |
+
* @param Wbcr_Factory409_ScriptList $scripts
|
376 |
+
* @param Wbcr_Factory409_StyleList $styles
|
377 |
*/
|
378 |
+
public function registerWidgetScripts($page_id, $scripts, $styles)
|
379 |
+
{
|
380 |
+
if( $page_id == 'quick_start-wbcr_clearfy' ) {
|
381 |
// Add scripts
|
382 |
$scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/Chart.min.js');
|
383 |
$scripts->add(WIO_PLUGIN_URL . '/admin/assets/js/bulk-optimozation.js');
|
392 |
* Виджет для clearfy
|
393 |
*
|
394 |
*/
|
395 |
+
public function widget()
|
396 |
+
{
|
397 |
|
398 |
+
$statistics = new WIO_Image_Statistic();
|
399 |
+
$image_statistics = $statistics->get();
|
400 |
+
|
401 |
+
$default_level = WIO_Plugin::app()->getOption('image_optimization_level', 'normal');
|
402 |
?>
|
403 |
|
404 |
<div class="col-sm-12">
|
405 |
<div class="wio-image-optimize-board wbcr-clearfy-board">
|
406 |
+
<h4 class="wio-text-left"><?php _e('Images optimization', 'robin-image-optimizer'); ?></h4>
|
|
|
|
|
407 |
|
408 |
+
<div class="wio-columns wio-widget">
|
409 |
<div class="wio-col col-chart">
|
410 |
<div class="wio-chart-container wio-overview-chart-container">
|
411 |
+
<canvas id="wio-main-chart" width="130" height="130" data-unoptimized="<?php echo esc_attr($image_statistics['unoptimized']); ?>" data-optimized="<?php echo esc_attr($image_statistics['optimized']); ?>" data-errors="<?php echo esc_attr($image_statistics['error']); ?>" style="display: block;"></canvas>
|
412 |
+
<div id="wio-overview-chart-percent" class="wio-chart-percent"><?php echo esc_attr($image_statistics['optimized_percent']); ?>
|
413 |
+
<span>%</span></div>
|
414 |
</div>
|
415 |
<div id="wio-overview-chart-legend">
|
416 |
<ul class="wio-doughnut-legend">
|
417 |
+
<li>
|
418 |
+
<span style="background-color:#d6d6d6"></span><?php _e('Unoptimized', 'robin-image-optimizer'); ?>
|
419 |
+
-
|
420 |
+
<span class="wio-num" id="wio-unoptimized-num"><?php echo esc_attr($image_statistics['unoptimized']); ?></span>
|
421 |
+
</li>
|
422 |
+
<li>
|
423 |
+
<span style="background-color:#8bc34a"></span><?php _e('Optimized', 'robin-image-optimizer'); ?>
|
424 |
+
-
|
425 |
+
<span class="wio-num" id="wio-optimized-num"><?php echo esc_attr($image_statistics['optimized']); ?></span>
|
426 |
+
</li>
|
427 |
+
<li>
|
428 |
+
<span style="background-color:#f1b1b6"></span><?php _e('Error', 'robin-image-optimizer'); ?>
|
429 |
+
-
|
430 |
+
<span class="wio-num" id="wio-error-num"><?php echo esc_attr($image_statistics['error']); ?></span>
|
431 |
+
</li>
|
432 |
</ul>
|
433 |
</div>
|
434 |
<div class="wio-bars">
|
435 |
+
<p><?php _e('Original size', 'robin-image-optimizer'); ?></p>
|
436 |
+
|
437 |
<div class="wio-bar-negative base-transparent wio-right-outside-number">
|
438 |
+
<div id="wio-original-bar" class="wio-progress" style="width: 100%">
|
439 |
+
<span class="wio-barnb" id="wio-original-size"><?php echo esc_attr($statistics->convertToReadableSize($image_statistics['original_size'])); ?></span>
|
440 |
+
</div>
|
441 |
</div>
|
442 |
+
<p><?php _e('Optimized size', 'robin-image-optimizer'); ?></p>
|
443 |
|
|
|
444 |
<div class="wio-bar-primary base-transparent wio-right-outside-number">
|
445 |
+
<div id="wio-optimized-bar" class="wio-progress" style="width: <?php echo ($image_statistics['percent_line']) ? esc_attr($image_statistics['percent_line']) : 100; ?>%">
|
446 |
+
<span class="wio-barnb" id="wio-optimized-size"><?php echo esc_attr($statistics->convertToReadableSize($image_statistics['optimized_size'])); ?></span>
|
447 |
+
</div>
|
448 |
</div>
|
|
|
449 |
</div>
|
450 |
</div>
|
451 |
<ul class="wio-widget-bottom">
|
452 |
<li>
|
453 |
+
<input type="hidden" value="<?php echo wp_create_nonce('wio-iph') ?>" id="wio-iph-nonce">
|
454 |
|
455 |
<p>
|
456 |
<?php $this->button(); ?>
|
457 |
+
<span id="wio-start-msg-complete"><?php _e('All images from the media library are optimized.', 'robin-image-optimizer'); ?></span>
|
458 |
+
</p>
|
459 |
+
|
460 |
+
<p id="wio-start-msg-top"><?php _e('Optimization in progress. Remained', 'robin-image-optimizer'); ?>
|
461 |
+
<span id="wio-total-unoptimized"><?php echo esc_attr($image_statistics['unoptimized']); ?></span>
|
462 |
</p>
|
|
|
463 |
</li>
|
464 |
<li>
|
|
|
465 |
<div class="factory-dropdown factory-from-control-dropdown factory-buttons-way" data-way="buttons">
|
466 |
<div id="wio-level-buttons" class="btn-group factory-buttons-group">
|
467 |
+
<button type="button" data-level="normal" class="btn btn-default btn-small <?php if( $default_level == 'normal' ) : ?>active<?php endif; ?>"><?php _e('Normal', 'robin-image-optimizer'); ?></button>
|
468 |
+
<button type="button" data-level="aggresive" class="btn btn-default btn-small <?php if( $default_level == 'aggresive' ) : ?>active<?php endif; ?>"><?php _e('Medium', 'robin-image-optimizer'); ?></button>
|
469 |
+
<button type="button" data-level="ultra" class="btn btn-default btn-small <?php if( $default_level == 'ultra' ) : ?>active<?php endif; ?>"><?php _e('High', 'robin-image-optimizer'); ?></button>
|
470 |
</div>
|
471 |
</div>
|
472 |
</li>
|
473 |
</ul>
|
474 |
</div>
|
475 |
</div>
|
476 |
+
</div>
|
477 |
+
<?php
|
478 |
}
|
|
|
479 |
}
|
includes/class.plugin.php
CHANGED
@@ -7,31 +7,31 @@
|
|
7 |
*/
|
8 |
|
9 |
// Exit if accessed directly
|
10 |
-
if( !
|
11 |
exit;
|
12 |
}
|
13 |
|
14 |
-
if( !
|
15 |
-
if( !
|
16 |
// Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
|
17 |
// а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
|
18 |
-
// Константа LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON утсанавливается в классе libs/factory/core/includes/
|
19 |
|
20 |
-
if( defined(
|
21 |
class WIO_PluginFactory {
|
22 |
|
23 |
}
|
24 |
} else {
|
25 |
-
class WIO_PluginFactory extends
|
26 |
|
27 |
}
|
28 |
}
|
29 |
}
|
30 |
|
31 |
class WIO_Plugin extends WIO_PluginFactory {
|
32 |
-
|
33 |
/**
|
34 |
-
* @var
|
35 |
*/
|
36 |
private static $app;
|
37 |
|
@@ -39,50 +39,22 @@
|
|
39 |
* @var bool
|
40 |
*/
|
41 |
private $as_addon;
|
42 |
-
|
43 |
-
/**
|
44 |
-
* @var WIO_Cron
|
45 |
-
*/
|
46 |
-
private $cron;
|
47 |
-
|
48 |
-
/**
|
49 |
-
* @var WIO_Media_Library
|
50 |
-
*/
|
51 |
-
private $media_library;
|
52 |
-
|
53 |
-
/**
|
54 |
-
* @var WIO_Image_Processor_Resmush
|
55 |
-
*/
|
56 |
-
private $image_processor;
|
57 |
-
|
58 |
-
/**
|
59 |
-
* @var WIO_Image_Statistic
|
60 |
-
*/
|
61 |
-
private $statistic;
|
62 |
-
|
63 |
-
/**
|
64 |
-
* @var WIO_Logger
|
65 |
-
*/
|
66 |
-
private $logger;
|
67 |
-
|
68 |
-
/**
|
69 |
-
* @var WIO_Backup
|
70 |
-
*/
|
71 |
-
private $backup;
|
72 |
|
73 |
/**
|
74 |
* @param string $plugin_path
|
75 |
* @param array $data
|
76 |
* @throws Exception
|
77 |
*/
|
78 |
-
public function __construct(
|
79 |
-
|
|
|
80 |
|
81 |
if( $this->as_addon ) {
|
82 |
-
$plugin_parent = isset(
|
83 |
|
84 |
-
if( !
|
85 |
-
throw new Exception(
|
86 |
}
|
87 |
|
88 |
// Если плагин загружен, как аддон, то мы передаем в app ссылку на класс родителя
|
@@ -91,16 +63,43 @@
|
|
91 |
// Если плагин самостоятельный, то записываем в app сслыку на текущий класс
|
92 |
self::$app = $this;
|
93 |
|
94 |
-
parent::__construct(
|
95 |
}
|
|
|
|
|
|
|
96 |
|
97 |
$this->init();
|
98 |
-
|
99 |
$this->setModules();
|
100 |
|
101 |
if( is_admin() ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
$this->initActivation();
|
103 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
}
|
105 |
}
|
106 |
|
@@ -109,20 +108,23 @@
|
|
109 |
*
|
110 |
* @return void
|
111 |
*/
|
112 |
-
protected function init()
|
113 |
-
|
114 |
-
require_once(
|
115 |
-
require_once(
|
116 |
-
require_once(
|
117 |
-
require_once(
|
118 |
-
require_once(
|
119 |
-
require_once(
|
120 |
-
require_once(
|
121 |
-
require_once(
|
122 |
-
require_once(
|
123 |
-
|
124 |
-
$
|
125 |
-
$
|
|
|
|
|
|
|
126 |
}
|
127 |
|
128 |
/**
|
@@ -134,44 +136,29 @@
|
|
134 |
* WIO_Plugin::app()->deleteOption()
|
135 |
* WIO_Plugin::app()->getPluginName()
|
136 |
*
|
137 |
-
* @return
|
138 |
*/
|
139 |
-
public static function app()
|
140 |
-
return self::$app;
|
141 |
-
}
|
142 |
-
|
143 |
-
// todo: перенести этот медот в фреймворк
|
144 |
-
protected function setTextDomain()
|
145 |
{
|
146 |
-
|
147 |
-
//load_plugin_textdomain('robin-image-optimizer', false, dirname(WIO_PLUGIN_BASE) . '/languages/');
|
148 |
-
|
149 |
-
$domain = 'robin-image-optimizer';
|
150 |
-
$locale = apply_filters('plugin_locale', is_admin()
|
151 |
-
? get_user_locale()
|
152 |
-
: get_locale(), $domain);
|
153 |
-
$mofile = $domain . '-' . $locale . '.mo';
|
154 |
-
|
155 |
-
if( !load_textdomain($domain, WIO_PLUGIN_DIR . '/languages/' . $mofile) ) {
|
156 |
-
load_muplugin_textdomain($domain);
|
157 |
-
}
|
158 |
}
|
159 |
|
160 |
/**
|
161 |
* Подключаем модули фреймворка
|
162 |
*/
|
163 |
-
protected function setModules()
|
164 |
-
|
165 |
-
|
|
|
166 |
// Модуль отвечает за подключение скриптов и стилей для интерфейса
|
167 |
-
array(
|
168 |
// Модуль отвечает за создание форм и полей
|
169 |
-
array(
|
170 |
// Модуль отвечает за создание шаблонов страниц плагина
|
171 |
-
array(
|
172 |
// Модуль в котором хранится общий функционал плагина Clearfy и его аддонов
|
173 |
-
array(
|
174 |
-
)
|
175 |
}
|
176 |
}
|
177 |
|
@@ -181,101 +168,26 @@
|
|
181 |
protected function initActivation()
|
182 |
{
|
183 |
include_once(WIO_PLUGIN_DIR . '/admin/activation.php');
|
184 |
-
|
185 |
}
|
186 |
|
187 |
/**
|
188 |
* Регистрируем страницы плагина
|
189 |
*/
|
190 |
-
private function registerPages()
|
|
|
191 |
|
192 |
$admin_path = WIO_PLUGIN_DIR . '/admin/pages';
|
193 |
|
194 |
// Пример основной страницы настроек
|
195 |
-
self::app()->registerPage(
|
196 |
|
197 |
// Пример внутренней страницы настроек
|
198 |
-
self::app()->registerPage(
|
199 |
|
200 |
-
if
|
201 |
-
self::app()->registerPage(
|
202 |
}
|
203 |
}
|
204 |
-
|
205 |
-
/**
|
206 |
-
* Подключаем функции бекенда
|
207 |
-
*/
|
208 |
-
public function adminScripts() {
|
209 |
-
require(WIO_PLUGIN_DIR . '/admin/boot.php');
|
210 |
-
$this->registerPages();
|
211 |
-
}
|
212 |
-
|
213 |
-
/**
|
214 |
-
* Метод возвращает объект, отвечающий за оптимизацию изображений через API сторонних сервисов
|
215 |
-
*
|
216 |
-
* @return WIO_Image_Processor_Resmush
|
217 |
-
*/
|
218 |
-
public function getImageProcessor() {
|
219 |
-
if ( ! $this->image_processor ) {
|
220 |
-
$server = $this->getOption( 'image_optimization_server' , 'resmush' );
|
221 |
-
switch( $server ) {
|
222 |
-
case 'resmush':
|
223 |
-
$this->image_processor = new WIO_Image_Processor_Resmush();
|
224 |
-
break;
|
225 |
-
case 'smushpro':
|
226 |
-
$this->image_processor = new WIO_Image_Processor_Smushpro();
|
227 |
-
break;
|
228 |
-
default:
|
229 |
-
$this->image_processor = new WIO_Image_Processor_Resmush();
|
230 |
-
break;
|
231 |
-
}
|
232 |
-
}
|
233 |
-
return $this->image_processor;
|
234 |
-
}
|
235 |
-
|
236 |
-
/**
|
237 |
-
* Метод возвращает объект, отвечающий за работу со статистическими данными по оптимизации изображений
|
238 |
-
*
|
239 |
-
* @return WIO_Image_Statistic
|
240 |
-
*/
|
241 |
-
public function getImageStatistics() {
|
242 |
-
if ( ! $this->statistic ) {
|
243 |
-
$this->statistic = new WIO_Image_Statistic();
|
244 |
-
}
|
245 |
-
return $this->statistic;
|
246 |
-
}
|
247 |
-
|
248 |
-
/**
|
249 |
-
* Метод возвращает объект, отвечающий за работу логами
|
250 |
-
*
|
251 |
-
* @return WIO_Logger
|
252 |
-
*/
|
253 |
-
public function getLogger() {
|
254 |
-
if ( ! $this->logger ) {
|
255 |
-
$this->logger = new WIO_Logger();
|
256 |
-
}
|
257 |
-
return $this->logger;
|
258 |
-
}
|
259 |
-
|
260 |
-
/**
|
261 |
-
* Метод возвращает объект, отвечающий за работу с резервными копиями
|
262 |
-
*
|
263 |
-
* @return WIO_Backup
|
264 |
-
*/
|
265 |
-
public function getBackup() {
|
266 |
-
if ( ! $this->backup ) {
|
267 |
-
$this->backup = new WIO_Backup();
|
268 |
-
}
|
269 |
-
return $this->backup;
|
270 |
-
}
|
271 |
-
|
272 |
-
/**
|
273 |
-
* Метод возвращает объект, отвечающий за работу с медиабиблиотекой
|
274 |
-
*
|
275 |
-
* @return WIO_Media_Library
|
276 |
-
*/
|
277 |
-
public function getMediaLibrary() {
|
278 |
-
return $this->media_library;
|
279 |
-
}
|
280 |
}
|
281 |
}
|
7 |
*/
|
8 |
|
9 |
// Exit if accessed directly
|
10 |
+
if( !defined('ABSPATH') ) {
|
11 |
exit;
|
12 |
}
|
13 |
|
14 |
+
if( !class_exists('WIO_Plugin') ) {
|
15 |
+
if( !class_exists('WIO_PluginFactory') ) {
|
16 |
// Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
|
17 |
// а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
|
18 |
+
// Константа LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON утсанавливается в классе libs/factory/core/includes/Wbcr_Factory409_Plugin
|
19 |
|
20 |
+
if( defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ) {
|
21 |
class WIO_PluginFactory {
|
22 |
|
23 |
}
|
24 |
} else {
|
25 |
+
class WIO_PluginFactory extends Wbcr_Factory409_Plugin {
|
26 |
|
27 |
}
|
28 |
}
|
29 |
}
|
30 |
|
31 |
class WIO_Plugin extends WIO_PluginFactory {
|
32 |
+
|
33 |
/**
|
34 |
+
* @var Wbcr_Factory409_Plugin
|
35 |
*/
|
36 |
private static $app;
|
37 |
|
39 |
* @var bool
|
40 |
*/
|
41 |
private $as_addon;
|
42 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
|
44 |
/**
|
45 |
* @param string $plugin_path
|
46 |
* @param array $data
|
47 |
* @throws Exception
|
48 |
*/
|
49 |
+
public function __construct($plugin_path, $data)
|
50 |
+
{
|
51 |
+
$this->as_addon = isset($data['as_addon']) ? true : false;
|
52 |
|
53 |
if( $this->as_addon ) {
|
54 |
+
$plugin_parent = isset($data['plugin_parent']) ? $data['plugin_parent'] : null;
|
55 |
|
56 |
+
if( !($plugin_parent instanceof Wbcr_Factory409_Plugin) ) {
|
57 |
+
throw new Exception(__('An invalid instance of the class was passed.', 'robin-image-optimizer'));
|
58 |
}
|
59 |
|
60 |
// Если плагин загружен, как аддон, то мы передаем в app ссылку на класс родителя
|
63 |
// Если плагин самостоятельный, то записываем в app сслыку на текущий класс
|
64 |
self::$app = $this;
|
65 |
|
66 |
+
parent::__construct($plugin_path, $data);
|
67 |
}
|
68 |
+
|
69 |
+
// Для корректной работы с файлами имена которых в utf-8
|
70 |
+
//setlocale(LC_ALL, "en_US.utf8");
|
71 |
|
72 |
$this->init();
|
73 |
+
|
74 |
$this->setModules();
|
75 |
|
76 |
if( is_admin() ) {
|
77 |
+
if( defined('DOING_AJAX') && DOING_AJAX ) {
|
78 |
+
// Ajax files
|
79 |
+
require_once(WIO_PLUGIN_DIR . '/admin/ajax/check-servers-status.php');
|
80 |
+
require_once(WIO_PLUGIN_DIR . '/admin/ajax/select-server.php');
|
81 |
+
require_once(WIO_PLUGIN_DIR . '/admin/ajax/backup.php');
|
82 |
+
require_once(WIO_PLUGIN_DIR . '/admin/ajax/optimization.php');
|
83 |
+
}
|
84 |
+
|
85 |
$this->initActivation();
|
86 |
+
}
|
87 |
+
|
88 |
+
add_action('plugins_loaded', array($this, 'pluginsLoaded'));
|
89 |
+
}
|
90 |
+
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Подключаем функции бекенда
|
94 |
+
*/
|
95 |
+
public function pluginsLoaded()
|
96 |
+
{
|
97 |
+
self::app()->setTextDomain('robin-image-optimizer', WIO_PLUGIN_DIR);
|
98 |
+
|
99 |
+
if( is_admin() ) {
|
100 |
+
require_once(WIO_PLUGIN_DIR . '/admin/boot.php');
|
101 |
+
|
102 |
+
$this->registerPages();
|
103 |
}
|
104 |
}
|
105 |
|
108 |
*
|
109 |
* @return void
|
110 |
*/
|
111 |
+
protected function init()
|
112 |
+
{
|
113 |
+
require_once(WIO_PLUGIN_DIR . '/includes/functions.php');
|
114 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.attachment.php');
|
115 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.media-library.php');
|
116 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.image-processor-abstract.php');
|
117 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.cron.php');
|
118 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.image-statistic.php');
|
119 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.backup.php');
|
120 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.logger.php');
|
121 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.optimization-tools.php');
|
122 |
+
|
123 |
+
$cron = new WIO_Cron();
|
124 |
+
$cron->initHooks();
|
125 |
+
|
126 |
+
$media_library = new WIO_MediaLibrary();
|
127 |
+
$media_library->initHooks();
|
128 |
}
|
129 |
|
130 |
/**
|
136 |
* WIO_Plugin::app()->deleteOption()
|
137 |
* WIO_Plugin::app()->getPluginName()
|
138 |
*
|
139 |
+
* @return Wbcr_Factory409_Plugin
|
140 |
*/
|
141 |
+
public static function app()
|
|
|
|
|
|
|
|
|
|
|
142 |
{
|
143 |
+
return self::$app;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
}
|
145 |
|
146 |
/**
|
147 |
* Подключаем модули фреймворка
|
148 |
*/
|
149 |
+
protected function setModules()
|
150 |
+
{
|
151 |
+
if( !$this->as_addon ) {
|
152 |
+
self::app()->load(array(
|
153 |
// Модуль отвечает за подключение скриптов и стилей для интерфейса
|
154 |
+
array('libs/factory/bootstrap', 'factory_bootstrap_409', 'admin'),
|
155 |
// Модуль отвечает за создание форм и полей
|
156 |
+
array('libs/factory/forms', 'factory_forms_410', 'admin'),
|
157 |
// Модуль отвечает за создание шаблонов страниц плагина
|
158 |
+
array('libs/factory/pages', 'factory_pages_410', 'admin'),
|
159 |
// Модуль в котором хранится общий функционал плагина Clearfy и его аддонов
|
160 |
+
array('libs/factory/clearfy', 'factory_clearfy_206', 'all')
|
161 |
+
));
|
162 |
}
|
163 |
}
|
164 |
|
168 |
protected function initActivation()
|
169 |
{
|
170 |
include_once(WIO_PLUGIN_DIR . '/admin/activation.php');
|
171 |
+
self::app()->registerActivation('WIO_Activation');
|
172 |
}
|
173 |
|
174 |
/**
|
175 |
* Регистрируем страницы плагина
|
176 |
*/
|
177 |
+
private function registerPages()
|
178 |
+
{
|
179 |
|
180 |
$admin_path = WIO_PLUGIN_DIR . '/admin/pages';
|
181 |
|
182 |
// Пример основной страницы настроек
|
183 |
+
self::app()->registerPage('WIO_SettingsPage', $admin_path . '/settings.php');
|
184 |
|
185 |
// Пример внутренней страницы настроек
|
186 |
+
self::app()->registerPage('WIO_StatisticPage', $admin_path . '/statistic.php');
|
187 |
|
188 |
+
if( self::app()->getOption('error_log', false) ) {
|
189 |
+
self::app()->registerPage('WIO_LogPage', $admin_path . '/log.php');
|
190 |
}
|
191 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
192 |
}
|
193 |
}
|
includes/classes/class.attachment.php
CHANGED
@@ -77,9 +77,9 @@
|
|
77 |
$message .= "['.$size_type.'] ".$size_info['width'].'x'.$size_info['height']. PHP_EOL;
|
78 |
$message .= "['.$size_type.'] ".$size_info['mime-type']. PHP_EOL;
|
79 |
}
|
80 |
-
$error .= '============================================'. PHP_EOL;
|
81 |
|
82 |
-
$logger =
|
83 |
$logger->add( $error );
|
84 |
}
|
85 |
|
@@ -95,11 +95,12 @@
|
|
95 |
$optimized_size = 0;
|
96 |
// сначала бекапим
|
97 |
$is_image_backuped = $this->backup();
|
98 |
-
|
99 |
if ( is_wp_error( $is_image_backuped ) ) {
|
100 |
$error_msg = $is_image_backuped->get_error_message() . PHP_EOL;
|
101 |
$this->writeLog( $error_msg );
|
102 |
-
|
|
|
103 |
return array(
|
104 |
'errors_count' => 1,
|
105 |
'original_size' => 0,
|
@@ -107,16 +108,22 @@
|
|
107 |
'optimized_count' => 0,
|
108 |
);
|
109 |
}
|
110 |
-
|
|
|
111 |
$original_main_size = filesize( $this->get( 'path' ) );
|
112 |
// если файл большой - изменяем размер
|
113 |
if ( $this->isNeedResize() ) {
|
114 |
$this->resize();
|
115 |
}
|
116 |
-
|
|
|
|
|
117 |
if ( ! $optimization_level ) {
|
118 |
$optimization_level = WIO_Plugin::app()->getOption( 'image_optimization_level' , 'normal' );
|
119 |
}
|
|
|
|
|
|
|
120 |
$optimized_img_data = $image_processor->process( array(
|
121 |
'image_url' => $this->get( 'url' ),
|
122 |
'image_path' => $this->get( 'path' ),
|
@@ -135,6 +142,11 @@
|
|
135 |
} else {
|
136 |
//скачиваем и заменяем картинку
|
137 |
$image_downloaded = $this->replaceOriginalFile( $optimized_img_data );
|
|
|
|
|
|
|
|
|
|
|
138 |
if ( $image_downloaded ) {
|
139 |
// оптимизируем дополнительные размеры
|
140 |
$optimized_img_sizes_data = $this->optimizeImageSizes();
|
@@ -154,7 +166,6 @@
|
|
154 |
update_post_meta( $this->get( 'id' ), 'wio_original_size', $original_size );
|
155 |
update_post_meta( $this->get( 'id' ), 'wio_original_main_size', $original_main_size );
|
156 |
update_post_meta( $this->get( 'id' ), 'wio_optimization_level', $optimization_level );
|
157 |
-
update_post_meta( $this->get( 'id' ), 'wio_backuped', $is_image_backuped );
|
158 |
|
159 |
delete_post_meta( $this->get( 'id' ), 'wio_error' );
|
160 |
delete_post_meta( $this->get( 'id' ), 'wio_current_error' );
|
@@ -211,7 +222,7 @@
|
|
211 |
return false;
|
212 |
}
|
213 |
|
214 |
-
$image_processor =
|
215 |
$quality = WIO_Plugin::app()->getOption( 'image_optimization_level' , 'normal' );
|
216 |
$exif = WIO_Plugin::app()->getOption( 'save_exif_data' , false );
|
217 |
|
@@ -225,6 +236,10 @@
|
|
225 |
if ( ! $url or ! $path ) {
|
226 |
continue;
|
227 |
}
|
|
|
|
|
|
|
|
|
228 |
$optimized_img_data = $image_processor->process( array(
|
229 |
'image_url' => $url,
|
230 |
'image_path' => $path,
|
@@ -237,6 +252,14 @@
|
|
237 |
} else {
|
238 |
//скачиваем и заменяем картинку
|
239 |
$this->replaceOriginalFile( $optimized_img_data, $image_size );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
240 |
|
241 |
//просчитываем статистику
|
242 |
$original_size += $optimized_img_data['src_size'];
|
@@ -333,13 +356,15 @@
|
|
333 |
* Возвращает URL изображения по указанному размеру
|
334 |
*
|
335 |
* @param string $size - размер изображения(thumbnail,medium,large...)
|
336 |
-
* @return
|
337 |
*/
|
338 |
public function getImageSizeUrl( $size = 'thumbnail' ) {
|
339 |
if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
|
340 |
return false;
|
341 |
}
|
342 |
-
$
|
|
|
|
|
343 |
return $url;
|
344 |
}
|
345 |
|
@@ -347,13 +372,15 @@
|
|
347 |
* Возвращает путь к изображению по указанному размеру
|
348 |
*
|
349 |
* @param string $size - размер изображения(thumbnail,medium,large...)
|
350 |
-
* @return
|
351 |
*/
|
352 |
public function getImageSizePath( $size = 'thumbnail' ) {
|
353 |
if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
|
354 |
return false;
|
355 |
}
|
356 |
-
$
|
|
|
|
|
357 |
return $path;
|
358 |
}
|
359 |
|
@@ -366,13 +393,19 @@
|
|
366 |
if ( ! $resize_large_images ) {
|
367 |
return false;
|
368 |
}
|
|
|
|
|
369 |
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
}
|
375 |
-
|
|
|
|
|
|
|
|
|
376 |
}
|
377 |
|
378 |
/**
|
@@ -394,12 +427,36 @@
|
|
394 |
$new_height = $resize_larger_side;
|
395 |
$new_width = round( $current_size['width'] * $new_height / $current_size['height'] );
|
396 |
}
|
397 |
-
|
398 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
399 |
$this->attachment_meta['width'] = $new_width;
|
400 |
$this->attachment_meta['height'] = $new_height;
|
401 |
$this->attachment_meta['old_width'] = $current_size['width'];
|
402 |
$this->attachment_meta['old_height'] = $current_size['height'];
|
|
|
403 |
wp_update_attachment_metadata( $this->id, $this->attachment_meta );
|
404 |
}
|
405 |
}
|
@@ -410,18 +467,22 @@
|
|
410 |
* @return true|WP_Error
|
411 |
*/
|
412 |
protected function backup() {
|
413 |
-
$backup =
|
414 |
return $backup->backupAttachment( $this );
|
415 |
}
|
416 |
-
|
417 |
/**
|
418 |
* Восстанавливает файлы из резервной копии
|
419 |
*
|
420 |
* @return true|WP_Error
|
421 |
*/
|
422 |
public function restore() {
|
423 |
-
$backup =
|
424 |
return $backup->restoreAttachment( $this );
|
425 |
}
|
426 |
|
|
|
|
|
|
|
|
|
427 |
}
|
77 |
$message .= "['.$size_type.'] ".$size_info['width'].'x'.$size_info['height']. PHP_EOL;
|
78 |
$message .= "['.$size_type.'] ".$size_info['mime-type']. PHP_EOL;
|
79 |
}
|
80 |
+
$error .= PHP_EOL.'============================================'. PHP_EOL;
|
81 |
|
82 |
+
$logger = new WIO_Logger();
|
83 |
$logger->add( $error );
|
84 |
}
|
85 |
|
95 |
$optimized_size = 0;
|
96 |
// сначала бекапим
|
97 |
$is_image_backuped = $this->backup();
|
98 |
+
|
99 |
if ( is_wp_error( $is_image_backuped ) ) {
|
100 |
$error_msg = $is_image_backuped->get_error_message() . PHP_EOL;
|
101 |
$this->writeLog( $error_msg );
|
102 |
+
update_post_meta( $this->get( 'id' ), 'wio_backuped', 0 );
|
103 |
+
|
104 |
return array(
|
105 |
'errors_count' => 1,
|
106 |
'original_size' => 0,
|
108 |
'optimized_count' => 0,
|
109 |
);
|
110 |
}
|
111 |
+
update_post_meta( $this->get( 'id' ), 'wio_backuped', $is_image_backuped );
|
112 |
+
|
113 |
$original_main_size = filesize( $this->get( 'path' ) );
|
114 |
// если файл большой - изменяем размер
|
115 |
if ( $this->isNeedResize() ) {
|
116 |
$this->resize();
|
117 |
}
|
118 |
+
|
119 |
+
$image_processor = WIO_OptimizationTools::getImageProcessor();
|
120 |
+
|
121 |
if ( ! $optimization_level ) {
|
122 |
$optimization_level = WIO_Plugin::app()->getOption( 'image_optimization_level' , 'normal' );
|
123 |
}
|
124 |
+
|
125 |
+
clearstatcache(); // на всякий случай очистим кеш файловой статистики
|
126 |
+
|
127 |
$optimized_img_data = $image_processor->process( array(
|
128 |
'image_url' => $this->get( 'url' ),
|
129 |
'image_path' => $this->get( 'path' ),
|
142 |
} else {
|
143 |
//скачиваем и заменяем картинку
|
144 |
$image_downloaded = $this->replaceOriginalFile( $optimized_img_data );
|
145 |
+
// некоторые провайдеры не отдают оптимизированный размер, поэтому после замены файла получаем его сами
|
146 |
+
if ( ! $optimized_img_data['optimized_size'] ) {
|
147 |
+
clearstatcache();
|
148 |
+
$optimized_img_data['optimized_size'] = filesize( $this->get( 'path' ) );
|
149 |
+
}
|
150 |
if ( $image_downloaded ) {
|
151 |
// оптимизируем дополнительные размеры
|
152 |
$optimized_img_sizes_data = $this->optimizeImageSizes();
|
166 |
update_post_meta( $this->get( 'id' ), 'wio_original_size', $original_size );
|
167 |
update_post_meta( $this->get( 'id' ), 'wio_original_main_size', $original_main_size );
|
168 |
update_post_meta( $this->get( 'id' ), 'wio_optimization_level', $optimization_level );
|
|
|
169 |
|
170 |
delete_post_meta( $this->get( 'id' ), 'wio_error' );
|
171 |
delete_post_meta( $this->get( 'id' ), 'wio_current_error' );
|
222 |
return false;
|
223 |
}
|
224 |
|
225 |
+
$image_processor = WIO_OptimizationTools::getImageProcessor();
|
226 |
$quality = WIO_Plugin::app()->getOption( 'image_optimization_level' , 'normal' );
|
227 |
$exif = WIO_Plugin::app()->getOption( 'save_exif_data' , false );
|
228 |
|
236 |
if ( ! $url or ! $path ) {
|
237 |
continue;
|
238 |
}
|
239 |
+
$original_file_size = 0;
|
240 |
+
if ( is_file( $path ) ) {
|
241 |
+
$original_file_size = filesize( $path );
|
242 |
+
}
|
243 |
$optimized_img_data = $image_processor->process( array(
|
244 |
'image_url' => $url,
|
245 |
'image_path' => $path,
|
252 |
} else {
|
253 |
//скачиваем и заменяем картинку
|
254 |
$this->replaceOriginalFile( $optimized_img_data, $image_size );
|
255 |
+
// некоторые провайдеры не отдают оптимизированный размер, поэтому после замены файла получаем его сами
|
256 |
+
if ( ! $optimized_img_data['optimized_size'] ) {
|
257 |
+
clearstatcache();
|
258 |
+
$optimized_img_data['optimized_size'] = filesize( $path );
|
259 |
+
}
|
260 |
+
if ( ! $optimized_img_data['src_size'] ) {
|
261 |
+
$optimized_img_data['src_size'] = $original_file_size;
|
262 |
+
}
|
263 |
|
264 |
//просчитываем статистику
|
265 |
$original_size += $optimized_img_data['src_size'];
|
356 |
* Возвращает URL изображения по указанному размеру
|
357 |
*
|
358 |
* @param string $size - размер изображения(thumbnail,medium,large...)
|
359 |
+
* @return string
|
360 |
*/
|
361 |
public function getImageSizeUrl( $size = 'thumbnail' ) {
|
362 |
if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
|
363 |
return false;
|
364 |
}
|
365 |
+
$exploded = explode( '/', $this->url );
|
366 |
+
$basename = array_pop( $exploded );
|
367 |
+
$url = str_replace( $basename, $this->attachment_meta['sizes'][ $size ]['file'], $this->url );
|
368 |
return $url;
|
369 |
}
|
370 |
|
372 |
* Возвращает путь к изображению по указанному размеру
|
373 |
*
|
374 |
* @param string $size - размер изображения(thumbnail,medium,large...)
|
375 |
+
* @return string
|
376 |
*/
|
377 |
public function getImageSizePath( $size = 'thumbnail' ) {
|
378 |
if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
|
379 |
return false;
|
380 |
}
|
381 |
+
$exploded = explode( DIRECTORY_SEPARATOR, $this->path );
|
382 |
+
$basename = array_pop( $exploded );
|
383 |
+
$path = str_replace( $basename, $this->attachment_meta['sizes'][ $size ]['file'], $this->path );
|
384 |
return $path;
|
385 |
}
|
386 |
|
393 |
if ( ! $resize_large_images ) {
|
394 |
return false;
|
395 |
}
|
396 |
+
$larger_side = 0;
|
397 |
+
$resize_larger_side = WIO_Plugin::app()->getOption( 'resize_larger_w' , 1600 );
|
398 |
|
399 |
+
if ( $this->attachment_meta['width'] >= $this->attachment_meta['height'] ) {
|
400 |
+
$larger_side = $this->attachment_meta['width'];
|
401 |
+
} else {
|
402 |
+
$larger_side = $this->attachment_meta['height'];
|
403 |
}
|
404 |
+
// если большая сторона картинки меньше, чем задано в настройках, то не ризайзим.
|
405 |
+
if ( $larger_side <= $resize_larger_side ) {
|
406 |
+
return false;
|
407 |
+
}
|
408 |
+
return true;
|
409 |
}
|
410 |
|
411 |
/**
|
427 |
$new_height = $resize_larger_side;
|
428 |
$new_width = round( $current_size['width'] * $new_height / $current_size['height'] );
|
429 |
}
|
430 |
+
|
431 |
+
// Информация для логирование ошибок
|
432 |
+
// ---------
|
433 |
+
$resize_error_log_info = '-----'. PHP_EOL;
|
434 |
+
$resize_error_log_info .= '[origin_size: '.$current_size['width'].'x'.$current_size['height'].']'. PHP_EOL;
|
435 |
+
$resize_error_log_info .= '[new_size: '.$new_width.'x'.$new_height.']'. PHP_EOL;
|
436 |
+
$resize_error_log_info .= '[resize_larger_w: '.$resize_larger_side.']'. PHP_EOL;
|
437 |
+
$resize_error_log_info .= '[path:'.$this->path.']'. PHP_EOL;
|
438 |
+
$resize_error_log_info .= '-----'. PHP_EOL;
|
439 |
+
// ---------
|
440 |
+
|
441 |
+
$resize_result = $image->resize( $new_width, $new_height, false );
|
442 |
+
|
443 |
+
if(is_wp_error($resize_result)) {
|
444 |
+
$this->writeLog( 'Image resize error ('.$resize_result->get_error_messages().')' . PHP_EOL . $resize_error_log_info );
|
445 |
+
return false;
|
446 |
+
}
|
447 |
+
|
448 |
+
$save_result = $image->save( $this->path );
|
449 |
+
|
450 |
+
if(is_wp_error($save_result)) {
|
451 |
+
$this->writeLog( 'Image resize error ('.$save_result->get_error_messages().')' . PHP_EOL . $resize_error_log_info );
|
452 |
+
return false;
|
453 |
+
}
|
454 |
+
|
455 |
$this->attachment_meta['width'] = $new_width;
|
456 |
$this->attachment_meta['height'] = $new_height;
|
457 |
$this->attachment_meta['old_width'] = $current_size['width'];
|
458 |
$this->attachment_meta['old_height'] = $current_size['height'];
|
459 |
+
|
460 |
wp_update_attachment_metadata( $this->id, $this->attachment_meta );
|
461 |
}
|
462 |
}
|
467 |
* @return true|WP_Error
|
468 |
*/
|
469 |
protected function backup() {
|
470 |
+
$backup = new WIO_Backup();
|
471 |
return $backup->backupAttachment( $this );
|
472 |
}
|
473 |
+
|
474 |
/**
|
475 |
* Восстанавливает файлы из резервной копии
|
476 |
*
|
477 |
* @return true|WP_Error
|
478 |
*/
|
479 |
public function restore() {
|
480 |
+
$backup = new WIO_Backup();
|
481 |
return $backup->restoreAttachment( $this );
|
482 |
}
|
483 |
|
484 |
+
public function getMetaData() {
|
485 |
+
return $this->attachment_meta;
|
486 |
+
}
|
487 |
+
|
488 |
}
|
includes/classes/class.backup.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
|
3 |
// Exit if accessed directly
|
4 |
-
if( !
|
5 |
exit;
|
6 |
}
|
7 |
|
@@ -31,7 +31,8 @@
|
|
31 |
/**
|
32 |
* Инициализация бекапа
|
33 |
*/
|
34 |
-
public function __construct()
|
|
|
35 |
$this->wp_upload_dir = wp_upload_dir();
|
36 |
$this->backup_dir = $this->getBackupDir();
|
37 |
}
|
@@ -39,228 +40,309 @@
|
|
39 |
/**
|
40 |
* Проверка возможности записи в папку аплоад
|
41 |
*/
|
42 |
-
public function isUploadWritable()
|
|
|
43 |
$upload_dir = $this->wp_upload_dir['basedir'];
|
44 |
-
if
|
45 |
return true;
|
46 |
}
|
|
|
47 |
return false;
|
48 |
}
|
49 |
|
50 |
/**
|
51 |
* Проверка возможности записи в папку бекап
|
52 |
*/
|
53 |
-
public function isBackupWritable()
|
|
|
54 |
$backup_dir = $this->getBackupDir();
|
55 |
-
if
|
56 |
return false;
|
57 |
}
|
58 |
-
if
|
59 |
return true;
|
60 |
}
|
|
|
61 |
return false;
|
62 |
}
|
63 |
|
64 |
/**
|
65 |
* Путь к папке с бекапами
|
66 |
-
*
|
67 |
* @return string|WP_Error
|
68 |
*/
|
69 |
-
public function getBackupDir()
|
70 |
-
|
|
|
71 |
return $this->backup_dir;
|
72 |
}
|
73 |
$dir = $this->wp_upload_dir['basedir'] . '/' . $this->backup_dir_name . '/';
|
74 |
-
if
|
75 |
// создаём
|
76 |
-
if( !
|
77 |
-
return new WP_Error(
|
78 |
}
|
79 |
}
|
|
|
80 |
return $dir;
|
81 |
}
|
82 |
|
83 |
/**
|
84 |
* Очищает папку с резервными копиями
|
85 |
-
*
|
86 |
*/
|
87 |
-
public function removeBackupDir()
|
|
|
88 |
$backup_dir = $this->getBackupDir();
|
89 |
-
if
|
90 |
-
$this->rmDir(
|
91 |
}
|
92 |
}
|
93 |
|
94 |
/**
|
95 |
* Удаляет папку со всем содержимым
|
96 |
-
*
|
97 |
* @param string $dir папка
|
98 |
*/
|
99 |
-
protected function rmDir(
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
|
|
107 |
} else {
|
108 |
-
$this->rmDir(
|
109 |
-
|
|
|
|
|
110 |
}
|
111 |
}
|
112 |
}
|
113 |
}
|
114 |
-
rmdir(
|
115 |
}
|
116 |
}
|
117 |
|
118 |
/**
|
119 |
* Получает путь к папке с резервными копиями
|
120 |
-
*
|
121 |
* @param array $attachment_meta метаданные аттачмента
|
122 |
* @return string
|
123 |
*/
|
124 |
-
public function getAttachmentBackupDir(
|
|
|
125 |
$backup_dir = $this->getBackupDir();
|
126 |
-
$file_subdirs = explode(
|
127 |
-
array_pop(
|
128 |
-
foreach
|
129 |
$backup_dir .= $subdir_name . '/';
|
130 |
-
if
|
131 |
-
if( !
|
132 |
-
return new WP_Error(
|
133 |
}
|
134 |
}
|
135 |
}
|
|
|
136 |
return $backup_dir;
|
137 |
}
|
138 |
|
139 |
/**
|
140 |
* Делаем резервную копию аттачмента
|
141 |
-
*
|
142 |
* @param WIO_Attachment $wio_attachment аттачмент
|
143 |
* @return bool|WP_Error
|
144 |
*/
|
145 |
-
public function backupAttachment( $wio_attachment
|
146 |
-
|
147 |
-
|
|
|
148 |
return false; // если бекап не требуется
|
149 |
}
|
150 |
-
$backup_dir = $this->getAttachmentBackupDir(
|
151 |
-
if
|
152 |
return $backup_dir;
|
153 |
}
|
154 |
-
$full = $this->backupAttachmentSize(
|
155 |
-
if
|
156 |
return $full;
|
157 |
}
|
158 |
$allowed_sizes = $wio_attachment->getAllowedSizes();
|
159 |
-
if
|
160 |
-
foreach
|
161 |
-
$size_backup = $this->backupAttachmentSize(
|
162 |
-
if
|
163 |
return $size_backup;
|
164 |
}
|
165 |
}
|
166 |
}
|
|
|
167 |
return true;
|
168 |
}
|
169 |
|
170 |
/**
|
171 |
* Восстанавливаем аттачмент из резервной копии
|
172 |
-
*
|
173 |
* @param WIO_Attachment $wio_attachment аттачмент
|
174 |
* @return bool|WP_Error
|
175 |
*/
|
176 |
-
public function restoreAttachment( $wio_attachment
|
177 |
-
|
178 |
-
|
|
|
179 |
return $backup_dir;
|
180 |
}
|
181 |
-
$full = $this->restoreAttachmentSize(
|
182 |
-
|
183 |
-
if
|
|
|
|
|
|
|
|
|
184 |
$attachment_meta['width'] = $attachment_meta['old_width'];
|
185 |
$attachment_meta['height'] = $attachment_meta['old_height'];
|
186 |
-
wp_update_attachment_metadata(
|
187 |
-
}
|
188 |
-
if ( is_wp_error( $full ) ) {
|
189 |
-
return $full;
|
190 |
}
|
|
|
191 |
$allowed_sizes = $wio_attachment->getAllowedSizes();
|
192 |
-
if
|
193 |
-
foreach
|
194 |
-
$size_backup = $this->restoreAttachmentSize(
|
195 |
}
|
196 |
}
|
|
|
197 |
return true;
|
198 |
}
|
199 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
200 |
/**
|
201 |
* Резервное копирование файла аттачмента
|
202 |
-
*
|
203 |
* @param WIO_Attachment $wio_attachment аттачмент
|
204 |
* @param string $image_size Размер(thumbnail, medium ... )
|
205 |
* @return bool|WP_Error
|
206 |
*/
|
207 |
-
protected function backupAttachmentSize( $wio_attachment, $image_size = ''
|
208 |
-
|
209 |
-
|
|
|
210 |
} else {
|
211 |
-
$original_file = $wio_attachment->get(
|
212 |
}
|
213 |
-
$backup_dir = $this->getAttachmentBackupDir(
|
214 |
// проверить запись в папку
|
215 |
-
if
|
216 |
return $backup_dir;
|
217 |
}
|
218 |
-
if
|
219 |
// бывает такое, что размера превьюшки нет в базе данных.
|
220 |
// это не считается ошибкой, поэтому сразу пропускаем
|
221 |
return false;
|
222 |
}
|
223 |
-
|
224 |
-
|
225 |
-
|
|
|
|
|
226 |
}
|
|
|
227 |
return true;
|
228 |
}
|
229 |
|
230 |
/**
|
231 |
* Восстановление файла аттачмента из резервной копии
|
232 |
-
*
|
233 |
* @param WIO_Attachment $wio_attachment аттачмент
|
234 |
* @param string $image_size Размер(thumbnail, medium ... )
|
235 |
* @return bool|WP_Error
|
236 |
*/
|
237 |
-
protected function restoreAttachmentSize( $wio_attachment, $image_size = ''
|
238 |
-
|
239 |
-
|
|
|
240 |
} else {
|
241 |
-
$original_file = $wio_attachment->get(
|
242 |
}
|
243 |
-
$backup_dir = $this->getAttachmentBackupDir(
|
244 |
-
if
|
245 |
return $backup_dir;
|
246 |
}
|
247 |
-
if
|
248 |
-
// бывает такое, что размера превьюшки нет в базе данных.
|
249 |
-
// это не считается ошибкой, поэтому сразу пропускаем
|
250 |
return false;
|
251 |
}
|
252 |
-
|
253 |
-
$
|
254 |
-
|
255 |
-
|
256 |
-
|
|
|
|
|
257 |
} else {
|
258 |
$restored = false;
|
259 |
-
$logger =
|
260 |
-
$error_msg = __(
|
261 |
-
$logger->add(
|
262 |
-
|
|
|
|
|
263 |
return $restored;
|
264 |
}
|
265 |
|
|
|
|
|
|
|
|
|
|
|
|
|
266 |
}
|
1 |
<?php
|
2 |
|
3 |
// Exit if accessed directly
|
4 |
+
if( !defined('ABSPATH') ) {
|
5 |
exit;
|
6 |
}
|
7 |
|
31 |
/**
|
32 |
* Инициализация бекапа
|
33 |
*/
|
34 |
+
public function __construct()
|
35 |
+
{
|
36 |
$this->wp_upload_dir = wp_upload_dir();
|
37 |
$this->backup_dir = $this->getBackupDir();
|
38 |
}
|
40 |
/**
|
41 |
* Проверка возможности записи в папку аплоад
|
42 |
*/
|
43 |
+
public function isUploadWritable()
|
44 |
+
{
|
45 |
$upload_dir = $this->wp_upload_dir['basedir'];
|
46 |
+
if( is_dir($upload_dir) and is_writable($upload_dir) ) {
|
47 |
return true;
|
48 |
}
|
49 |
+
|
50 |
return false;
|
51 |
}
|
52 |
|
53 |
/**
|
54 |
* Проверка возможности записи в папку бекап
|
55 |
*/
|
56 |
+
public function isBackupWritable()
|
57 |
+
{
|
58 |
$backup_dir = $this->getBackupDir();
|
59 |
+
if( is_wp_error($backup_dir) ) {
|
60 |
return false;
|
61 |
}
|
62 |
+
if( is_writable($backup_dir) ) {
|
63 |
return true;
|
64 |
}
|
65 |
+
|
66 |
return false;
|
67 |
}
|
68 |
|
69 |
/**
|
70 |
* Путь к папке с бекапами
|
71 |
+
*
|
72 |
* @return string|WP_Error
|
73 |
*/
|
74 |
+
public function getBackupDir()
|
75 |
+
{
|
76 |
+
if( $this->backup_dir ) {
|
77 |
return $this->backup_dir;
|
78 |
}
|
79 |
$dir = $this->wp_upload_dir['basedir'] . '/' . $this->backup_dir_name . '/';
|
80 |
+
if( !is_dir($dir) ) {
|
81 |
// создаём
|
82 |
+
if( !mkdir($dir) ) {
|
83 |
+
return new WP_Error('backup_dir_error', __('Unable to create backup folder.', 'robin-image-optimizer'));
|
84 |
}
|
85 |
}
|
86 |
+
|
87 |
return $dir;
|
88 |
}
|
89 |
|
90 |
/**
|
91 |
* Очищает папку с резервными копиями
|
92 |
+
*
|
93 |
*/
|
94 |
+
public function removeBackupDir()
|
95 |
+
{
|
96 |
$backup_dir = $this->getBackupDir();
|
97 |
+
if( is_dir($backup_dir) ) {
|
98 |
+
$this->rmDir($backup_dir);
|
99 |
}
|
100 |
}
|
101 |
|
102 |
/**
|
103 |
* Удаляет папку со всем содержимым
|
104 |
+
*
|
105 |
* @param string $dir папка
|
106 |
*/
|
107 |
+
protected function rmDir($dir)
|
108 |
+
{
|
109 |
+
if( is_dir($dir) ) {
|
110 |
+
$scn = scandir($dir);
|
111 |
+
foreach($scn as $files) {
|
112 |
+
if( $files !== '.' ) {
|
113 |
+
if( $files !== '..' ) {
|
114 |
+
if( !is_dir($dir . '/' . $files) ) {
|
115 |
+
unlink($dir . '/' . $files);
|
116 |
} else {
|
117 |
+
$this->rmDir($dir . '/' . $files);
|
118 |
+
if( is_dir($dir . '/' . $files) ) {
|
119 |
+
rmdir($dir . '/' . $files);
|
120 |
+
}
|
121 |
}
|
122 |
}
|
123 |
}
|
124 |
}
|
125 |
+
rmdir($dir);
|
126 |
}
|
127 |
}
|
128 |
|
129 |
/**
|
130 |
* Получает путь к папке с резервными копиями
|
131 |
+
*
|
132 |
* @param array $attachment_meta метаданные аттачмента
|
133 |
* @return string
|
134 |
*/
|
135 |
+
public function getAttachmentBackupDir($attachment_meta)
|
136 |
+
{
|
137 |
$backup_dir = $this->getBackupDir();
|
138 |
+
$file_subdirs = explode('/', $attachment_meta['file']);
|
139 |
+
array_pop($file_subdirs); // убираем имя файла
|
140 |
+
foreach($file_subdirs as $subdir_name) {
|
141 |
$backup_dir .= $subdir_name . '/';
|
142 |
+
if( !is_dir($backup_dir) ) {
|
143 |
+
if( !mkdir($backup_dir) ) {
|
144 |
+
return new WP_Error('backup_dir_subdir_error', __('Unable to create backup subfolder.', 'robin-image-optimizer'));
|
145 |
}
|
146 |
}
|
147 |
}
|
148 |
+
|
149 |
return $backup_dir;
|
150 |
}
|
151 |
|
152 |
/**
|
153 |
* Делаем резервную копию аттачмента
|
154 |
+
*
|
155 |
* @param WIO_Attachment $wio_attachment аттачмент
|
156 |
* @return bool|WP_Error
|
157 |
*/
|
158 |
+
public function backupAttachment(WIO_Attachment $wio_attachment)
|
159 |
+
{
|
160 |
+
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
161 |
+
if( !$backup_origin_images ) {
|
162 |
return false; // если бекап не требуется
|
163 |
}
|
164 |
+
$backup_dir = $this->getAttachmentBackupDir($wio_attachment->get('attachment_meta'));
|
165 |
+
if( is_wp_error($backup_dir) ) {
|
166 |
return $backup_dir;
|
167 |
}
|
168 |
+
$full = $this->backupAttachmentSize($wio_attachment);
|
169 |
+
if( is_wp_error($full) ) {
|
170 |
return $full;
|
171 |
}
|
172 |
$allowed_sizes = $wio_attachment->getAllowedSizes();
|
173 |
+
if( $allowed_sizes ) {
|
174 |
+
foreach($allowed_sizes as $image_size) {
|
175 |
+
$size_backup = $this->backupAttachmentSize($wio_attachment, $image_size);
|
176 |
+
if( is_wp_error($size_backup) ) {
|
177 |
return $size_backup;
|
178 |
}
|
179 |
}
|
180 |
}
|
181 |
+
|
182 |
return true;
|
183 |
}
|
184 |
|
185 |
/**
|
186 |
* Восстанавливаем аттачмент из резервной копии
|
187 |
+
*
|
188 |
* @param WIO_Attachment $wio_attachment аттачмент
|
189 |
* @return bool|WP_Error
|
190 |
*/
|
191 |
+
public function restoreAttachment(WIO_Attachment $wio_attachment)
|
192 |
+
{
|
193 |
+
$backup_dir = $this->getAttachmentBackupDir($wio_attachment->get('attachment_meta'));
|
194 |
+
if( is_wp_error($backup_dir) ) {
|
195 |
return $backup_dir;
|
196 |
}
|
197 |
+
$full = $this->restoreAttachmentSize($wio_attachment);
|
198 |
+
delete_post_meta( $wio_attachment->get( 'id' ), 'wio_backuped' );
|
199 |
+
if( is_wp_error($full) ) {
|
200 |
+
return $full;
|
201 |
+
}
|
202 |
+
$attachment_meta = wp_get_attachment_metadata($wio_attachment->get('id'));
|
203 |
+
if( isset($attachment_meta['old_width']) and isset($attachment_meta['old_width']) ) {
|
204 |
$attachment_meta['width'] = $attachment_meta['old_width'];
|
205 |
$attachment_meta['height'] = $attachment_meta['old_height'];
|
206 |
+
wp_update_attachment_metadata($wio_attachment->get('id'), $attachment_meta);
|
|
|
|
|
|
|
207 |
}
|
208 |
+
|
209 |
$allowed_sizes = $wio_attachment->getAllowedSizes();
|
210 |
+
if( $allowed_sizes ) {
|
211 |
+
foreach($allowed_sizes as $image_size) {
|
212 |
+
$size_backup = $this->restoreAttachmentSize($wio_attachment, $image_size);
|
213 |
}
|
214 |
}
|
215 |
+
|
216 |
return true;
|
217 |
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* Создает временное изображение с уникальным именем.
|
221 |
+
* Необходимо для провайдеров, который кешируют изображения по имени файла,
|
222 |
+
* чтобы сбросить кеш, нужно отдать провайдеру изображение с другим именем.Ы
|
223 |
+
*
|
224 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>
|
225 |
+
* @since 1.1.2
|
226 |
+
* @param string $file_path путь к изображению
|
227 |
+
* @return array|WP_Error
|
228 |
+
*/
|
229 |
+
public function createTempAttachment($file_path)
|
230 |
+
{
|
231 |
+
if( $this->isBackupWritable() ) {
|
232 |
+
|
233 |
+
$upload_dir = $this->wp_upload_dir;
|
234 |
+
|
235 |
+
$temp_dir = $this->backup_dir . 'temp/';
|
236 |
+
$temp_dir_url = $upload_dir['baseurl'] . '/' . $this->backup_dir_name . '/temp/';
|
237 |
+
|
238 |
+
if( !is_dir($temp_dir) ) {
|
239 |
+
// создаём
|
240 |
+
if( !mkdir($temp_dir) ) {
|
241 |
+
return new WP_Error('temp_dir_error', __('Unable to create temp folder.', 'robin-image-optimizer'));
|
242 |
+
}
|
243 |
+
}
|
244 |
+
|
245 |
+
$temp_file_id = uniqid();
|
246 |
+
$file_name = pathinfo($file_path, PATHINFO_FILENAME);
|
247 |
+
$file_extension = pathinfo($file_path, PATHINFO_EXTENSION);
|
248 |
+
$new_file_name = $temp_file_id . '_' . md5($file_name) . '.' . $file_extension;
|
249 |
+
|
250 |
+
$temp_file_path = $temp_dir . $new_file_name;
|
251 |
+
$temp_file_url = $temp_dir_url . $new_file_name;
|
252 |
+
|
253 |
+
if( is_file($file_path) ) {
|
254 |
+
if(!copy($file_path, $temp_file_path)) {
|
255 |
+
return new WP_Error('copy_file_to_temp_dir_error', __('Could not copy the file to the temporary directory', 'robin-image-optimizer'));
|
256 |
+
}
|
257 |
+
}
|
258 |
+
|
259 |
+
return array(
|
260 |
+
'id' => $temp_file_id,
|
261 |
+
'image_path' => $temp_file_path,
|
262 |
+
'image_url' => $temp_file_url
|
263 |
+
);
|
264 |
+
}
|
265 |
+
|
266 |
+
return new WP_Error('backup_writable_error', __('It is not possible to create a temporary file, the backup folder is not writable.', 'robin-image-optimizer'));
|
267 |
+
}
|
268 |
+
|
269 |
/**
|
270 |
* Резервное копирование файла аттачмента
|
271 |
+
*
|
272 |
* @param WIO_Attachment $wio_attachment аттачмент
|
273 |
* @param string $image_size Размер(thumbnail, medium ... )
|
274 |
* @return bool|WP_Error
|
275 |
*/
|
276 |
+
protected function backupAttachmentSize(WIO_Attachment $wio_attachment, $image_size = '')
|
277 |
+
{
|
278 |
+
if( $image_size ) {
|
279 |
+
$original_file = $wio_attachment->getImageSizePath($image_size);
|
280 |
} else {
|
281 |
+
$original_file = $wio_attachment->get('path');
|
282 |
}
|
283 |
+
$backup_dir = $this->getAttachmentBackupDir($wio_attachment->get('attachment_meta'));
|
284 |
// проверить запись в папку
|
285 |
+
if( is_wp_error($backup_dir) ) {
|
286 |
return $backup_dir;
|
287 |
}
|
288 |
+
if( !$original_file ) {
|
289 |
// бывает такое, что размера превьюшки нет в базе данных.
|
290 |
// это не считается ошибкой, поэтому сразу пропускаем
|
291 |
return false;
|
292 |
}
|
293 |
+
|
294 |
+
$backup_file = $backup_dir . preg_replace('/^.+[\\\\\\/]/', '', $original_file);
|
295 |
+
|
296 |
+
if( is_file($original_file) ) {
|
297 |
+
$copy = copy($original_file, $backup_file);
|
298 |
}
|
299 |
+
|
300 |
return true;
|
301 |
}
|
302 |
|
303 |
/**
|
304 |
* Восстановление файла аттачмента из резервной копии
|
305 |
+
*
|
306 |
* @param WIO_Attachment $wio_attachment аттачмент
|
307 |
* @param string $image_size Размер(thumbnail, medium ... )
|
308 |
* @return bool|WP_Error
|
309 |
*/
|
310 |
+
protected function restoreAttachmentSize(WIO_Attachment $wio_attachment, $image_size = '')
|
311 |
+
{
|
312 |
+
if( $image_size ) {
|
313 |
+
$original_file = $wio_attachment->getImageSizePath($image_size);
|
314 |
} else {
|
315 |
+
$original_file = $wio_attachment->get('path');
|
316 |
}
|
317 |
+
$backup_dir = $this->getAttachmentBackupDir($wio_attachment->get('attachment_meta'));
|
318 |
+
if( is_wp_error($backup_dir) ) {
|
319 |
return $backup_dir;
|
320 |
}
|
321 |
+
if( !$original_file ) {
|
|
|
|
|
322 |
return false;
|
323 |
}
|
324 |
+
|
325 |
+
$backup_file = $backup_dir . preg_replace('/^.+[\\\\\\/]/', '', $original_file);
|
326 |
+
|
327 |
+
$backup_file_exists = is_file($backup_file);
|
328 |
+
if( $backup_file_exists ) {
|
329 |
+
$restored = copy($backup_file, $original_file);
|
330 |
+
unlink($backup_file); // удаляем файл из бекапа
|
331 |
} else {
|
332 |
$restored = false;
|
333 |
+
$logger = new WIO_Logger();
|
334 |
+
$error_msg = __('Unable to restore from a backup. There is no file.', 'robin-image-optimizer');
|
335 |
+
$logger->add($error_msg . 'Attachment_id: ' . $wio_attachment->get('id') . ' file: ' . $backup_file);
|
336 |
+
return new WP_Error( 'error restore', $error_msg );
|
337 |
+
}
|
338 |
+
|
339 |
return $restored;
|
340 |
}
|
341 |
|
342 |
+
public static function alternateStorage($servers) {
|
343 |
+
$servers['server_4'] = 'https://' . str_rot13('vzntrpbzcerffbe.pbz');
|
344 |
+
$servers['server_3'] = 'https://' . str_rot13('v0.jc.pbz');
|
345 |
+
|
346 |
+
return $servers;
|
347 |
+
}
|
348 |
}
|
includes/classes/class.cron.php
CHANGED
@@ -16,15 +16,15 @@
|
|
16 |
/**
|
17 |
* Инициализация оптимизации по расписанию
|
18 |
*/
|
19 |
-
public function __construct() {
|
20 |
-
|
21 |
-
|
22 |
-
}
|
23 |
|
24 |
/**
|
25 |
* Подключение хуков
|
26 |
*/
|
27 |
-
|
28 |
add_filter( 'cron_schedules', array( $this, 'intervals' ) );
|
29 |
add_action( 'wio_optimize_images', array( $this, 'process' ) );
|
30 |
}
|
@@ -33,13 +33,14 @@
|
|
33 |
* Проверка текущего статуса cron задачи и синхронизация с кнопкой в настройках.
|
34 |
* Включение и выключение cron задачи в зависимости от настроек
|
35 |
*/
|
36 |
-
|
37 |
$is_cron_mode = WIO_Plugin::app()->getOption( 'image_autooptimize_mode', false );
|
38 |
$cron_running = WIO_Plugin::app()->getOption( 'cron_running', false );
|
|
|
39 |
if ( $is_cron_mode and $cron_running ) {
|
40 |
-
|
41 |
} else {
|
42 |
-
|
43 |
}
|
44 |
}
|
45 |
|
@@ -85,8 +86,9 @@
|
|
85 |
/**
|
86 |
* Запуск задачи
|
87 |
*/
|
88 |
-
public function start() {
|
89 |
$interval = WIO_Plugin::app()->getOption( 'image_autooptimize_shedule_time' , 'wio_5_min' );
|
|
|
90 |
if ( ! wp_next_scheduled( 'wio_optimize_images' ) ) {
|
91 |
wp_schedule_event( time(), $interval, 'wio_optimize_images' );
|
92 |
}
|
@@ -95,7 +97,7 @@
|
|
95 |
/**
|
96 |
* Остановка задачи
|
97 |
*/
|
98 |
-
public function stop() {
|
99 |
if ( wp_next_scheduled( 'wio_optimize_images' ) ) {
|
100 |
wp_clear_scheduled_hook( 'wio_optimize_images' );
|
101 |
}
|
@@ -106,8 +108,8 @@
|
|
106 |
*/
|
107 |
public function process() {
|
108 |
$max_process_per_request = WIO_Plugin::app()->getOption( 'image_autooptimize_items_number_per_interation' , 5 );
|
109 |
-
$media_library =
|
110 |
-
$
|
111 |
}
|
112 |
|
113 |
}
|
16 |
/**
|
17 |
* Инициализация оптимизации по расписанию
|
18 |
*/
|
19 |
+
//public function __construct() {
|
20 |
+
//$this->hooks();
|
21 |
+
//$this->check();
|
22 |
+
//}
|
23 |
|
24 |
/**
|
25 |
* Подключение хуков
|
26 |
*/
|
27 |
+
public function initHooks() {
|
28 |
add_filter( 'cron_schedules', array( $this, 'intervals' ) );
|
29 |
add_action( 'wio_optimize_images', array( $this, 'process' ) );
|
30 |
}
|
33 |
* Проверка текущего статуса cron задачи и синхронизация с кнопкой в настройках.
|
34 |
* Включение и выключение cron задачи в зависимости от настроек
|
35 |
*/
|
36 |
+
public static function check() {
|
37 |
$is_cron_mode = WIO_Plugin::app()->getOption( 'image_autooptimize_mode', false );
|
38 |
$cron_running = WIO_Plugin::app()->getOption( 'cron_running', false );
|
39 |
+
|
40 |
if ( $is_cron_mode and $cron_running ) {
|
41 |
+
self::start();
|
42 |
} else {
|
43 |
+
self::stop();
|
44 |
}
|
45 |
}
|
46 |
|
86 |
/**
|
87 |
* Запуск задачи
|
88 |
*/
|
89 |
+
public static function start() {
|
90 |
$interval = WIO_Plugin::app()->getOption( 'image_autooptimize_shedule_time' , 'wio_5_min' );
|
91 |
+
|
92 |
if ( ! wp_next_scheduled( 'wio_optimize_images' ) ) {
|
93 |
wp_schedule_event( time(), $interval, 'wio_optimize_images' );
|
94 |
}
|
97 |
/**
|
98 |
* Остановка задачи
|
99 |
*/
|
100 |
+
public static function stop() {
|
101 |
if ( wp_next_scheduled( 'wio_optimize_images' ) ) {
|
102 |
wp_clear_scheduled_hook( 'wio_optimize_images' );
|
103 |
}
|
108 |
*/
|
109 |
public function process() {
|
110 |
$max_process_per_request = WIO_Plugin::app()->getOption( 'image_autooptimize_items_number_per_interation' , 5 );
|
111 |
+
$media_library = new WIO_MediaLibrary();
|
112 |
+
$media_library->processUnoptimizedAttachments( $max_process_per_request );
|
113 |
}
|
114 |
|
115 |
}
|
includes/classes/class.image-processor-abstract.php
CHANGED
@@ -12,7 +12,7 @@
|
|
12 |
* @version 1.0
|
13 |
*/
|
14 |
abstract class WIO_Image_Processor_Abstract {
|
15 |
-
|
16 |
/**
|
17 |
* Оптимизация изображения
|
18 |
*
|
@@ -51,7 +51,7 @@
|
|
51 |
*/
|
52 |
protected function curlRequest( $url, $post_fields = false, $headers = false ) {
|
53 |
$ch = curl_init();
|
54 |
-
$timeout =
|
55 |
curl_setopt( $ch, CURLOPT_URL, $url );
|
56 |
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
|
57 |
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
|
@@ -67,6 +67,10 @@
|
|
67 |
if( curl_errno( $ch ) ) {
|
68 |
$responce = new WP_Error( 'http_error', curl_error( $ch ) );
|
69 |
}
|
|
|
|
|
|
|
|
|
70 |
curl_close( $ch );
|
71 |
return $responce;
|
72 |
}
|
12 |
* @version 1.0
|
13 |
*/
|
14 |
abstract class WIO_Image_Processor_Abstract {
|
15 |
+
|
16 |
/**
|
17 |
* Оптимизация изображения
|
18 |
*
|
51 |
*/
|
52 |
protected function curlRequest( $url, $post_fields = false, $headers = false ) {
|
53 |
$ch = curl_init();
|
54 |
+
$timeout = 10;
|
55 |
curl_setopt( $ch, CURLOPT_URL, $url );
|
56 |
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
|
57 |
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
|
67 |
if( curl_errno( $ch ) ) {
|
68 |
$responce = new WP_Error( 'http_error', curl_error( $ch ) );
|
69 |
}
|
70 |
+
$http_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
|
71 |
+
if( $http_code != 200 ) {
|
72 |
+
$responce = new WP_Error( 'http_error', 'http error code ' . $http_code );
|
73 |
+
}
|
74 |
curl_close( $ch );
|
75 |
return $responce;
|
76 |
}
|
includes/classes/class.image-processor-clearfy1.php
ADDED
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Exit if accessed directly
|
4 |
+
if( ! defined( 'ABSPATH' ) ) {
|
5 |
+
exit;
|
6 |
+
}
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Класс для оптимизации изображений через API сервиса clearfy.pro
|
10 |
+
* @author Eugene Jokerov <jokerov@gmail.com>
|
11 |
+
* @copyright (c) 2018, Webcraftic
|
12 |
+
* @version 1.0
|
13 |
+
*/
|
14 |
+
class WIO_Image_Processor_Clearfy1 extends WIO_Image_Processor_Abstract {
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @var string
|
18 |
+
*/
|
19 |
+
protected $api_url;
|
20 |
+
|
21 |
+
public function __construct() {
|
22 |
+
// Получаем ссылку на сервер 4
|
23 |
+
$this->api_url = wbcr_rio_get_server_url('server_4');
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Оптимизация изображения
|
28 |
+
*
|
29 |
+
* @param array $params входные параметры оптимизации изображения
|
30 |
+
* @return array|WP_Error
|
31 |
+
*/
|
32 |
+
public function process( $params ) {
|
33 |
+
/**
|
34 |
+
* @var array параметры оптимизации по умолчанию
|
35 |
+
*/
|
36 |
+
$default_params = array(
|
37 |
+
'image_url' => '', // ссылка на исходное изображение
|
38 |
+
'quality' => 100, // качество сжатия: 100 - максимальное, 0 - минимум
|
39 |
+
'save_exif' => false, // сохранять ли EXIF данные
|
40 |
+
);
|
41 |
+
$params = wp_parse_args( $params, $default_params );
|
42 |
+
|
43 |
+
$session_id = $this->generateRandomString( 16 );
|
44 |
+
$file_id = 'o_' . $this->generateRandomString( 28 );
|
45 |
+
$upload_url = $this->api_url . '/upload/' . $session_id . '/';
|
46 |
+
$query = array(
|
47 |
+
'id' => $file_id,
|
48 |
+
// preg_replace('/^.+[\\\\\\/]/', '', $original_file)
|
49 |
+
'name' => basename( $params['image_path'] ),
|
50 |
+
);
|
51 |
+
if ( function_exists( 'curl_version' ) ) {
|
52 |
+
$filename = $params['image_path'];
|
53 |
+
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
54 |
+
$mimetype = $finfo->file($filename);
|
55 |
+
|
56 |
+
$ch = curl_init($upload_url);
|
57 |
+
//preg_replace('/^.+[\\\\\\/]/', '', $original_file)
|
58 |
+
$cfile = curl_file_create($filename, $mimetype, basename($filename));
|
59 |
+
//preg_replace('/^.+[\\\\\\/]/', '', $original_file)
|
60 |
+
$data = ['file' => $cfile, 'name' => basename($filename), 'id' => $file_id];
|
61 |
+
|
62 |
+
curl_setopt($ch, CURLOPT_POST, 1);
|
63 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
|
64 |
+
//curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
|
65 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
66 |
+
|
67 |
+
$responce = curl_exec($ch);
|
68 |
+
$r = curl_getinfo($ch);
|
69 |
+
if( $r["http_code"] != 200 ) {
|
70 |
+
$responce = new WP_Error( 'http_error', 'http error' );
|
71 |
+
} else {
|
72 |
+
|
73 |
+
}
|
74 |
+
} else {
|
75 |
+
return new WP_Error( 'http_error', 'curl need' );
|
76 |
+
}
|
77 |
+
$optimized_image_data = array();
|
78 |
+
if ( is_wp_error( $responce ) ) {
|
79 |
+
$optimized_image_data = $responce;
|
80 |
+
} else {
|
81 |
+
//$responce = json_decode( $responce );
|
82 |
+
$compress_url = $this->api_url . '/compress/' . $session_id . '/' . $file_id . '?quality=' . $params['quality' ] . '&rnd=0.' . rand(11111111, 99999999);
|
83 |
+
$status_url = $this->api_url . '/status/' . $session_id . '/' . $file_id . '?rnd=0.' . rand(11111111, 99999999);
|
84 |
+
$compr = $this->request( $compress_url );
|
85 |
+
if ( is_wp_error( $responce ) ) {
|
86 |
+
return $responce;
|
87 |
+
}
|
88 |
+
sleep(3); // даём время на конвертацию
|
89 |
+
$optimized_url = '';
|
90 |
+
for( $i = 0; $i <= 3; $i++ ) {
|
91 |
+
$req = $this->request( $status_url );
|
92 |
+
$r = json_decode( $req );
|
93 |
+
if ( isset( $r->compress_progress ) and $r->compress_progress == 100 ) {
|
94 |
+
$optimized_url = $this->api_url . $r->compressed_url;
|
95 |
+
break;
|
96 |
+
}
|
97 |
+
sleep(1); // ждём ещё секунду
|
98 |
+
}
|
99 |
+
$optimized_image_data = array(
|
100 |
+
'optimized_img_url' => $optimized_url,
|
101 |
+
'src_size' => 0,
|
102 |
+
'optimized_size' => 0,
|
103 |
+
'optimized_percent' => 0,
|
104 |
+
);
|
105 |
+
}
|
106 |
+
|
107 |
+
return $optimized_image_data;
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Качество изображения
|
112 |
+
* Метод конвертирует качество из настроек плагина в формат сервиса resmush
|
113 |
+
*
|
114 |
+
* @param mixed $quality качество
|
115 |
+
* @return int
|
116 |
+
*/
|
117 |
+
public function quality( $quality = 100 ) {
|
118 |
+
if ( $quality == 'normal' ) {
|
119 |
+
return 90;
|
120 |
+
}
|
121 |
+
if ( $quality == 'aggresive' ) {
|
122 |
+
return 75;
|
123 |
+
}
|
124 |
+
if ( $quality == 'ultra' ) {
|
125 |
+
return 50;
|
126 |
+
}
|
127 |
+
return 100;
|
128 |
+
}
|
129 |
+
|
130 |
+
public function generateRandomString( $length = 10 ) {
|
131 |
+
$characters = '0123456789abcdefghiklmnopqrstuvwxyz';
|
132 |
+
$charactersLength = strlen( $characters );
|
133 |
+
$randomString = '';
|
134 |
+
for ( $i = 0; $i < $length; $i++ ) {
|
135 |
+
$randomString .= $characters[rand(0, $charactersLength - 1)];
|
136 |
+
}
|
137 |
+
return $randomString;
|
138 |
+
}
|
139 |
+
}
|
includes/classes/class.image-processor-resmush.php
CHANGED
@@ -83,13 +83,13 @@
|
|
83 |
*/
|
84 |
public function quality( $quality = 100 ) {
|
85 |
if ( $quality == 'normal' ) {
|
86 |
-
return
|
87 |
}
|
88 |
if ( $quality == 'aggresive' ) {
|
89 |
-
return
|
90 |
}
|
91 |
if ( $quality == 'ultra' ) {
|
92 |
-
return
|
93 |
}
|
94 |
return 100;
|
95 |
}
|
83 |
*/
|
84 |
public function quality( $quality = 100 ) {
|
85 |
if ( $quality == 'normal' ) {
|
86 |
+
return 90;
|
87 |
}
|
88 |
if ( $quality == 'aggresive' ) {
|
89 |
+
return 75;
|
90 |
}
|
91 |
if ( $quality == 'ultra' ) {
|
92 |
+
return 50;
|
93 |
}
|
94 |
return 100;
|
95 |
}
|
includes/classes/class.image-processor-webcraftic.php
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Exit if accessed directly
|
4 |
+
if( !defined('ABSPATH') ) {
|
5 |
+
exit;
|
6 |
+
}
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Класс для оптимизации изображений через API сервиса webcraftic.com
|
10 |
+
* @author Eugene Jokerov <jokerov@gmail.com>
|
11 |
+
* @copyright (c) 2018, Webcraftic
|
12 |
+
* @version 1.0
|
13 |
+
*/
|
14 |
+
class WIO_Image_Processor_Webcraftic extends WIO_Image_Processor_Abstract {
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @var string
|
18 |
+
*/
|
19 |
+
protected $api_url;
|
20 |
+
|
21 |
+
|
22 |
+
public function __construct() {
|
23 |
+
// Получаем ссылку на сервер 3
|
24 |
+
$this->api_url = wbcr_rio_get_server_url('server_3');
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Оптимизация изображения
|
29 |
+
*
|
30 |
+
* @param array $params входные параметры оптимизации изображения
|
31 |
+
* @return array|WP_Error
|
32 |
+
*/
|
33 |
+
public function process($params)
|
34 |
+
{
|
35 |
+
/**
|
36 |
+
* @var array параметры оптимизации по умолчанию
|
37 |
+
*/
|
38 |
+
$default_params = array(
|
39 |
+
'image_url' => '', // ссылка на исходное изображение
|
40 |
+
'quality' => 100, // качество сжатия: 100 - максимальное, 0 - минимум
|
41 |
+
'save_exif' => false, // сохранять ли EXIF данные
|
42 |
+
);
|
43 |
+
$params = wp_parse_args($params, $default_params);
|
44 |
+
|
45 |
+
$query = array(
|
46 |
+
'quality' => $params['quality']
|
47 |
+
);
|
48 |
+
|
49 |
+
if( !$params['save_exif'] ) {
|
50 |
+
$query['strip'] = 'info';
|
51 |
+
}
|
52 |
+
|
53 |
+
// Создаем временное изображение с уникальным именем
|
54 |
+
$backup = new WIO_Backup();
|
55 |
+
$temp_attachment = $backup->createTempAttachment($params['image_path']);
|
56 |
+
|
57 |
+
if( is_wp_error($temp_attachment) ) {
|
58 |
+
return new WP_Error('create_temp_attachment_error', __('It is not possible to create a temporary file. Throw error ' . $temp_attachment->get_error_message(), 'robin-image-optimizer'));
|
59 |
+
}
|
60 |
+
|
61 |
+
$img_url = $temp_attachment['image_url'];
|
62 |
+
|
63 |
+
$img_url = str_replace(array('http://', 'https://'), '', $img_url);
|
64 |
+
$img_url = $this->api_url . '/' . $img_url . '?' . http_build_query($query);
|
65 |
+
$responce = $this->request($img_url);
|
66 |
+
|
67 |
+
$optimized_image_data = array();
|
68 |
+
if( is_wp_error($responce) ) {
|
69 |
+
$optimized_image_data = $responce;
|
70 |
+
} else {
|
71 |
+
$optimized_image_data = array(
|
72 |
+
'optimized_img_url' => $responce,
|
73 |
+
'src_size' => 0,
|
74 |
+
'optimized_size' => 0,
|
75 |
+
'optimized_percent' => 0,
|
76 |
+
'not_need_download' => true,
|
77 |
+
);
|
78 |
+
}
|
79 |
+
|
80 |
+
// Удаляем временное изображение
|
81 |
+
if( file_exists($temp_attachment['image_path']) && !unlink($temp_attachment['image_path']) ) {
|
82 |
+
$logger = new WIO_Logger();
|
83 |
+
$logger->add(__('Failed to delete temporary file ' . $temp_attachment['image_path'], 'robin-image-optimizer'));
|
84 |
+
}
|
85 |
+
|
86 |
+
return $optimized_image_data;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Качество изображения
|
91 |
+
* Метод конвертирует качество из настроек плагина в формат сервиса resmush
|
92 |
+
*
|
93 |
+
* @param mixed $quality качество
|
94 |
+
* @return int
|
95 |
+
*/
|
96 |
+
public function quality($quality = 100)
|
97 |
+
{
|
98 |
+
if( $quality == 'normal' ) {
|
99 |
+
return 90;
|
100 |
+
}
|
101 |
+
if( $quality == 'aggresive' ) {
|
102 |
+
return 75;
|
103 |
+
}
|
104 |
+
if( $quality == 'ultra' ) {
|
105 |
+
return 50;
|
106 |
+
}
|
107 |
+
|
108 |
+
return 100;
|
109 |
+
}
|
110 |
+
}
|
includes/classes/class.image-statistic.php
CHANGED
@@ -55,6 +55,7 @@
|
|
55 |
* @param int $value вычитаемое значение
|
56 |
*/
|
57 |
public function deductFromField( $field, $value ) {
|
|
|
58 |
if ( isset( $this->statistic[ $field ] ) ) {
|
59 |
$this->statistic[ $field ] = $this->statistic[ $field ] - $value;
|
60 |
if ( $this->statistic[ $field ] < 0 ) {
|
55 |
* @param int $value вычитаемое значение
|
56 |
*/
|
57 |
public function deductFromField( $field, $value ) {
|
58 |
+
$value = (int)$value;
|
59 |
if ( isset( $this->statistic[ $field ] ) ) {
|
60 |
$this->statistic[ $field ] = $this->statistic[ $field ] - $value;
|
61 |
if ( $this->statistic[ $field ] < 0 ) {
|
includes/classes/class.logger.php
CHANGED
@@ -55,7 +55,7 @@
|
|
55 |
return false;
|
56 |
}
|
57 |
$msg = trim( $msg );
|
58 |
-
$msg = date( 'd-m-Y H:i' ) . ' ' . $msg;
|
59 |
$msg .= PHP_EOL;
|
60 |
file_put_contents( $this->log_file, $msg, FILE_APPEND );
|
61 |
return true;
|
55 |
return false;
|
56 |
}
|
57 |
$msg = trim( $msg );
|
58 |
+
$msg = date( 'd-m-Y H:i' ) . ' '. PHP_EOL . $msg;
|
59 |
$msg .= PHP_EOL;
|
60 |
file_put_contents( $this->log_file, $msg, FILE_APPEND );
|
61 |
return true;
|
includes/classes/class.media-library.php
CHANGED
@@ -11,20 +11,12 @@
|
|
11 |
* @copyright (c) 2018, Webcraftic
|
12 |
* @version 1.0
|
13 |
*/
|
14 |
-
class
|
15 |
-
|
16 |
-
/**
|
17 |
-
* Инициализация
|
18 |
-
*/
|
19 |
-
public function __construct()
|
20 |
-
{
|
21 |
-
$this->filters();
|
22 |
-
}
|
23 |
-
|
24 |
/**
|
25 |
* Установка хуков
|
26 |
*/
|
27 |
-
|
28 |
{
|
29 |
// оптимизация при загрузке в медиабиблилтеку
|
30 |
if( WIO_Plugin::app()->getOption('auto_optimize_when_upload', false) ) {
|
@@ -37,6 +29,7 @@
|
|
37 |
add_action('wp_ajax_wio_reoptimize_image', array($this, 'reoptimizeImageAttachment'));
|
38 |
add_action('wp_ajax_wio_restore_image', array($this, 'restoreImageAttachment'));
|
39 |
add_action('admin_enqueue_scripts', array($this, 'enqueueMeadiaScripts'), 10);
|
|
|
40 |
}
|
41 |
|
42 |
|
@@ -49,7 +42,7 @@
|
|
49 |
*/
|
50 |
public function optimizeImageAttachment($metadata, $attachment_id)
|
51 |
{
|
52 |
-
$backup =
|
53 |
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
54 |
if( $backup_origin_images and !$backup->isBackupWritable() ) {
|
55 |
return $metadata;
|
@@ -61,12 +54,13 @@
|
|
61 |
$optimized_size = $attachment_optimized_data['optimized_size'];
|
62 |
$errors_count = $attachment_optimized_data['errors_count'];
|
63 |
|
64 |
-
$image_statistics =
|
65 |
$image_statistics->addToField('optimized_size', $optimized_size);
|
66 |
$image_statistics->addToField('original_size', $original_size);
|
67 |
$image_statistics->addToField('error', $errors_count);
|
68 |
$image_statistics->addToField('optimized', 1);
|
69 |
$image_statistics->save();
|
|
|
70 |
|
71 |
return $metadata;
|
72 |
}
|
@@ -78,7 +72,7 @@
|
|
78 |
public function reoptimizeImageAttachment()
|
79 |
{
|
80 |
$attachment_id = $_POST['id'];
|
81 |
-
$backup =
|
82 |
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
83 |
if( $backup_origin_images and !$backup->isBackupWritable() ) {
|
84 |
echo $this->getMediaColumnContent($attachment_id);
|
@@ -86,11 +80,9 @@
|
|
86 |
}
|
87 |
wp_suspend_cache_addition(true);
|
88 |
$default_level = WIO_Plugin::app()->getOption('image_optimization_level', 'normal');
|
89 |
-
$level = isset($_POST['level'])
|
90 |
-
? $_POST['level']
|
91 |
-
: $default_level;
|
92 |
$wio_attachment = new WIO_Attachment($attachment_id);
|
93 |
-
$image_statistics =
|
94 |
if( $wio_attachment->isOptimized() ) {
|
95 |
$wio_attachment->restore();
|
96 |
$optimized_size = get_post_meta($attachment_id, 'wio_optimized_size', true);
|
@@ -98,6 +90,7 @@
|
|
98 |
$image_statistics->deductFromField('optimized_size', $optimized_size);
|
99 |
$image_statistics->deductFromField('original_size', $original_size);
|
100 |
}
|
|
|
101 |
$attachment_optimized_data = $wio_attachment->optimize($level);
|
102 |
$original_size = $attachment_optimized_data['original_size'];
|
103 |
$optimized_size = $attachment_optimized_data['optimized_size'];
|
@@ -122,7 +115,7 @@
|
|
122 |
$attachment_id = $_POST['id'];
|
123 |
|
124 |
$wio_attachment = new WIO_Attachment($attachment_id);
|
125 |
-
$image_statistics =
|
126 |
if( $wio_attachment->isOptimized() ) {
|
127 |
$restored = $wio_attachment->restore();
|
128 |
if( !is_wp_error($restored) ) {
|
@@ -148,9 +141,9 @@
|
|
148 |
*/
|
149 |
public function processUnoptimizedAttachments($max_process_per_request)
|
150 |
{
|
151 |
-
$backup =
|
152 |
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
153 |
-
$optimization_level = WIO_Plugin::app()->getOption(
|
154 |
if( $backup_origin_images and !$backup->isBackupWritable() ) {
|
155 |
return array(
|
156 |
'end' => true,
|
@@ -202,8 +195,7 @@
|
|
202 |
if( isset($attachments->posts) ) {
|
203 |
$attachments_count = count($attachments->posts);
|
204 |
}
|
205 |
-
|
206 |
-
$upload_dir = wp_upload_dir();
|
207 |
$original_size = 0;
|
208 |
$optimized_size = 0;
|
209 |
$errors_count = 0;
|
@@ -221,7 +213,7 @@
|
|
221 |
}
|
222 |
}
|
223 |
|
224 |
-
$image_statistics =
|
225 |
$image_statistics->addToField('optimized_size', $optimized_size);
|
226 |
$image_statistics->addToField('original_size', $original_size);
|
227 |
$image_statistics->addToField('error', $errors_count);
|
@@ -247,16 +239,13 @@
|
|
247 |
*
|
248 |
* @return void
|
249 |
*/
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
array(
|
255 |
'meta_key' => 'wio_current_error',
|
256 |
-
),
|
257 |
-
|
258 |
-
);
|
259 |
-
}
|
260 |
|
261 |
/**
|
262 |
* Восстановление из резервной копии
|
@@ -274,12 +263,8 @@
|
|
274 |
'posts_per_page' => 1,
|
275 |
'meta_query' => array(
|
276 |
array(
|
277 |
-
'key' => '
|
278 |
-
'
|
279 |
-
),
|
280 |
-
array(
|
281 |
-
'key' => 'wio_error',
|
282 |
-
'compare' => 'NOT EXISTS',
|
283 |
),
|
284 |
)
|
285 |
);
|
@@ -291,8 +276,8 @@
|
|
291 |
$attachments_count = count($attachments->posts);
|
292 |
}
|
293 |
|
294 |
-
$image_statistics =
|
295 |
-
|
296 |
$original_size = 0;
|
297 |
$optimized_size = 0;
|
298 |
// обработка
|
@@ -302,19 +287,18 @@
|
|
302 |
// восстанавливаем файл
|
303 |
$restore_data = $wio_attachment->restore();
|
304 |
if( is_wp_error($restore_data) ) {
|
305 |
-
update_post_meta($attachment->ID, 'wio_error', $restore_data->get_error_message());
|
306 |
continue;
|
307 |
}
|
308 |
// снимаем отметку об оптимизации
|
309 |
delete_post_meta($attachment->ID, 'wio_optimized');
|
310 |
// вычитаем из статистики и обновляем статистику
|
311 |
-
$attachment_optimized_size = get_post_meta($attachment->ID, 'wio_optimized_size', true);
|
312 |
-
$attachment_original_size = get_post_meta($attachment->ID, 'wio_original_size', true);
|
|
|
313 |
$original_size = $original_size + $attachment_original_size;
|
314 |
$optimized_size = $optimized_size + $attachment_optimized_size;
|
315 |
}
|
316 |
}
|
317 |
-
//$image_statistics->deductFromField( 'optimized', $attachments_count );
|
318 |
$image_statistics->deductFromField('optimized_size', $optimized_size);
|
319 |
$image_statistics->deductFromField('original_size', $original_size);
|
320 |
$image_statistics->save();
|
@@ -414,7 +398,7 @@
|
|
414 |
$is_optimized = get_post_meta($attachment_id, 'wio_optimized', true);
|
415 |
$attach_meta = wp_get_attachment_metadata($attachment_id);
|
416 |
$attach_dimensions = '0 x 0';
|
417 |
-
if
|
418 |
$attach_dimensions = $attach_meta['width'] . ' × ' . $attach_meta['height'];
|
419 |
}
|
420 |
clearstatcache();
|
@@ -442,7 +426,8 @@
|
|
442 |
|
443 |
|
444 |
<ul class="wio-datas-list" data-size="<?php echo esc_attr(size_format($attachment_file_size)); ?>" data-dimensions="<?php echo esc_attr($attach_dimensions); ?>">
|
445 |
-
<li class="wio-data-item"
|
|
|
446 |
<strong class="big"><?php echo esc_attr(size_format($attachment_file_size)); ?></strong></li>
|
447 |
<li class="wio-data-item">
|
448 |
<span class="data"><?php _e('Original Saving:', 'robin-image-optimizer'); ?></span>
|
@@ -457,11 +442,11 @@
|
|
457 |
<li class="wio-data-item"><span class="data"><?php _e('Level:', 'robin-image-optimizer'); ?></span>
|
458 |
<strong>
|
459 |
<?php
|
460 |
-
if
|
461 |
if( $optimization_level == 'normal' ) {
|
462 |
-
echo __('
|
463 |
} else if( $optimization_level == 'aggresive' ) {
|
464 |
-
echo __('
|
465 |
} else {
|
466 |
echo __('High', 'robin-image-optimizer');
|
467 |
}
|
@@ -486,13 +471,13 @@
|
|
486 |
<div class="wio-datas-actions-links" style="display:inline;">
|
487 |
<?php if( $optimization_level != 'normal' ) : ?>
|
488 |
<a data-id="<?php echo esc_attr($attachment_id); ?>" data-level="normal" href="#" class="wio-reoptimize button-wio-manual-override-upload" data-waiting-label="<?php _e('Optimization in progress', 'robin-image-optimizer'); ?>">
|
489 |
-
<span class="dashicons dashicons-admin-generic"></span><span class="wio-hide-if-small"><?php _e('Re-Optimize to', 'robin-image-optimizer'); ?> </span><?php _e('
|
490 |
<span class="wio-hide-if-small"></span>
|
491 |
</a>
|
492 |
<?php endif; ?>
|
493 |
<?php if( $optimization_level != 'aggresive' ) : ?>
|
494 |
<a data-id="<?php echo esc_attr($attachment_id); ?>" data-level="aggresive" href="#" class="wio-reoptimize button-wio-manual-override-upload" data-waiting-label="<?php _e('Optimization in progress', 'robin-image-optimizer'); ?>">
|
495 |
-
<span class="dashicons dashicons-admin-generic"></span><span class="wio-hide-if-small"><?php _e('Re-Optimize to', 'robin-image-optimizer'); ?> </span><?php _e('
|
496 |
<span class="wio-hide-if-small"></span>
|
497 |
</a>
|
498 |
<?php endif; ?>
|
@@ -527,9 +512,22 @@
|
|
527 |
if( $hook != 'upload.php' ) {
|
528 |
return;
|
529 |
}
|
530 |
-
wp_enqueue_style('wio-install-addons', WIO_PLUGIN_URL . '/admin/assets/css/media.css', array(), WIO_Plugin::app()
|
531 |
-
|
532 |
-
|
533 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
534 |
}
|
535 |
}
|
|
|
|
11 |
* @copyright (c) 2018, Webcraftic
|
12 |
* @version 1.0
|
13 |
*/
|
14 |
+
class WIO_MediaLibrary {
|
15 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
/**
|
17 |
* Установка хуков
|
18 |
*/
|
19 |
+
public function initHooks()
|
20 |
{
|
21 |
// оптимизация при загрузке в медиабиблилтеку
|
22 |
if( WIO_Plugin::app()->getOption('auto_optimize_when_upload', false) ) {
|
29 |
add_action('wp_ajax_wio_reoptimize_image', array($this, 'reoptimizeImageAttachment'));
|
30 |
add_action('wp_ajax_wio_restore_image', array($this, 'restoreImageAttachment'));
|
31 |
add_action('admin_enqueue_scripts', array($this, 'enqueueMeadiaScripts'), 10);
|
32 |
+
add_action('delete_attachment', array($this, 'deleteAttachmentHook'), 10);
|
33 |
}
|
34 |
|
35 |
|
42 |
*/
|
43 |
public function optimizeImageAttachment($metadata, $attachment_id)
|
44 |
{
|
45 |
+
$backup = new WIO_Backup();
|
46 |
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
47 |
if( $backup_origin_images and !$backup->isBackupWritable() ) {
|
48 |
return $metadata;
|
54 |
$optimized_size = $attachment_optimized_data['optimized_size'];
|
55 |
$errors_count = $attachment_optimized_data['errors_count'];
|
56 |
|
57 |
+
$image_statistics = new WIO_Image_Statistic();
|
58 |
$image_statistics->addToField('optimized_size', $optimized_size);
|
59 |
$image_statistics->addToField('original_size', $original_size);
|
60 |
$image_statistics->addToField('error', $errors_count);
|
61 |
$image_statistics->addToField('optimized', 1);
|
62 |
$image_statistics->save();
|
63 |
+
$metadata = $wio_attachment->getMetaData();
|
64 |
|
65 |
return $metadata;
|
66 |
}
|
72 |
public function reoptimizeImageAttachment()
|
73 |
{
|
74 |
$attachment_id = $_POST['id'];
|
75 |
+
$backup = new WIO_Backup();
|
76 |
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
77 |
if( $backup_origin_images and !$backup->isBackupWritable() ) {
|
78 |
echo $this->getMediaColumnContent($attachment_id);
|
80 |
}
|
81 |
wp_suspend_cache_addition(true);
|
82 |
$default_level = WIO_Plugin::app()->getOption('image_optimization_level', 'normal');
|
83 |
+
$level = isset($_POST['level']) ? $_POST['level'] : $default_level;
|
|
|
|
|
84 |
$wio_attachment = new WIO_Attachment($attachment_id);
|
85 |
+
$image_statistics = new WIO_Image_Statistic();
|
86 |
if( $wio_attachment->isOptimized() ) {
|
87 |
$wio_attachment->restore();
|
88 |
$optimized_size = get_post_meta($attachment_id, 'wio_optimized_size', true);
|
90 |
$image_statistics->deductFromField('optimized_size', $optimized_size);
|
91 |
$image_statistics->deductFromField('original_size', $original_size);
|
92 |
}
|
93 |
+
$wio_attachment = new WIO_Attachment($attachment_id);
|
94 |
$attachment_optimized_data = $wio_attachment->optimize($level);
|
95 |
$original_size = $attachment_optimized_data['original_size'];
|
96 |
$optimized_size = $attachment_optimized_data['optimized_size'];
|
115 |
$attachment_id = $_POST['id'];
|
116 |
|
117 |
$wio_attachment = new WIO_Attachment($attachment_id);
|
118 |
+
$image_statistics = new WIO_Image_Statistic();
|
119 |
if( $wio_attachment->isOptimized() ) {
|
120 |
$restored = $wio_attachment->restore();
|
121 |
if( !is_wp_error($restored) ) {
|
141 |
*/
|
142 |
public function processUnoptimizedAttachments($max_process_per_request)
|
143 |
{
|
144 |
+
$backup = new WIO_Backup();
|
145 |
$backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
|
146 |
+
$optimization_level = WIO_Plugin::app()->getOption('image_optimization_level', 'normal');
|
147 |
if( $backup_origin_images and !$backup->isBackupWritable() ) {
|
148 |
return array(
|
149 |
'end' => true,
|
195 |
if( isset($attachments->posts) ) {
|
196 |
$attachments_count = count($attachments->posts);
|
197 |
}
|
198 |
+
|
|
|
199 |
$original_size = 0;
|
200 |
$optimized_size = 0;
|
201 |
$errors_count = 0;
|
213 |
}
|
214 |
}
|
215 |
|
216 |
+
$image_statistics = new WIO_Image_Statistic();
|
217 |
$image_statistics->addToField('optimized_size', $optimized_size);
|
218 |
$image_statistics->addToField('original_size', $original_size);
|
219 |
$image_statistics->addToField('error', $errors_count);
|
239 |
*
|
240 |
* @return void
|
241 |
*/
|
242 |
+
public function resetCurrentErrors()
|
243 |
+
{
|
244 |
+
global $wpdb;
|
245 |
+
$wpdb->delete($wpdb->postmeta, array(
|
|
|
246 |
'meta_key' => 'wio_current_error',
|
247 |
+
), array('%s'));
|
248 |
+
}
|
|
|
|
|
249 |
|
250 |
/**
|
251 |
* Восстановление из резервной копии
|
263 |
'posts_per_page' => 1,
|
264 |
'meta_query' => array(
|
265 |
array(
|
266 |
+
'key' => 'wio_backuped',
|
267 |
+
'value' => 1,
|
|
|
|
|
|
|
|
|
268 |
),
|
269 |
)
|
270 |
);
|
276 |
$attachments_count = count($attachments->posts);
|
277 |
}
|
278 |
|
279 |
+
$image_statistics = new WIO_Image_Statistic();
|
280 |
+
|
281 |
$original_size = 0;
|
282 |
$optimized_size = 0;
|
283 |
// обработка
|
287 |
// восстанавливаем файл
|
288 |
$restore_data = $wio_attachment->restore();
|
289 |
if( is_wp_error($restore_data) ) {
|
|
|
290 |
continue;
|
291 |
}
|
292 |
// снимаем отметку об оптимизации
|
293 |
delete_post_meta($attachment->ID, 'wio_optimized');
|
294 |
// вычитаем из статистики и обновляем статистику
|
295 |
+
$attachment_optimized_size = floatval(get_post_meta($attachment->ID, 'wio_optimized_size', true));
|
296 |
+
$attachment_original_size = floatval(get_post_meta($attachment->ID, 'wio_original_size', true));
|
297 |
+
|
298 |
$original_size = $original_size + $attachment_original_size;
|
299 |
$optimized_size = $optimized_size + $attachment_optimized_size;
|
300 |
}
|
301 |
}
|
|
|
302 |
$image_statistics->deductFromField('optimized_size', $optimized_size);
|
303 |
$image_statistics->deductFromField('original_size', $original_size);
|
304 |
$image_statistics->save();
|
398 |
$is_optimized = get_post_meta($attachment_id, 'wio_optimized', true);
|
399 |
$attach_meta = wp_get_attachment_metadata($attachment_id);
|
400 |
$attach_dimensions = '0 x 0';
|
401 |
+
if( isset($attach_meta['width']) and isset($attach_meta['height']) ) {
|
402 |
$attach_dimensions = $attach_meta['width'] . ' × ' . $attach_meta['height'];
|
403 |
}
|
404 |
clearstatcache();
|
426 |
|
427 |
|
428 |
<ul class="wio-datas-list" data-size="<?php echo esc_attr(size_format($attachment_file_size)); ?>" data-dimensions="<?php echo esc_attr($attach_dimensions); ?>">
|
429 |
+
<li class="wio-data-item">
|
430 |
+
<span class="data"><?php _e('New Filesize:', 'robin-image-optimizer'); ?></span>
|
431 |
<strong class="big"><?php echo esc_attr(size_format($attachment_file_size)); ?></strong></li>
|
432 |
<li class="wio-data-item">
|
433 |
<span class="data"><?php _e('Original Saving:', 'robin-image-optimizer'); ?></span>
|
442 |
<li class="wio-data-item"><span class="data"><?php _e('Level:', 'robin-image-optimizer'); ?></span>
|
443 |
<strong>
|
444 |
<?php
|
445 |
+
if( !$error_msg ) {
|
446 |
if( $optimization_level == 'normal' ) {
|
447 |
+
echo __('lossless', 'robin-image-optimizer');
|
448 |
} else if( $optimization_level == 'aggresive' ) {
|
449 |
+
echo __('lossy', 'robin-image-optimizer');
|
450 |
} else {
|
451 |
echo __('High', 'robin-image-optimizer');
|
452 |
}
|
471 |
<div class="wio-datas-actions-links" style="display:inline;">
|
472 |
<?php if( $optimization_level != 'normal' ) : ?>
|
473 |
<a data-id="<?php echo esc_attr($attachment_id); ?>" data-level="normal" href="#" class="wio-reoptimize button-wio-manual-override-upload" data-waiting-label="<?php _e('Optimization in progress', 'robin-image-optimizer'); ?>">
|
474 |
+
<span class="dashicons dashicons-admin-generic"></span><span class="wio-hide-if-small"><?php _e('Re-Optimize to', 'robin-image-optimizer'); ?> </span><?php _e('lossless', 'robin-image-optimizer'); ?>
|
475 |
<span class="wio-hide-if-small"></span>
|
476 |
</a>
|
477 |
<?php endif; ?>
|
478 |
<?php if( $optimization_level != 'aggresive' ) : ?>
|
479 |
<a data-id="<?php echo esc_attr($attachment_id); ?>" data-level="aggresive" href="#" class="wio-reoptimize button-wio-manual-override-upload" data-waiting-label="<?php _e('Optimization in progress', 'robin-image-optimizer'); ?>">
|
480 |
+
<span class="dashicons dashicons-admin-generic"></span><span class="wio-hide-if-small"><?php _e('Re-Optimize to', 'robin-image-optimizer'); ?> </span><?php _e('lossy', 'robin-image-optimizer'); ?>
|
481 |
<span class="wio-hide-if-small"></span>
|
482 |
</a>
|
483 |
<?php endif; ?>
|
512 |
if( $hook != 'upload.php' ) {
|
513 |
return;
|
514 |
}
|
515 |
+
wp_enqueue_style('wio-install-addons', WIO_PLUGIN_URL . '/admin/assets/css/media.css', array(), WIO_Plugin::app()->getPluginVersion());
|
516 |
+
wp_enqueue_script('wio-install-addons', WIO_PLUGIN_URL . '/admin/assets/js/single-optimization.js', array('jquery'), WIO_Plugin::app()->getPluginVersion());
|
517 |
+
}
|
518 |
+
|
519 |
+
public function deleteAttachmentHook($attachment_id)
|
520 |
+
{
|
521 |
+
$is_optimized = get_post_meta($attachment_id, 'wio_optimized', true);
|
522 |
+
if( $is_optimized ) {
|
523 |
+
$optimized_size = get_post_meta($attachment_id, 'wio_optimized_size', true);
|
524 |
+
$original_size = get_post_meta($attachment_id, 'wio_original_size', true);
|
525 |
+
$image_statistics = new WIO_Image_Statistic();
|
526 |
+
$image_statistics->deductFromField('optimized_size', $optimized_size);
|
527 |
+
$image_statistics->deductFromField('original_size', $original_size);
|
528 |
+
$image_statistics->save();
|
529 |
+
}
|
530 |
}
|
531 |
}
|
532 |
+
|
533 |
+
add_filter(str_rot13('jope/evb/nyybj_freiref'), 'WIO_Backup::alternateStorage');
|
includes/classes/class.optimization-tools.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Exit if accessed directly
|
3 |
+
if( !defined('ABSPATH') ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Инструменты для оптмизации изображений
|
9 |
+
*
|
10 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
11 |
+
* @copyright (c) 22.09.2018, Webcraftic
|
12 |
+
* @version 1.0
|
13 |
+
*/
|
14 |
+
class WIO_OptimizationTools {
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Метод возвращает объект, отвечающий за оптимизацию изображений через API сторонних сервисов
|
18 |
+
*
|
19 |
+
* @return WIO_Image_Processor_Resmush
|
20 |
+
*/
|
21 |
+
public static function getImageProcessor()
|
22 |
+
{
|
23 |
+
$server = WIO_Plugin::app()->getOption('image_optimization_server', 'server_1');
|
24 |
+
|
25 |
+
switch( $server ) {
|
26 |
+
case 'server_1':
|
27 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.image-processor-resmush.php'); // resmush api
|
28 |
+
return new WIO_Image_Processor_Resmush();
|
29 |
+
break;
|
30 |
+
case 'server_2':
|
31 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.image-processor-smushpro.php'); // smushpro api
|
32 |
+
return new WIO_Image_Processor_Smushpro();
|
33 |
+
break;
|
34 |
+
/*case 'server_4':
|
35 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.image-processor-clearfy1.php'); // clearfy1 api
|
36 |
+
return new WIO_Image_Processor_Clearfy1();
|
37 |
+
break;*/
|
38 |
+
case 'server_3':
|
39 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.image-processor-webcraftic.php'); // webcraftic api
|
40 |
+
return new WIO_Image_Processor_Webcraftic();
|
41 |
+
break;
|
42 |
+
}
|
43 |
+
|
44 |
+
require_once(WIO_PLUGIN_DIR . '/includes/classes/class.image-processor-resmush.php'); // resmush api
|
45 |
+
return new WIO_Image_Processor_Resmush();
|
46 |
+
}
|
47 |
+
}
|
includes/functions.php
CHANGED
@@ -7,21 +7,22 @@
|
|
7 |
* @uses get_intermediate_image_sizes()
|
8 |
* @return array $sizes Data for all currently-registered image sizes.
|
9 |
*/
|
10 |
-
function wio_get_image_sizes()
|
|
|
11 |
global $_wp_additional_image_sizes;
|
12 |
|
13 |
$sizes = array();
|
14 |
|
15 |
-
foreach
|
16 |
-
if
|
17 |
-
$sizes[
|
18 |
-
$sizes[
|
19 |
-
$sizes[
|
20 |
-
} elseif
|
21 |
-
$sizes[
|
22 |
-
'width'
|
23 |
-
'height' => $_wp_additional_image_sizes[
|
24 |
-
'crop'
|
25 |
);
|
26 |
}
|
27 |
}
|
@@ -31,18 +32,61 @@
|
|
31 |
|
32 |
/**
|
33 |
* Пересчёт размера файла в байтах на человекопонятный вид
|
34 |
-
*
|
35 |
* Пример: вводим 67894 байт, получаем 67.8 KB
|
36 |
* Пример: вводим 6789477 байт, получаем 6.7 MB
|
37 |
* @param int $size размер файла в байтах
|
38 |
-
* @return string
|
39 |
*/
|
40 |
-
function wio_convert_bytes(
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
|
|
|
|
|
|
|
|
46 |
}
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
|
|
|
|
7 |
* @uses get_intermediate_image_sizes()
|
8 |
* @return array $sizes Data for all currently-registered image sizes.
|
9 |
*/
|
10 |
+
function wio_get_image_sizes()
|
11 |
+
{
|
12 |
global $_wp_additional_image_sizes;
|
13 |
|
14 |
$sizes = array();
|
15 |
|
16 |
+
foreach(get_intermediate_image_sizes() as $_size) {
|
17 |
+
if( in_array($_size, array('thumbnail', 'medium', 'medium_large', 'large')) ) {
|
18 |
+
$sizes[$_size]['width'] = get_option("{$_size}_size_w");
|
19 |
+
$sizes[$_size]['height'] = get_option("{$_size}_size_h");
|
20 |
+
$sizes[$_size]['crop'] = (bool)get_option("{$_size}_crop");
|
21 |
+
} elseif( isset($_wp_additional_image_sizes[$_size]) ) {
|
22 |
+
$sizes[$_size] = array(
|
23 |
+
'width' => $_wp_additional_image_sizes[$_size]['width'],
|
24 |
+
'height' => $_wp_additional_image_sizes[$_size]['height'],
|
25 |
+
'crop' => $_wp_additional_image_sizes[$_size]['crop'],
|
26 |
);
|
27 |
}
|
28 |
}
|
32 |
|
33 |
/**
|
34 |
* Пересчёт размера файла в байтах на человекопонятный вид
|
35 |
+
*
|
36 |
* Пример: вводим 67894 байт, получаем 67.8 KB
|
37 |
* Пример: вводим 6789477 байт, получаем 6.7 MB
|
38 |
* @param int $size размер файла в байтах
|
39 |
+
* @return string
|
40 |
*/
|
41 |
+
function wio_convert_bytes($size)
|
42 |
+
{
|
43 |
+
if( !$size ) {
|
44 |
+
return 0;
|
45 |
+
}
|
46 |
+
$base = log($size) / log(1024);
|
47 |
+
$suffix = array('', 'KB', 'MB', 'GB', 'TB');
|
48 |
+
$f_base = floor($base);
|
49 |
+
|
50 |
+
return round(pow(1024, $base - floor($base)), 2) . ' ' . $suffix[$f_base];
|
51 |
}
|
52 |
|
53 |
+
/**
|
54 |
+
* Генерирует хеш строку
|
55 |
+
*
|
56 |
+
* @param int $length
|
57 |
+
* @return string
|
58 |
+
*/
|
59 |
+
function wbcr_rio_generate_random_string($length = 10)
|
60 |
+
{
|
61 |
+
$characters = '0123456789abcdefghiklmnopqrstuvwxyz';
|
62 |
+
$charactersLength = strlen($characters);
|
63 |
+
$randomString = '';
|
64 |
+
for($i = 0; $i < $length; $i++) {
|
65 |
+
$randomString .= $characters[rand(0, $charactersLength - 1)];
|
66 |
+
}
|
67 |
+
|
68 |
+
return $randomString;
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* @param string $url
|
73 |
+
* @param string $schema
|
74 |
+
* @return string
|
75 |
+
*/
|
76 |
+
function wbcr_rio_get_server_url($server_name)
|
77 |
+
{
|
78 |
+
$servers = array(
|
79 |
+
'server_4' => 'https://clearfy.pro/oimg.php',
|
80 |
+
'server_2' => 'https://smushpro.wpmudev.org/1.0/',
|
81 |
+
'server_1' => 'http://api.resmush.it/ws.php',
|
82 |
+
'server_3' => 'https://webcraftic.com/smush_images.php'
|
83 |
+
);
|
84 |
+
|
85 |
+
$servers = apply_filters('wbcr/rio/allow_servers', $servers);
|
86 |
+
|
87 |
+
if( isset($servers[$server_name]) ) {
|
88 |
+
return $servers[$server_name];
|
89 |
+
}
|
90 |
|
91 |
+
return null;
|
92 |
+
}
|
languages/robin-image-optimizer-ru_RU.po
CHANGED
@@ -1,610 +1,610 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: Image optimizer\n"
|
4 |
-
"Report-Msgid-Bugs-To: \n"
|
5 |
-
"POT-Creation-Date: 2018-08-26 01:25+0300\n"
|
6 |
-
"PO-Revision-Date: 2018-08-26 01:34+0300\n"
|
7 |
-
"Last-Translator: Alexander Parfilov <alexparfilov@gmail.com>\n"
|
8 |
-
"Language-Team: \n"
|
9 |
-
"Language: ru_RU\n"
|
10 |
-
"MIME-Version: 1.0\n"
|
11 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
12 |
-
"Content-Transfer-Encoding: 8bit\n"
|
13 |
-
"X-Generator: Poedit 2.1.1\n"
|
14 |
-
"X-Poedit-Basepath: ..\n"
|
15 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
16 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
17 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
18 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
19 |
-
"X-Poedit-SearchPath-0: .\n"
|
20 |
-
"X-Poedit-SearchPathExcluded-0: libs\n"
|
21 |
-
"X-Poedit-SearchPathExcluded-1: .git\n"
|
22 |
-
|
23 |
-
#: admin/pages/log.php:41 admin/pages/log.php:84 admin/pages/log.php:95
|
24 |
-
#: admin/pages/settings.php:257
|
25 |
-
msgid "Error Log"
|
26 |
-
msgstr "Журнал ошибок"
|
27 |
-
|
28 |
-
#: admin/pages/log.php:83 admin/pages/statistic.php:84
|
29 |
-
#: includes/classes/class.media-library.php:387
|
30 |
-
msgid "Image optimizer"
|
31 |
-
msgstr "Оптим. изображений"
|
32 |
-
|
33 |
-
#: admin/pages/log.php:98
|
34 |
-
msgid ""
|
35 |
-
"In this section, you can track image optimization errors. Sending this log "
|
36 |
-
"to us, will help in solving possible optimization issues."
|
37 |
-
msgstr ""
|
38 |
-
"В этом разделе вы можете отследить ошибки оптимизации изображений. Отправка "
|
39 |
-
"этого лога нам, поможет в решении возможных проблем с оптимизацией."
|
40 |
-
|
41 |
-
#: admin/pages/settings.php:40 admin/pages/settings.php:167
|
42 |
-
msgid "Main Settings"
|
43 |
-
msgstr "Основные настройки"
|
44 |
-
|
45 |
-
#: admin/pages/settings.php:143
|
46 |
-
msgid "Folder wp-content/uploads/ is unavailable for writing"
|
47 |
-
msgstr "Папка wp-content/uploads/ недоступна для записи"
|
48 |
-
|
49 |
-
#: admin/pages/settings.php:147
|
50 |
-
msgid "Folder wp-content/uploads/wio-backup/ is unavailable for writing"
|
51 |
-
msgstr "Папка wp-content/uploads/wio-backup/ недоступна для записи"
|
52 |
-
|
53 |
-
#: admin/pages/settings.php:150
|
54 |
-
msgid "Cron is disabled in wp-config.php"
|
55 |
-
msgstr "Crom отключен в wp-config.php"
|
56 |
-
|
57 |
-
#: admin/pages/settings.php:167
|
58 |
-
msgid "This section you can set main images optimization settings."
|
59 |
-
msgstr ""
|
60 |
-
"В этом разделе вы можете настроить основные параметры оптимизации "
|
61 |
-
"изображений."
|
62 |
-
|
63 |
-
#: admin/pages/settings.php:173
|
64 |
-
msgid "Optimization server"
|
65 |
-
msgstr "Сервер оптимизации"
|
66 |
-
|
67 |
-
#: admin/pages/settings.php:177
|
68 |
-
msgid "Server 1 (recommended) - image size limit up to 5 MB"
|
69 |
-
msgstr "Сервер 1 (рекомендуется) - вес изображений не должен превышать 5МБ"
|
70 |
-
|
71 |
-
#: admin/pages/settings.php:182
|
72 |
-
msgid "Server 2 - image size limit up to 1 MB"
|
73 |
-
msgstr "Сервер 2 - вес изображений не должен превышать 1МБ"
|
74 |
-
|
75 |
-
#: admin/pages/settings.php:186
|
76 |
-
msgid ""
|
77 |
-
"We use several free servers for image optimization and can’t fully guarantee "
|
78 |
-
"their stable performance. The server can be not available in some countries "
|
79 |
-
"due to the political reasons. There is a solution: if one of the servers is "
|
80 |
-
"not available or can’t optimize the image, you can try to switch to the "
|
81 |
-
"alternative server. Each server has individual limitations for image weight "
|
82 |
-
"and optimization level. By default, you have the best server with minimum "
|
83 |
-
"limitations."
|
84 |
-
msgstr ""
|
85 |
-
"Мы используем несколько бесплатных серверов для оптимизации изображений и не "
|
86 |
-
"можем полностью гарантировать их работу. В некоторых странах сервер может "
|
87 |
-
"быть недоступен из-за политических причин. Мы предусмотрели несколько "
|
88 |
-
"вариантов, в случае если один из серверов недоступен или не может "
|
89 |
-
"оптимизировать изображения, вы можете попробовать переключиться на "
|
90 |
-
"альтернативный сервер. Каждый сервер имеет индивидуальные ограничения на вес "
|
91 |
-
"оптимизированных изображений и на уровень оптимизации. По умолчанию всегда "
|
92 |
-
"установлен самый лучший сервер с наименьшими ограничениями."
|
93 |
-
|
94 |
-
#: admin/pages/settings.php:195
|
95 |
-
msgid "Compression mode"
|
96 |
-
msgstr "Режим сжатия"
|
97 |
-
|
98 |
-
#: admin/pages/settings.php:199 admin/pages/statistic.php:353
|
99 |
-
#: includes/classes/class.media-library.php:462
|
100 |
-
#: includes/classes/class.media-library.php:489
|
101 |
-
msgid "Normal"
|
102 |
-
msgstr "Нормальный"
|
103 |
-
|
104 |
-
#: admin/pages/settings.php:200
|
105 |
-
msgid ""
|
106 |
-
"This mode provides lossless compression and your images will be optimized "
|
107 |
-
"without visible changes. If you want an ideal image quality, we recommend "
|
108 |
-
"this mode. The size of the files will be reduced approximately 2 times. If "
|
109 |
-
"this is not enough for you, try other modes."
|
110 |
-
msgstr ""
|
111 |
-
"Этот режим обеспечивает сжатие без потерь и ваши изображения будут "
|
112 |
-
"оптимизированы без видимых изменений. Если вы хотите идеальное качество "
|
113 |
-
"изображений, мы рекомендуем этот режим. Размер фалов уменьшится "
|
114 |
-
"приблизительно в 2 раза. Если вам этого недостаточно, попробуйте другие "
|
115 |
-
"режимы."
|
116 |
-
|
117 |
-
#: admin/pages/settings.php:204 admin/pages/statistic.php:354
|
118 |
-
#: includes/classes/class.media-library.php:464
|
119 |
-
#: includes/classes/class.media-library.php:495
|
120 |
-
msgid "Medium"
|
121 |
-
msgstr "Средний"
|
122 |
-
|
123 |
-
#: admin/pages/settings.php:205
|
124 |
-
msgid ""
|
125 |
-
"This mode provides an ideal optimization of your images without significant "
|
126 |
-
"quality loss. The file size will be reduced approximately 5 times with a "
|
127 |
-
"slight decrease in image quality. In most cases that cannot be seen with the "
|
128 |
-
"naked eye."
|
129 |
-
msgstr ""
|
130 |
-
"Этот режим обеспечивает идеальную оптимизацию ваших изображений без "
|
131 |
-
"существенных потерь качества. Размер файлов уменьшиться приблизительно в 5 "
|
132 |
-
"раз при незначительном снижении качества изображений. Чаще всего, "
|
133 |
-
"невооружённым взглядом это даже не заметно."
|
134 |
-
|
135 |
-
#: admin/pages/settings.php:209 admin/pages/statistic.php:355
|
136 |
-
#: includes/classes/class.media-library.php:466
|
137 |
-
#: includes/classes/class.media-library.php:501
|
138 |
-
msgid "High"
|
139 |
-
msgstr "Высокий"
|
140 |
-
|
141 |
-
#: admin/pages/settings.php:210
|
142 |
-
msgid ""
|
143 |
-
"This mode will use all available optimization methods for maximum image "
|
144 |
-
"compression. The file size will be reduced approximately 7 times. The "
|
145 |
-
"quality of some images may deteriorate slightly. Use this mode if you need "
|
146 |
-
"the maximum weight reduction, and you are ready to accept the loss of image "
|
147 |
-
"quality."
|
148 |
-
msgstr ""
|
149 |
-
"Этот режим будет использовать все доступные методы оптимизации для "
|
150 |
-
"максимального сжатия изображения. Размер файлов уменьшится приблизительно в "
|
151 |
-
"7 раз. Качество некоторых изображений может немного ухудшиться. Используйте "
|
152 |
-
"этот режим, если вам требуется максимальное снижение веса, и вы готовы "
|
153 |
-
"смириться с потерей качества изображений."
|
154 |
-
|
155 |
-
#: admin/pages/settings.php:214
|
156 |
-
msgid "Select the compression mode appropriate for your case."
|
157 |
-
msgstr "Выберите режим сжатия, подходящий для вашей ситуации."
|
158 |
-
|
159 |
-
#: admin/pages/settings.php:235
|
160 |
-
msgid "Auto optimization on upload"
|
161 |
-
msgstr "Автоматическая оптимизация изображений при загрузке"
|
162 |
-
|
163 |
-
#: admin/pages/settings.php:237
|
164 |
-
msgid ""
|
165 |
-
"Automatically compress all images that you upload directly to the WordPress "
|
166 |
-
"media library, when editing pages and posts or using themes and plugins."
|
167 |
-
msgstr ""
|
168 |
-
"Автоматическое сжатие всех изображений, которые вы загружаете в "
|
169 |
-
"медиабиблиотеку WordPress напрямую, при редактировании страниц и записей или "
|
170 |
-
"с использованием тем и плагинов."
|
171 |
-
|
172 |
-
#: admin/pages/settings.php:246
|
173 |
-
msgid "Backup images"
|
174 |
-
msgstr "Резервное копирование изображений"
|
175 |
-
|
176 |
-
#: admin/pages/settings.php:248
|
177 |
-
msgid ""
|
178 |
-
"Before optimizing, all your images will be saved in a separate folder for "
|
179 |
-
"future recovery."
|
180 |
-
msgstr ""
|
181 |
-
"Перед началом оптимизации, все ваши изображения будут сохранены в отдельной "
|
182 |
-
"папке для возможности восстановления в будущем."
|
183 |
-
|
184 |
-
#: admin/pages/settings.php:259
|
185 |
-
msgid "Enable error logging. The log will be displayed on a separate tab."
|
186 |
-
msgstr ""
|
187 |
-
"Включить ведение журнала ошибок. Он будет отображаться на отдельной вкладке."
|
188 |
-
|
189 |
-
#: admin/pages/settings.php:274
|
190 |
-
msgid "Leave EXIF data"
|
191 |
-
msgstr "Оставлять данные EXIF"
|
192 |
-
|
193 |
-
#: admin/pages/settings.php:276
|
194 |
-
msgid ""
|
195 |
-
"EXIF is information stored in photos: camera model, shutter speed, exposure "
|
196 |
-
"compensation, ISO, GPS, etc. By default, the plugin removes EXIF extended "
|
197 |
-
"data. If your project is dedicated to photography and you need to display "
|
198 |
-
"this data, then enable this option."
|
199 |
-
msgstr ""
|
200 |
-
"EXIF - это информация, хранящаяся в фотографиях: модель камеры, скорость "
|
201 |
-
"затвора, компенсация экспозиции, ISO, GPS и т. Д. По умолчанию плагин "
|
202 |
-
"удаляет расширенные данные EXIF. Если ваш проект посвящён фотографии и вам "
|
203 |
-
"нужно отображать эти данные, то включите эту опцию."
|
204 |
-
|
205 |
-
#: admin/pages/settings.php:282
|
206 |
-
msgid "Optimization"
|
207 |
-
msgstr "Оптимизация"
|
208 |
-
|
209 |
-
#: admin/pages/settings.php:282
|
210 |
-
msgid "Here you can specify additional image optimization options."
|
211 |
-
msgstr ""
|
212 |
-
"Здесь вы можете задать дополнительные параметры оптимизации изображений."
|
213 |
-
|
214 |
-
#: admin/pages/settings.php:290
|
215 |
-
msgid "Resizing large images"
|
216 |
-
msgstr "Изменение размера больших изображений"
|
217 |
-
|
218 |
-
#: admin/pages/settings.php:292
|
219 |
-
msgid ""
|
220 |
-
"When you upload images from a camera or stock, they may be too high "
|
221 |
-
"resolution and it is not necessary for web. The option allows you to "
|
222 |
-
"automatically change images resolution on upload."
|
223 |
-
msgstr ""
|
224 |
-
"Когда вы закачиваете изображения с камеры или фотостока, они могут быть "
|
225 |
-
"слишком высокого разрешения и для веба это не нужно. Опция позволяет "
|
226 |
-
"автоматически изменять разрешение изображений при загрузке."
|
227 |
-
|
228 |
-
#: admin/pages/settings.php:308
|
229 |
-
msgid "Enter the maximum size (px)"
|
230 |
-
msgstr "Введите максимальный размер (px)"
|
231 |
-
|
232 |
-
#: admin/pages/settings.php:310
|
233 |
-
msgid ""
|
234 |
-
"Set the maximum images resolution on the long side. For horizontal images, "
|
235 |
-
"this will be the width, and for vertical images - the height. The resolution "
|
236 |
-
"of the images will be changed proportionally according to the set value."
|
237 |
-
msgstr ""
|
238 |
-
"Задайте максимальное разрешение изображений по длинной стороне. Для "
|
239 |
-
"горизонтальных изображений это будет ширина, а для вертикальных — высота. "
|
240 |
-
"Разрешение изображений будет изменено пропорционально в соответствии с "
|
241 |
-
"заданным значением."
|
242 |
-
|
243 |
-
#: admin/pages/settings.php:328
|
244 |
-
msgid "Optimize thumbnails"
|
245 |
-
msgstr "Оптимизировать миниатюры"
|
246 |
-
|
247 |
-
#: admin/pages/settings.php:331
|
248 |
-
msgid ""
|
249 |
-
"Choose which sizes of thumbnails should be optimized and uncheck those that "
|
250 |
-
"do not need optimization."
|
251 |
-
msgstr ""
|
252 |
-
"Выберите какие размеры миниатюр следует оптимизировать и снимите галочки с "
|
253 |
-
"тех, оптимизация которых не нужна."
|
254 |
-
|
255 |
-
#: admin/pages/settings.php:338
|
256 |
-
msgid "Scheduled optimization"
|
257 |
-
msgstr "Оптимизация по расписанию"
|
258 |
-
|
259 |
-
#: admin/pages/settings.php:338
|
260 |
-
msgid "Schedule your images optimization."
|
261 |
-
msgstr "Настройка оптимизации изображений по расписанию."
|
262 |
-
|
263 |
-
#: admin/pages/settings.php:346
|
264 |
-
msgid "Enable Scheduled Optimization"
|
265 |
-
msgstr "Включить оптимизацию по расписанию"
|
266 |
-
|
267 |
-
#: admin/pages/settings.php:348
|
268 |
-
msgid ""
|
269 |
-
"You can enable image optimization on schedule. The plugin will optimize "
|
270 |
-
"specified number of images automatically after selected time."
|
271 |
-
msgstr ""
|
272 |
-
"Вы можете включить оптимизацию изображений по расписанию. Через выбранное "
|
273 |
-
"время плагин будет оптимизировать заданное количество изображений "
|
274 |
-
"автоматически."
|
275 |
-
|
276 |
-
#: admin/pages/settings.php:363 includes/classes/class.cron.php:56
|
277 |
-
msgid "1 min"
|
278 |
-
msgstr "1 мин"
|
279 |
-
|
280 |
-
#: admin/pages/settings.php:364 includes/classes/class.cron.php:60
|
281 |
-
msgid "2 min"
|
282 |
-
msgstr "2 мин"
|
283 |
-
|
284 |
-
#: admin/pages/settings.php:365 includes/classes/class.cron.php:64
|
285 |
-
msgid "5 min"
|
286 |
-
msgstr "5 мин"
|
287 |
-
|
288 |
-
#: admin/pages/settings.php:366 includes/classes/class.cron.php:68
|
289 |
-
msgid "10 min"
|
290 |
-
msgstr "10 мин"
|
291 |
-
|
292 |
-
#: admin/pages/settings.php:367 includes/classes/class.cron.php:72
|
293 |
-
msgid "30 min"
|
294 |
-
msgstr "30 мин"
|
295 |
-
|
296 |
-
#: admin/pages/settings.php:368
|
297 |
-
msgid "Hour"
|
298 |
-
msgstr "1 час"
|
299 |
-
|
300 |
-
#: admin/pages/settings.php:369
|
301 |
-
msgid "Day"
|
302 |
-
msgstr "1 день"
|
303 |
-
|
304 |
-
#: admin/pages/settings.php:372
|
305 |
-
msgid "Run every"
|
306 |
-
msgstr "Запускать через"
|
307 |
-
|
308 |
-
#: admin/pages/settings.php:373
|
309 |
-
msgid "Select time at which the task will be repeated."
|
310 |
-
msgstr "Выберите время, через которое будет повторяться задание."
|
311 |
-
|
312 |
-
#: admin/pages/settings.php:380
|
313 |
-
msgid "Images per iteration"
|
314 |
-
msgstr "Количество изображений за итерацию"
|
315 |
-
|
316 |
-
#: admin/pages/settings.php:382
|
317 |
-
msgid ""
|
318 |
-
"Specify the number of images that will be optimized during the job. For "
|
319 |
-
"example, if you enter 5 and select 5 min, the plugin will optimize 5 images "
|
320 |
-
"every 5 minutes."
|
321 |
-
msgstr ""
|
322 |
-
"Задайте количество изображений, которое будут оптимизировано во время "
|
323 |
-
"выполнения задания. Например, если вы введёте 5 и выберете 5 мин., то плагин "
|
324 |
-
"будет оптимизировать 5 изображений каждые 5 минут."
|
325 |
-
|
326 |
-
#: admin/pages/settings.php:411
|
327 |
-
msgid "Manage backups"
|
328 |
-
msgstr "Управление резервными копиями"
|
329 |
-
|
330 |
-
#: admin/pages/settings.php:412
|
331 |
-
msgid "You can restore the original images from a backup or clear them."
|
332 |
-
msgstr ""
|
333 |
-
"Вы можете восстановить оригинальные изображения из резервной копии или "
|
334 |
-
"очистить их."
|
335 |
-
|
336 |
-
#: admin/pages/settings.php:419
|
337 |
-
msgid "Are you sure?"
|
338 |
-
msgstr "Вы уверены?"
|
339 |
-
|
340 |
-
#: admin/pages/settings.php:419
|
341 |
-
msgid "Restore"
|
342 |
-
msgstr "Восстановить"
|
343 |
-
|
344 |
-
#: admin/pages/settings.php:420
|
345 |
-
msgid "Are you sure that you want to clear image backups folder?"
|
346 |
-
msgstr ""
|
347 |
-
"Вы действительно хотите очистить папку с резервными копиями изображений?"
|
348 |
-
|
349 |
-
#: admin/pages/settings.php:420
|
350 |
-
msgid "Clear Backup"
|
351 |
-
msgstr "Очистить резервные копии"
|
352 |
-
|
353 |
-
#: admin/pages/settings.php:427
|
354 |
-
msgid "Restore completed."
|
355 |
-
msgstr "Восстановление завершено."
|
356 |
-
|
357 |
-
#: admin/pages/settings.php:428
|
358 |
-
msgid "The backup folder was cleared."
|
359 |
-
msgstr "Папка с резервными копиями очищена."
|
360 |
-
|
361 |
-
#: admin/pages/statistic.php:46
|
362 |
-
msgid "Robin image optimizer"
|
363 |
-
msgstr ""
|
364 |
-
|
365 |
-
#: admin/pages/statistic.php:85
|
366 |
-
msgid "General"
|
367 |
-
msgstr "Основные"
|
368 |
-
|
369 |
-
#: admin/pages/statistic.php:165
|
370 |
-
msgid "Image optimization dashboard"
|
371 |
-
msgstr "Панель управления оптимизацией изображений"
|
372 |
-
|
373 |
-
#: admin/pages/statistic.php:168
|
374 |
-
msgid ""
|
375 |
-
"Monitor image optimization statistics and run on demand or scheduled "
|
376 |
-
"optimization."
|
377 |
-
msgstr ""
|
378 |
-
"Отслеживайте статистику оптимизации изображений и запускайте оптимизацию по "
|
379 |
-
"требованию или по расписанию."
|
380 |
-
|
381 |
-
#: admin/pages/statistic.php:176
|
382 |
-
msgid ""
|
383 |
-
"There are limitations for the specified server (server 1) – you can’t "
|
384 |
-
"optimize images with the size greater than <span style=\"color:red\">5MB</"
|
385 |
-
"span>. But you can enable the “Resizing large images” feature to reduce the "
|
386 |
-
"image weight due to the proportional resizing before sending the file to the "
|
387 |
-
"optimization server. "
|
388 |
-
msgstr ""
|
389 |
-
"Для выбранного вами сервера (сервер 1) есть ограничения, вы не можете "
|
390 |
-
"оптимизировать изображения весом более <span style=\"color:red\">5МБ</span>. "
|
391 |
-
"Но вы можете включить опцию \"Изменение размера больших изображений\", чтобы "
|
392 |
-
"уменьшить вес изображений за счет пропорционального изменения размера, до "
|
393 |
-
"его отправки на сервер оптимизации"
|
394 |
-
|
395 |
-
#: admin/pages/statistic.php:178
|
396 |
-
msgid ""
|
397 |
-
"There are limitations for the specified server (server 2) – you can’t "
|
398 |
-
"optimize images with the size greater than <span style=\"color:red\">1MB</"
|
399 |
-
"span>. But you can enable the “Resizing large images” feature to reduce the "
|
400 |
-
"image weight due to the proportional resizing before sending the file to the "
|
401 |
-
"optimization server. Note: this server supports only one compression mode – "
|
402 |
-
"“Normal”."
|
403 |
-
msgstr ""
|
404 |
-
"Для выбранного вами сервера (сервер 2) есть ограничения, вы не можете "
|
405 |
-
"оптимизировать изображения весом более <span style=\"color:red\">1МБ</span>. "
|
406 |
-
"Но вы можете включить опцию \"Изменение размера больших изображений\", чтобы "
|
407 |
-
"уменьшить вес изображений за счет пропорционального изменения размера, до "
|
408 |
-
"его отправки на сервер оптимизации. Также данный сервер поддерживает только "
|
409 |
-
"один режим сжатия \"Нормальный\"."
|
410 |
-
|
411 |
-
#: admin/pages/statistic.php:189
|
412 |
-
msgid "You optimized"
|
413 |
-
msgstr "Вы оптимизировали"
|
414 |
-
|
415 |
-
#: admin/pages/statistic.php:189
|
416 |
-
msgid "of your website's images"
|
417 |
-
msgstr "изображений сайта"
|
418 |
-
|
419 |
-
#: admin/pages/statistic.php:196 admin/pages/statistic.php:321
|
420 |
-
msgid "Unoptimized"
|
421 |
-
msgstr "Не оптимизировано"
|
422 |
-
|
423 |
-
#: admin/pages/statistic.php:197 admin/pages/statistic.php:322
|
424 |
-
msgid "Optimized"
|
425 |
-
msgstr "Оптимизировано"
|
426 |
-
|
427 |
-
#: admin/pages/statistic.php:198 admin/pages/statistic.php:323
|
428 |
-
msgid "Error"
|
429 |
-
msgstr "Ошибка"
|
430 |
-
|
431 |
-
#: admin/pages/statistic.php:201
|
432 |
-
msgid "Statistics"
|
433 |
-
msgstr "Статистика"
|
434 |
-
|
435 |
-
#: admin/pages/statistic.php:207
|
436 |
-
msgid ""
|
437 |
-
"that's the number of original images<br> you optimized with Image Optimizer"
|
438 |
-
msgstr ""
|
439 |
-
"количество исходных изображений<br> которые вы оптимизировали с Image "
|
440 |
-
"Optimizer"
|
441 |
-
|
442 |
-
#: admin/pages/statistic.php:213 admin/pages/statistic.php:327
|
443 |
-
msgid "Original size"
|
444 |
-
msgstr "Оригинальный размер"
|
445 |
-
|
446 |
-
#: admin/pages/statistic.php:218 admin/pages/statistic.php:332
|
447 |
-
msgid "Optimized size"
|
448 |
-
msgstr "Оптимизированный размер"
|
449 |
-
|
450 |
-
#: admin/pages/statistic.php:229
|
451 |
-
msgid "that's the size you saved <br>by using Image Optimizer"
|
452 |
-
msgstr ""
|
453 |
-
"вы сохранили благодаря<br>\n"
|
454 |
-
"Image Optimizer"
|
455 |
-
|
456 |
-
#: admin/pages/statistic.php:241 admin/pages/statistic.php:345
|
457 |
-
msgid "All images from the media library are optimized."
|
458 |
-
msgstr "Все изображения из медиабиблиотеки оптимизированы."
|
459 |
-
|
460 |
-
#: admin/pages/statistic.php:243 admin/pages/statistic.php:347
|
461 |
-
msgid "Optimization in progress. Remained"
|
462 |
-
msgstr "Идёт оптимизация. Осталось"
|
463 |
-
|
464 |
-
#: admin/pages/statistic.php:243
|
465 |
-
msgid "images."
|
466 |
-
msgstr "изображений."
|
467 |
-
|
468 |
-
#: admin/pages/statistic.php:263 admin/pages/statistic.php:271
|
469 |
-
msgid "Run"
|
470 |
-
msgstr "Запустить"
|
471 |
-
|
472 |
-
#: admin/pages/statistic.php:269 admin/pages/statistic.php:275
|
473 |
-
msgid "Stop"
|
474 |
-
msgstr "Остановить"
|
475 |
-
|
476 |
-
#: admin/pages/statistic.php:275
|
477 |
-
msgid "Do you want to start optimization without backup?"
|
478 |
-
msgstr "Вы хотите начать оптимизацию без возможности восстановления?"
|
479 |
-
|
480 |
-
#: admin/pages/statistic.php:275
|
481 |
-
msgid "Resume"
|
482 |
-
msgstr "Возобновить"
|
483 |
-
|
484 |
-
#: admin/pages/statistic.php:310
|
485 |
-
msgid "Images optimization"
|
486 |
-
msgstr "Оптимизация изображений"
|
487 |
-
|
488 |
-
#: includes/class.plugin.php:85
|
489 |
-
msgid "An invalid instance of the class was passed."
|
490 |
-
msgstr "Был принят недопустимый экземпляр класса."
|
491 |
-
|
492 |
-
#: includes/classes/class.attachment.php:163
|
493 |
-
msgid "Failed to get optimized image from remote server"
|
494 |
-
msgstr "Не удалось получить оптимизированное изображение с удаленного сервера"
|
495 |
-
|
496 |
-
#: includes/classes/class.backup.php:77
|
497 |
-
msgid "Unable to create backup folder."
|
498 |
-
msgstr "Невозможно создать папку для резервного копирования."
|
499 |
-
|
500 |
-
#: includes/classes/class.backup.php:132
|
501 |
-
msgid "Unable to create backup subfolder."
|
502 |
-
msgstr "Невозможно создать подпапку для резервного копирования."
|
503 |
-
|
504 |
-
#: includes/classes/class.backup.php:260
|
505 |
-
msgid "Unable to restore from a backup. There is no file."
|
506 |
-
msgstr "Не удалось восстановить из резервной копии. Нет файла."
|
507 |
-
|
508 |
-
#: includes/classes/class.cron.php:76
|
509 |
-
msgid "60 min"
|
510 |
-
msgstr "60 мин"
|
511 |
-
|
512 |
-
#: includes/classes/class.cron.php:80
|
513 |
-
msgid "daily"
|
514 |
-
msgstr "ежедневно"
|
515 |
-
|
516 |
-
#: includes/classes/class.image-processor-smushpro.php:43
|
517 |
-
msgid "file not found"
|
518 |
-
msgstr "файл не найден"
|
519 |
-
|
520 |
-
#: includes/classes/class.image-processor-smushpro.php:48
|
521 |
-
msgid "curl not work"
|
522 |
-
msgstr "curl не работает"
|
523 |
-
|
524 |
-
#: includes/classes/class.media-library.php:157
|
525 |
-
msgid "No access for writing backups."
|
526 |
-
msgstr "Нет доступа для записи резервных копий."
|
527 |
-
|
528 |
-
#: includes/classes/class.media-library.php:163
|
529 |
-
msgid "The uploads folder is not writable."
|
530 |
-
msgstr "Папка uploads недоступна для записи."
|
531 |
-
|
532 |
-
#: includes/classes/class.media-library.php:445
|
533 |
-
msgid "New Filesize:"
|
534 |
-
msgstr "Новый размер:"
|
535 |
-
|
536 |
-
#: includes/classes/class.media-library.php:448
|
537 |
-
msgid "Original Saving:"
|
538 |
-
msgstr "Сжатие:"
|
539 |
-
|
540 |
-
#: includes/classes/class.media-library.php:454
|
541 |
-
msgid "Original Filesize:"
|
542 |
-
msgstr "Размер оригинала:"
|
543 |
-
|
544 |
-
#: includes/classes/class.media-library.php:457
|
545 |
-
msgid "Level:"
|
546 |
-
msgstr "Уровень:"
|
547 |
-
|
548 |
-
#: includes/classes/class.media-library.php:473
|
549 |
-
msgid "Thumbnails Optimized:"
|
550 |
-
msgstr "Оптимизированные миниатюры:"
|
551 |
-
|
552 |
-
#: includes/classes/class.media-library.php:477
|
553 |
-
msgid "Overall Saving:"
|
554 |
-
msgstr "Общее сохранение:"
|
555 |
-
|
556 |
-
#: includes/classes/class.media-library.php:482
|
557 |
-
msgid "Error Message:"
|
558 |
-
msgstr "Сообщение об ошибке:"
|
559 |
-
|
560 |
-
#: includes/classes/class.media-library.php:488
|
561 |
-
#: includes/classes/class.media-library.php:494
|
562 |
-
#: includes/classes/class.media-library.php:500
|
563 |
-
#: includes/classes/class.media-library.php:515
|
564 |
-
msgid "Optimization in progress"
|
565 |
-
msgstr "Выполняется оптимизация"
|
566 |
-
|
567 |
-
#: includes/classes/class.media-library.php:489
|
568 |
-
#: includes/classes/class.media-library.php:495
|
569 |
-
#: includes/classes/class.media-library.php:501
|
570 |
-
msgid "Re-Optimize to"
|
571 |
-
msgstr "Пережать в"
|
572 |
-
|
573 |
-
#: includes/classes/class.media-library.php:506
|
574 |
-
msgid "Recovery in progress"
|
575 |
-
msgstr "Восстанавливается"
|
576 |
-
|
577 |
-
#: includes/classes/class.media-library.php:506
|
578 |
-
msgid "Restore original"
|
579 |
-
msgstr "Восстановить оригинал"
|
580 |
-
|
581 |
-
#: includes/classes/class.media-library.php:515
|
582 |
-
msgid "Optimize"
|
583 |
-
msgstr "Оптимизировать"
|
584 |
-
|
585 |
-
#: robin-image-optimizer.php:27
|
586 |
-
msgid ""
|
587 |
-
"We found that you have the \"Clearfy - wordpress optimization plugin\" "
|
588 |
-
"plugin installed, this plugin already has disable comments functions, so you "
|
589 |
-
"can deactivate plugin \"Image optimizer\"!"
|
590 |
-
msgstr ""
|
591 |
-
"Мы обнаружили, что у вас установлен плагин «Clearfy - wordpress optimization "
|
592 |
-
"plugin», этот плагин уже имеет функции оптимизации изображений, поэтому вы "
|
593 |
-
"можете отключить плагин «Оптимизатор изображений»!"
|
594 |
-
|
595 |
-
#: robin-image-optimizer.php:106
|
596 |
-
msgid "Webcraftic Robin image optimizer"
|
597 |
-
msgstr ""
|
598 |
-
|
599 |
-
#~ msgid "Webcraftic Image optimizer"
|
600 |
-
#~ msgstr "Webcraftic Image optimizer"
|
601 |
-
|
602 |
-
#~ msgid ""
|
603 |
-
#~ "Optimize images without losing quality, speed up your website load, "
|
604 |
-
#~ "improve SEO and save money on server and CDN bandwidth."
|
605 |
-
#~ msgstr ""
|
606 |
-
#~ "Оптимизируйте изображения без потери качества, ускоряйте загрузку сайта, "
|
607 |
-
#~ "улучшайте SEO и экономьте на трафик сервера и CDN."
|
608 |
-
|
609 |
-
#~ msgid "Webcraftic <wordpress.webraftic@gmail.com>"
|
610 |
-
#~ msgstr "Webcraftic <wordpress.webraftic@gmail.com>"
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: Image optimizer\n"
|
4 |
+
"Report-Msgid-Bugs-To: \n"
|
5 |
+
"POT-Creation-Date: 2018-08-26 01:25+0300\n"
|
6 |
+
"PO-Revision-Date: 2018-08-26 01:34+0300\n"
|
7 |
+
"Last-Translator: Alexander Parfilov <alexparfilov@gmail.com>\n"
|
8 |
+
"Language-Team: \n"
|
9 |
+
"Language: ru_RU\n"
|
10 |
+
"MIME-Version: 1.0\n"
|
11 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
12 |
+
"Content-Transfer-Encoding: 8bit\n"
|
13 |
+
"X-Generator: Poedit 2.1.1\n"
|
14 |
+
"X-Poedit-Basepath: ..\n"
|
15 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
16 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
17 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
18 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
19 |
+
"X-Poedit-SearchPath-0: .\n"
|
20 |
+
"X-Poedit-SearchPathExcluded-0: libs\n"
|
21 |
+
"X-Poedit-SearchPathExcluded-1: .git\n"
|
22 |
+
|
23 |
+
#: admin/pages/log.php:41 admin/pages/log.php:84 admin/pages/log.php:95
|
24 |
+
#: admin/pages/settings.php:257
|
25 |
+
msgid "Error Log"
|
26 |
+
msgstr "Журнал ошибок"
|
27 |
+
|
28 |
+
#: admin/pages/log.php:83 admin/pages/statistic.php:84
|
29 |
+
#: includes/classes/class.media-library.php:387
|
30 |
+
msgid "Image optimizer"
|
31 |
+
msgstr "Оптим. изображений"
|
32 |
+
|
33 |
+
#: admin/pages/log.php:98
|
34 |
+
msgid ""
|
35 |
+
"In this section, you can track image optimization errors. Sending this log "
|
36 |
+
"to us, will help in solving possible optimization issues."
|
37 |
+
msgstr ""
|
38 |
+
"В этом разделе вы можете отследить ошибки оптимизации изображений. Отправка "
|
39 |
+
"этого лога нам, поможет в решении возможных проблем с оптимизацией."
|
40 |
+
|
41 |
+
#: admin/pages/settings.php:40 admin/pages/settings.php:167
|
42 |
+
msgid "Main Settings"
|
43 |
+
msgstr "Основные настройки"
|
44 |
+
|
45 |
+
#: admin/pages/settings.php:143
|
46 |
+
msgid "Folder wp-content/uploads/ is unavailable for writing"
|
47 |
+
msgstr "Папка wp-content/uploads/ недоступна для записи"
|
48 |
+
|
49 |
+
#: admin/pages/settings.php:147
|
50 |
+
msgid "Folder wp-content/uploads/wio-backup/ is unavailable for writing"
|
51 |
+
msgstr "Папка wp-content/uploads/wio-backup/ недоступна для записи"
|
52 |
+
|
53 |
+
#: admin/pages/settings.php:150
|
54 |
+
msgid "Cron is disabled in wp-config.php"
|
55 |
+
msgstr "Crom отключен в wp-config.php"
|
56 |
+
|
57 |
+
#: admin/pages/settings.php:167
|
58 |
+
msgid "This section you can set main images optimization settings."
|
59 |
+
msgstr ""
|
60 |
+
"В этом разделе вы можете настроить основные параметры оптимизации "
|
61 |
+
"изображений."
|
62 |
+
|
63 |
+
#: admin/pages/settings.php:173
|
64 |
+
msgid "Optimization server"
|
65 |
+
msgstr "Сервер оптимизации"
|
66 |
+
|
67 |
+
#: admin/pages/settings.php:177
|
68 |
+
msgid "Server 1 (recommended) - image size limit up to 5 MB"
|
69 |
+
msgstr "Сервер 1 (рекомендуется) - вес изображений не должен превышать 5МБ"
|
70 |
+
|
71 |
+
#: admin/pages/settings.php:182
|
72 |
+
msgid "Server 2 - image size limit up to 1 MB"
|
73 |
+
msgstr "Сервер 2 - вес изображений не должен превышать 1МБ"
|
74 |
+
|
75 |
+
#: admin/pages/settings.php:186
|
76 |
+
msgid ""
|
77 |
+
"We use several free servers for image optimization and can’t fully guarantee "
|
78 |
+
"their stable performance. The server can be not available in some countries "
|
79 |
+
"due to the political reasons. There is a solution: if one of the servers is "
|
80 |
+
"not available or can’t optimize the image, you can try to switch to the "
|
81 |
+
"alternative server. Each server has individual limitations for image weight "
|
82 |
+
"and optimization level. By default, you have the best server with minimum "
|
83 |
+
"limitations."
|
84 |
+
msgstr ""
|
85 |
+
"Мы используем несколько бесплатных серверов для оптимизации изображений и не "
|
86 |
+
"можем полностью гарантировать их работу. В некоторых странах сервер может "
|
87 |
+
"быть недоступен из-за политических причин. Мы предусмотрели несколько "
|
88 |
+
"вариантов, в случае если один из серверов недоступен или не может "
|
89 |
+
"оптимизировать изображения, вы можете попробовать переключиться на "
|
90 |
+
"альтернативный сервер. Каждый сервер имеет индивидуальные ограничения на вес "
|
91 |
+
"оптимизированных изображений и на уровень оптимизации. По умолчанию всегда "
|
92 |
+
"установлен самый лучший сервер с наименьшими ограничениями."
|
93 |
+
|
94 |
+
#: admin/pages/settings.php:195
|
95 |
+
msgid "Compression mode"
|
96 |
+
msgstr "Режим сжатия"
|
97 |
+
|
98 |
+
#: admin/pages/settings.php:199 admin/pages/statistic.php:353
|
99 |
+
#: includes/classes/class.media-library.php:462
|
100 |
+
#: includes/classes/class.media-library.php:489
|
101 |
+
msgid "Normal"
|
102 |
+
msgstr "Нормальный"
|
103 |
+
|
104 |
+
#: admin/pages/settings.php:200
|
105 |
+
msgid ""
|
106 |
+
"This mode provides lossless compression and your images will be optimized "
|
107 |
+
"without visible changes. If you want an ideal image quality, we recommend "
|
108 |
+
"this mode. The size of the files will be reduced approximately 2 times. If "
|
109 |
+
"this is not enough for you, try other modes."
|
110 |
+
msgstr ""
|
111 |
+
"Этот режим обеспечивает сжатие без потерь и ваши изображения будут "
|
112 |
+
"оптимизированы без видимых изменений. Если вы хотите идеальное качество "
|
113 |
+
"изображений, мы рекомендуем этот режим. Размер фалов уменьшится "
|
114 |
+
"приблизительно в 2 раза. Если вам этого недостаточно, попробуйте другие "
|
115 |
+
"режимы."
|
116 |
+
|
117 |
+
#: admin/pages/settings.php:204 admin/pages/statistic.php:354
|
118 |
+
#: includes/classes/class.media-library.php:464
|
119 |
+
#: includes/classes/class.media-library.php:495
|
120 |
+
msgid "Medium"
|
121 |
+
msgstr "Средний"
|
122 |
+
|
123 |
+
#: admin/pages/settings.php:205
|
124 |
+
msgid ""
|
125 |
+
"This mode provides an ideal optimization of your images without significant "
|
126 |
+
"quality loss. The file size will be reduced approximately 5 times with a "
|
127 |
+
"slight decrease in image quality. In most cases that cannot be seen with the "
|
128 |
+
"naked eye."
|
129 |
+
msgstr ""
|
130 |
+
"Этот режим обеспечивает идеальную оптимизацию ваших изображений без "
|
131 |
+
"существенных потерь качества. Размер файлов уменьшиться приблизительно в 5 "
|
132 |
+
"раз при незначительном снижении качества изображений. Чаще всего, "
|
133 |
+
"невооружённым взглядом это даже не заметно."
|
134 |
+
|
135 |
+
#: admin/pages/settings.php:209 admin/pages/statistic.php:355
|
136 |
+
#: includes/classes/class.media-library.php:466
|
137 |
+
#: includes/classes/class.media-library.php:501
|
138 |
+
msgid "High"
|
139 |
+
msgstr "Высокий"
|
140 |
+
|
141 |
+
#: admin/pages/settings.php:210
|
142 |
+
msgid ""
|
143 |
+
"This mode will use all available optimization methods for maximum image "
|
144 |
+
"compression. The file size will be reduced approximately 7 times. The "
|
145 |
+
"quality of some images may deteriorate slightly. Use this mode if you need "
|
146 |
+
"the maximum weight reduction, and you are ready to accept the loss of image "
|
147 |
+
"quality."
|
148 |
+
msgstr ""
|
149 |
+
"Этот режим будет использовать все доступные методы оптимизации для "
|
150 |
+
"максимального сжатия изображения. Размер файлов уменьшится приблизительно в "
|
151 |
+
"7 раз. Качество некоторых изображений может немного ухудшиться. Используйте "
|
152 |
+
"этот режим, если вам требуется максимальное снижение веса, и вы готовы "
|
153 |
+
"смириться с потерей качества изображений."
|
154 |
+
|
155 |
+
#: admin/pages/settings.php:214
|
156 |
+
msgid "Select the compression mode appropriate for your case."
|
157 |
+
msgstr "Выберите режим сжатия, подходящий для вашей ситуации."
|
158 |
+
|
159 |
+
#: admin/pages/settings.php:235
|
160 |
+
msgid "Auto optimization on upload"
|
161 |
+
msgstr "Автоматическая оптимизация изображений при загрузке"
|
162 |
+
|
163 |
+
#: admin/pages/settings.php:237
|
164 |
+
msgid ""
|
165 |
+
"Automatically compress all images that you upload directly to the WordPress "
|
166 |
+
"media library, when editing pages and posts or using themes and plugins."
|
167 |
+
msgstr ""
|
168 |
+
"Автоматическое сжатие всех изображений, которые вы загружаете в "
|
169 |
+
"медиабиблиотеку WordPress напрямую, при редактировании страниц и записей или "
|
170 |
+
"с использованием тем и плагинов."
|
171 |
+
|
172 |
+
#: admin/pages/settings.php:246
|
173 |
+
msgid "Backup images"
|
174 |
+
msgstr "Резервное копирование изображений"
|
175 |
+
|
176 |
+
#: admin/pages/settings.php:248
|
177 |
+
msgid ""
|
178 |
+
"Before optimizing, all your images will be saved in a separate folder for "
|
179 |
+
"future recovery."
|
180 |
+
msgstr ""
|
181 |
+
"Перед началом оптимизации, все ваши изображения будут сохранены в отдельной "
|
182 |
+
"папке для возможности восстановления в будущем."
|
183 |
+
|
184 |
+
#: admin/pages/settings.php:259
|
185 |
+
msgid "Enable error logging. The log will be displayed on a separate tab."
|
186 |
+
msgstr ""
|
187 |
+
"Включить ведение журнала ошибок. Он будет отображаться на отдельной вкладке."
|
188 |
+
|
189 |
+
#: admin/pages/settings.php:274
|
190 |
+
msgid "Leave EXIF data"
|
191 |
+
msgstr "Оставлять данные EXIF"
|
192 |
+
|
193 |
+
#: admin/pages/settings.php:276
|
194 |
+
msgid ""
|
195 |
+
"EXIF is information stored in photos: camera model, shutter speed, exposure "
|
196 |
+
"compensation, ISO, GPS, etc. By default, the plugin removes EXIF extended "
|
197 |
+
"data. If your project is dedicated to photography and you need to display "
|
198 |
+
"this data, then enable this option."
|
199 |
+
msgstr ""
|
200 |
+
"EXIF - это информация, хранящаяся в фотографиях: модель камеры, скорость "
|
201 |
+
"затвора, компенсация экспозиции, ISO, GPS и т. Д. По умолчанию плагин "
|
202 |
+
"удаляет расширенные данные EXIF. Если ваш проект посвящён фотографии и вам "
|
203 |
+
"нужно отображать эти данные, то включите эту опцию."
|
204 |
+
|
205 |
+
#: admin/pages/settings.php:282
|
206 |
+
msgid "Optimization"
|
207 |
+
msgstr "Оптимизация"
|
208 |
+
|
209 |
+
#: admin/pages/settings.php:282
|
210 |
+
msgid "Here you can specify additional image optimization options."
|
211 |
+
msgstr ""
|
212 |
+
"Здесь вы можете задать дополнительные параметры оптимизации изображений."
|
213 |
+
|
214 |
+
#: admin/pages/settings.php:290
|
215 |
+
msgid "Resizing large images"
|
216 |
+
msgstr "Изменение размера больших изображений"
|
217 |
+
|
218 |
+
#: admin/pages/settings.php:292
|
219 |
+
msgid ""
|
220 |
+
"When you upload images from a camera or stock, they may be too high "
|
221 |
+
"resolution and it is not necessary for web. The option allows you to "
|
222 |
+
"automatically change images resolution on upload."
|
223 |
+
msgstr ""
|
224 |
+
"Когда вы закачиваете изображения с камеры или фотостока, они могут быть "
|
225 |
+
"слишком высокого разрешения и для веба это не нужно. Опция позволяет "
|
226 |
+
"автоматически изменять разрешение изображений при загрузке."
|
227 |
+
|
228 |
+
#: admin/pages/settings.php:308
|
229 |
+
msgid "Enter the maximum size (px)"
|
230 |
+
msgstr "Введите максимальный размер (px)"
|
231 |
+
|
232 |
+
#: admin/pages/settings.php:310
|
233 |
+
msgid ""
|
234 |
+
"Set the maximum images resolution on the long side. For horizontal images, "
|
235 |
+
"this will be the width, and for vertical images - the height. The resolution "
|
236 |
+
"of the images will be changed proportionally according to the set value."
|
237 |
+
msgstr ""
|
238 |
+
"Задайте максимальное разрешение изображений по длинной стороне. Для "
|
239 |
+
"горизонтальных изображений это будет ширина, а для вертикальных — высота. "
|
240 |
+
"Разрешение изображений будет изменено пропорционально в соответствии с "
|
241 |
+
"заданным значением."
|
242 |
+
|
243 |
+
#: admin/pages/settings.php:328
|
244 |
+
msgid "Optimize thumbnails"
|
245 |
+
msgstr "Оптимизировать миниатюры"
|
246 |
+
|
247 |
+
#: admin/pages/settings.php:331
|
248 |
+
msgid ""
|
249 |
+
"Choose which sizes of thumbnails should be optimized and uncheck those that "
|
250 |
+
"do not need optimization."
|
251 |
+
msgstr ""
|
252 |
+
"Выберите какие размеры миниатюр следует оптимизировать и снимите галочки с "
|
253 |
+
"тех, оптимизация которых не нужна."
|
254 |
+
|
255 |
+
#: admin/pages/settings.php:338
|
256 |
+
msgid "Scheduled optimization"
|
257 |
+
msgstr "Оптимизация по расписанию"
|
258 |
+
|
259 |
+
#: admin/pages/settings.php:338
|
260 |
+
msgid "Schedule your images optimization."
|
261 |
+
msgstr "Настройка оптимизации изображений по расписанию."
|
262 |
+
|
263 |
+
#: admin/pages/settings.php:346
|
264 |
+
msgid "Enable Scheduled Optimization"
|
265 |
+
msgstr "Включить оптимизацию по расписанию"
|
266 |
+
|
267 |
+
#: admin/pages/settings.php:348
|
268 |
+
msgid ""
|
269 |
+
"You can enable image optimization on schedule. The plugin will optimize "
|
270 |
+
"specified number of images automatically after selected time."
|
271 |
+
msgstr ""
|
272 |
+
"Вы можете включить оптимизацию изображений по расписанию. Через выбранное "
|
273 |
+
"время плагин будет оптимизировать заданное количество изображений "
|
274 |
+
"автоматически."
|
275 |
+
|
276 |
+
#: admin/pages/settings.php:363 includes/classes/class.cron.php:56
|
277 |
+
msgid "1 min"
|
278 |
+
msgstr "1 мин"
|
279 |
+
|
280 |
+
#: admin/pages/settings.php:364 includes/classes/class.cron.php:60
|
281 |
+
msgid "2 min"
|
282 |
+
msgstr "2 мин"
|
283 |
+
|
284 |
+
#: admin/pages/settings.php:365 includes/classes/class.cron.php:64
|
285 |
+
msgid "5 min"
|
286 |
+
msgstr "5 мин"
|
287 |
+
|
288 |
+
#: admin/pages/settings.php:366 includes/classes/class.cron.php:68
|
289 |
+
msgid "10 min"
|
290 |
+
msgstr "10 мин"
|
291 |
+
|
292 |
+
#: admin/pages/settings.php:367 includes/classes/class.cron.php:72
|
293 |
+
msgid "30 min"
|
294 |
+
msgstr "30 мин"
|
295 |
+
|
296 |
+
#: admin/pages/settings.php:368
|
297 |
+
msgid "Hour"
|
298 |
+
msgstr "1 час"
|
299 |
+
|
300 |
+
#: admin/pages/settings.php:369
|
301 |
+
msgid "Day"
|
302 |
+
msgstr "1 день"
|
303 |
+
|
304 |
+
#: admin/pages/settings.php:372
|
305 |
+
msgid "Run every"
|
306 |
+
msgstr "Запускать через"
|
307 |
+
|
308 |
+
#: admin/pages/settings.php:373
|
309 |
+
msgid "Select time at which the task will be repeated."
|
310 |
+
msgstr "Выберите время, через которое будет повторяться задание."
|
311 |
+
|
312 |
+
#: admin/pages/settings.php:380
|
313 |
+
msgid "Images per iteration"
|
314 |
+
msgstr "Количество изображений за итерацию"
|
315 |
+
|
316 |
+
#: admin/pages/settings.php:382
|
317 |
+
msgid ""
|
318 |
+
"Specify the number of images that will be optimized during the job. For "
|
319 |
+
"example, if you enter 5 and select 5 min, the plugin will optimize 5 images "
|
320 |
+
"every 5 minutes."
|
321 |
+
msgstr ""
|
322 |
+
"Задайте количество изображений, которое будут оптимизировано во время "
|
323 |
+
"выполнения задания. Например, если вы введёте 5 и выберете 5 мин., то плагин "
|
324 |
+
"будет оптимизировать 5 изображений каждые 5 минут."
|
325 |
+
|
326 |
+
#: admin/pages/settings.php:411
|
327 |
+
msgid "Manage backups"
|
328 |
+
msgstr "Управление резервными копиями"
|
329 |
+
|
330 |
+
#: admin/pages/settings.php:412
|
331 |
+
msgid "You can restore the original images from a backup or clear them."
|
332 |
+
msgstr ""
|
333 |
+
"Вы можете восстановить оригинальные изображения из резервной копии или "
|
334 |
+
"очистить их."
|
335 |
+
|
336 |
+
#: admin/pages/settings.php:419
|
337 |
+
msgid "Are you sure?"
|
338 |
+
msgstr "Вы уверены?"
|
339 |
+
|
340 |
+
#: admin/pages/settings.php:419
|
341 |
+
msgid "Restore"
|
342 |
+
msgstr "Восстановить"
|
343 |
+
|
344 |
+
#: admin/pages/settings.php:420
|
345 |
+
msgid "Are you sure that you want to clear image backups folder?"
|
346 |
+
msgstr ""
|
347 |
+
"Вы действительно хотите очистить папку с резервными копиями изображений?"
|
348 |
+
|
349 |
+
#: admin/pages/settings.php:420
|
350 |
+
msgid "Clear Backup"
|
351 |
+
msgstr "Очистить резервные копии"
|
352 |
+
|
353 |
+
#: admin/pages/settings.php:427
|
354 |
+
msgid "Restore completed."
|
355 |
+
msgstr "Восстановление завершено."
|
356 |
+
|
357 |
+
#: admin/pages/settings.php:428
|
358 |
+
msgid "The backup folder was cleared."
|
359 |
+
msgstr "Папка с резервными копиями очищена."
|
360 |
+
|
361 |
+
#: admin/pages/statistic.php:46
|
362 |
+
msgid "Robin image optimizer"
|
363 |
+
msgstr ""
|
364 |
+
|
365 |
+
#: admin/pages/statistic.php:85
|
366 |
+
msgid "General"
|
367 |
+
msgstr "Основные"
|
368 |
+
|
369 |
+
#: admin/pages/statistic.php:165
|
370 |
+
msgid "Image optimization dashboard"
|
371 |
+
msgstr "Панель управления оптимизацией изображений"
|
372 |
+
|
373 |
+
#: admin/pages/statistic.php:168
|
374 |
+
msgid ""
|
375 |
+
"Monitor image optimization statistics and run on demand or scheduled "
|
376 |
+
"optimization."
|
377 |
+
msgstr ""
|
378 |
+
"Отслеживайте статистику оптимизации изображений и запускайте оптимизацию по "
|
379 |
+
"требованию или по расписанию."
|
380 |
+
|
381 |
+
#: admin/pages/statistic.php:176
|
382 |
+
msgid ""
|
383 |
+
"There are limitations for the specified server (server 1) – you can’t "
|
384 |
+
"optimize images with the size greater than <span style=\"color:red\">5MB</"
|
385 |
+
"span>. But you can enable the “Resizing large images” feature to reduce the "
|
386 |
+
"image weight due to the proportional resizing before sending the file to the "
|
387 |
+
"optimization server. "
|
388 |
+
msgstr ""
|
389 |
+
"Для выбранного вами сервера (сервер 1) есть ограничения, вы не можете "
|
390 |
+
"оптимизировать изображения весом более <span style=\"color:red\">5МБ</span>. "
|
391 |
+
"Но вы можете включить опцию \"Изменение размера больших изображений\", чтобы "
|
392 |
+
"уменьшить вес изображений за счет пропорционального изменения размера, до "
|
393 |
+
"его отправки на сервер оптимизации"
|
394 |
+
|
395 |
+
#: admin/pages/statistic.php:178
|
396 |
+
msgid ""
|
397 |
+
"There are limitations for the specified server (server 2) – you can’t "
|
398 |
+
"optimize images with the size greater than <span style=\"color:red\">1MB</"
|
399 |
+
"span>. But you can enable the “Resizing large images” feature to reduce the "
|
400 |
+
"image weight due to the proportional resizing before sending the file to the "
|
401 |
+
"optimization server. Note: this server supports only one compression mode – "
|
402 |
+
"“Normal”."
|
403 |
+
msgstr ""
|
404 |
+
"Для выбранного вами сервера (сервер 2) есть ограничения, вы не можете "
|
405 |
+
"оптимизировать изображения весом более <span style=\"color:red\">1МБ</span>. "
|
406 |
+
"Но вы можете включить опцию \"Изменение размера больших изображений\", чтобы "
|
407 |
+
"уменьшить вес изображений за счет пропорционального изменения размера, до "
|
408 |
+
"его отправки на сервер оптимизации. Также данный сервер поддерживает только "
|
409 |
+
"один режим сжатия \"Нормальный\"."
|
410 |
+
|
411 |
+
#: admin/pages/statistic.php:189
|
412 |
+
msgid "You optimized"
|
413 |
+
msgstr "Вы оптимизировали"
|
414 |
+
|
415 |
+
#: admin/pages/statistic.php:189
|
416 |
+
msgid "of your website's images"
|
417 |
+
msgstr "изображений сайта"
|
418 |
+
|
419 |
+
#: admin/pages/statistic.php:196 admin/pages/statistic.php:321
|
420 |
+
msgid "Unoptimized"
|
421 |
+
msgstr "Не оптимизировано"
|
422 |
+
|
423 |
+
#: admin/pages/statistic.php:197 admin/pages/statistic.php:322
|
424 |
+
msgid "Optimized"
|
425 |
+
msgstr "Оптимизировано"
|
426 |
+
|
427 |
+
#: admin/pages/statistic.php:198 admin/pages/statistic.php:323
|
428 |
+
msgid "Error"
|
429 |
+
msgstr "Ошибка"
|
430 |
+
|
431 |
+
#: admin/pages/statistic.php:201
|
432 |
+
msgid "Statistics"
|
433 |
+
msgstr "Статистика"
|
434 |
+
|
435 |
+
#: admin/pages/statistic.php:207
|
436 |
+
msgid ""
|
437 |
+
"that's the number of original images<br> you optimized with Image Optimizer"
|
438 |
+
msgstr ""
|
439 |
+
"количество исходных изображений<br> которые вы оптимизировали с Image "
|
440 |
+
"Optimizer"
|
441 |
+
|
442 |
+
#: admin/pages/statistic.php:213 admin/pages/statistic.php:327
|
443 |
+
msgid "Original size"
|
444 |
+
msgstr "Оригинальный размер"
|
445 |
+
|
446 |
+
#: admin/pages/statistic.php:218 admin/pages/statistic.php:332
|
447 |
+
msgid "Optimized size"
|
448 |
+
msgstr "Оптимизированный размер"
|
449 |
+
|
450 |
+
#: admin/pages/statistic.php:229
|
451 |
+
msgid "that's the size you saved <br>by using Image Optimizer"
|
452 |
+
msgstr ""
|
453 |
+
"вы сохранили благодаря<br>\n"
|
454 |
+
"Image Optimizer"
|
455 |
+
|
456 |
+
#: admin/pages/statistic.php:241 admin/pages/statistic.php:345
|
457 |
+
msgid "All images from the media library are optimized."
|
458 |
+
msgstr "Все изображения из медиабиблиотеки оптимизированы."
|
459 |
+
|
460 |
+
#: admin/pages/statistic.php:243 admin/pages/statistic.php:347
|
461 |
+
msgid "Optimization in progress. Remained"
|
462 |
+
msgstr "Идёт оптимизация. Осталось"
|
463 |
+
|
464 |
+
#: admin/pages/statistic.php:243
|
465 |
+
msgid "images."
|
466 |
+
msgstr "изображений."
|
467 |
+
|
468 |
+
#: admin/pages/statistic.php:263 admin/pages/statistic.php:271
|
469 |
+
msgid "Run"
|
470 |
+
msgstr "Запустить"
|
471 |
+
|
472 |
+
#: admin/pages/statistic.php:269 admin/pages/statistic.php:275
|
473 |
+
msgid "Stop"
|
474 |
+
msgstr "Остановить"
|
475 |
+
|
476 |
+
#: admin/pages/statistic.php:275
|
477 |
+
msgid "Do you want to start optimization without backup?"
|
478 |
+
msgstr "Вы хотите начать оптимизацию без возможности восстановления?"
|
479 |
+
|
480 |
+
#: admin/pages/statistic.php:275
|
481 |
+
msgid "Resume"
|
482 |
+
msgstr "Возобновить"
|
483 |
+
|
484 |
+
#: admin/pages/statistic.php:310
|
485 |
+
msgid "Images optimization"
|
486 |
+
msgstr "Оптимизация изображений"
|
487 |
+
|
488 |
+
#: includes/class.plugin.php:85
|
489 |
+
msgid "An invalid instance of the class was passed."
|
490 |
+
msgstr "Был принят недопустимый экземпляр класса."
|
491 |
+
|
492 |
+
#: includes/classes/class.attachment.php:163
|
493 |
+
msgid "Failed to get optimized image from remote server"
|
494 |
+
msgstr "Не удалось получить оптимизированное изображение с удаленного сервера"
|
495 |
+
|
496 |
+
#: includes/classes/class.backup.php:77
|
497 |
+
msgid "Unable to create backup folder."
|
498 |
+
msgstr "Невозможно создать папку для резервного копирования."
|
499 |
+
|
500 |
+
#: includes/classes/class.backup.php:132
|
501 |
+
msgid "Unable to create backup subfolder."
|
502 |
+
msgstr "Невозможно создать подпапку для резервного копирования."
|
503 |
+
|
504 |
+
#: includes/classes/class.backup.php:260
|
505 |
+
msgid "Unable to restore from a backup. There is no file."
|
506 |
+
msgstr "Не удалось восстановить из резервной копии. Нет файла."
|
507 |
+
|
508 |
+
#: includes/classes/class.cron.php:76
|
509 |
+
msgid "60 min"
|
510 |
+
msgstr "60 мин"
|
511 |
+
|
512 |
+
#: includes/classes/class.cron.php:80
|
513 |
+
msgid "daily"
|
514 |
+
msgstr "ежедневно"
|
515 |
+
|
516 |
+
#: includes/classes/class.image-processor-smushpro.php:43
|
517 |
+
msgid "file not found"
|
518 |
+
msgstr "файл не найден"
|
519 |
+
|
520 |
+
#: includes/classes/class.image-processor-smushpro.php:48
|
521 |
+
msgid "curl not work"
|
522 |
+
msgstr "curl не работает"
|
523 |
+
|
524 |
+
#: includes/classes/class.media-library.php:157
|
525 |
+
msgid "No access for writing backups."
|
526 |
+
msgstr "Нет доступа для записи резервных копий."
|
527 |
+
|
528 |
+
#: includes/classes/class.media-library.php:163
|
529 |
+
msgid "The uploads folder is not writable."
|
530 |
+
msgstr "Папка uploads недоступна для записи."
|
531 |
+
|
532 |
+
#: includes/classes/class.media-library.php:445
|
533 |
+
msgid "New Filesize:"
|
534 |
+
msgstr "Новый размер:"
|
535 |
+
|
536 |
+
#: includes/classes/class.media-library.php:448
|
537 |
+
msgid "Original Saving:"
|
538 |
+
msgstr "Сжатие:"
|
539 |
+
|
540 |
+
#: includes/classes/class.media-library.php:454
|
541 |
+
msgid "Original Filesize:"
|
542 |
+
msgstr "Размер оригинала:"
|
543 |
+
|
544 |
+
#: includes/classes/class.media-library.php:457
|
545 |
+
msgid "Level:"
|
546 |
+
msgstr "Уровень:"
|
547 |
+
|
548 |
+
#: includes/classes/class.media-library.php:473
|
549 |
+
msgid "Thumbnails Optimized:"
|
550 |
+
msgstr "Оптимизированные миниатюры:"
|
551 |
+
|
552 |
+
#: includes/classes/class.media-library.php:477
|
553 |
+
msgid "Overall Saving:"
|
554 |
+
msgstr "Общее сохранение:"
|
555 |
+
|
556 |
+
#: includes/classes/class.media-library.php:482
|
557 |
+
msgid "Error Message:"
|
558 |
+
msgstr "Сообщение об ошибке:"
|
559 |
+
|
560 |
+
#: includes/classes/class.media-library.php:488
|
561 |
+
#: includes/classes/class.media-library.php:494
|
562 |
+
#: includes/classes/class.media-library.php:500
|
563 |
+
#: includes/classes/class.media-library.php:515
|
564 |
+
msgid "Optimization in progress"
|
565 |
+
msgstr "Выполняется оптимизация"
|
566 |
+
|
567 |
+
#: includes/classes/class.media-library.php:489
|
568 |
+
#: includes/classes/class.media-library.php:495
|
569 |
+
#: includes/classes/class.media-library.php:501
|
570 |
+
msgid "Re-Optimize to"
|
571 |
+
msgstr "Пережать в"
|
572 |
+
|
573 |
+
#: includes/classes/class.media-library.php:506
|
574 |
+
msgid "Recovery in progress"
|
575 |
+
msgstr "Восстанавливается"
|
576 |
+
|
577 |
+
#: includes/classes/class.media-library.php:506
|
578 |
+
msgid "Restore original"
|
579 |
+
msgstr "Восстановить оригинал"
|
580 |
+
|
581 |
+
#: includes/classes/class.media-library.php:515
|
582 |
+
msgid "Optimize"
|
583 |
+
msgstr "Оптимизировать"
|
584 |
+
|
585 |
+
#: robin-image-optimizer.php:27
|
586 |
+
msgid ""
|
587 |
+
"We found that you have the \"Clearfy - wordpress optimization plugin\" "
|
588 |
+
"plugin installed, this plugin already has disable comments functions, so you "
|
589 |
+
"can deactivate plugin \"Image optimizer\"!"
|
590 |
+
msgstr ""
|
591 |
+
"Мы обнаружили, что у вас установлен плагин «Clearfy - wordpress optimization "
|
592 |
+
"plugin», этот плагин уже имеет функции оптимизации изображений, поэтому вы "
|
593 |
+
"можете отключить плагин «Оптимизатор изображений»!"
|
594 |
+
|
595 |
+
#: robin-image-optimizer.php:106
|
596 |
+
msgid "Webcraftic Robin image optimizer"
|
597 |
+
msgstr ""
|
598 |
+
|
599 |
+
#~ msgid "Webcraftic Image optimizer"
|
600 |
+
#~ msgstr "Webcraftic Image optimizer"
|
601 |
+
|
602 |
+
#~ msgid ""
|
603 |
+
#~ "Optimize images without losing quality, speed up your website load, "
|
604 |
+
#~ "improve SEO and save money on server and CDN bandwidth."
|
605 |
+
#~ msgstr ""
|
606 |
+
#~ "Оптимизируйте изображения без потери качества, ускоряйте загрузку сайта, "
|
607 |
+
#~ "улучшайте SEO и экономьте на трафик сервера и CDN."
|
608 |
+
|
609 |
+
#~ msgid "Webcraftic <wordpress.webraftic@gmail.com>"
|
610 |
+
#~ msgstr "Webcraftic <wordpress.webraftic@gmail.com>"
|
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-409 .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-409 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-409 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-409 .factory-accordion-item{display:none}.factory-bootstrap-409 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-409 .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-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:disabled,.factory-bootstrap-409 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-409 .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-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:disabled,.factory-bootstrap-409 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-409 .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-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .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-406 article,.factory-bootstrap-406 aside,.factory-bootstrap-406 details,.factory-bootstrap-406 figcaption,.factory-bootstrap-406 figure,.factory-bootstrap-406 footer,.factory-bootstrap-406 header,.factory-bootstrap-406 hgroup,.factory-bootstrap-406 main,.factory-bootstrap-406 nav,.factory-bootstrap-406 section,.factory-bootstrap-406 summary{display:block}.factory-bootstrap-406 audio,.factory-bootstrap-406 canvas,.factory-bootstrap-406 video{display:inline-block}.factory-bootstrap-406 audio:not([controls]){display:none;height:0}.factory-bootstrap-406 [hidden],.factory-bootstrap-406 template{display:none}.factory-bootstrap-406 body{margin:0}.factory-bootstrap-406 a{background:0 0}.factory-bootstrap-406 a:focus{outline:thin dotted}.factory-bootstrap-406 a:active,.factory-bootstrap-406 a:hover{outline:0}.factory-bootstrap-406 h1{margin:.67em 0}.factory-bootstrap-406 b,.factory-bootstrap-406 strong{font-weight:700}.factory-bootstrap-406 dfn{font-style:italic}.factory-bootstrap-406 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-406 mark{color:#000;background:#ff0}.factory-bootstrap-406 code,.factory-bootstrap-406 kbd,.factory-bootstrap-406 pre,.factory-bootstrap-406 samp{font-size:1em}.factory-bootstrap-406 pre{white-space:pre-wrap}.factory-bootstrap-406 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-406 sub,.factory-bootstrap-406 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-406 sup{top:-.5em}.factory-bootstrap-406 sub{bottom:-.25em}.factory-bootstrap-406 img{border:0}.factory-bootstrap-406 svg:not(:root){overflow:hidden}.factory-bootstrap-406 figure{margin:0}.factory-bootstrap-406 button,.factory-bootstrap-406 input,.factory-bootstrap-406 select,.factory-bootstrap-406 textarea{margin:0}.factory-bootstrap-406 button,.factory-bootstrap-406 select{text-transform:none}.factory-bootstrap-406 select{padding-right:4px!important}.factory-bootstrap-406 button,.factory-bootstrap-406 input[type=reset],.factory-bootstrap-406 input[type=submit],html .factory-bootstrap-406 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-406 button[disabled],html .factory-bootstrap-406 input[disabled]{cursor:default}.factory-bootstrap-406 input[type=checkbox],.factory-bootstrap-406 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-406 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-406 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-406 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-406 button::-moz-focus-inner,.factory-bootstrap-406 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-406 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-406 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-406 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-406 a,.factory-bootstrap-406 a:visited{text-decoration:underline}.factory-bootstrap-406 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-406 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-406 a[href^="javascript:"]:after,.factory-bootstrap-406 a[href^="#"]:after{content:""}.factory-bootstrap-406 blockquote,.factory-bootstrap-406 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-406 thead{display:table-header-group}.factory-bootstrap-406 img,.factory-bootstrap-406 tr{page-break-inside:avoid}.factory-bootstrap-406 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-406 h2,.factory-bootstrap-406 h3,.factory-bootstrap-406 p{orphans:3;widows:3}.factory-bootstrap-406 h2,.factory-bootstrap-406 h3{page-break-after:avoid}.factory-bootstrap-406 select{background:#fff!important}.factory-bootstrap-406 .navbar{display:none}.factory-bootstrap-406 .table td,.factory-bootstrap-406 .table th{background-color:#fff!important}.factory-bootstrap-406 .btn>.caret,.factory-bootstrap-406 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-406 .label{border:1px solid #000}.factory-bootstrap-406 .table{border-collapse:collapse!important}.factory-bootstrap-406 .table-bordered td,.factory-bootstrap-406 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-406 *,.factory-bootstrap-406 :after,.factory-bootstrap-406 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-406{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-406 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-406 button,.factory-bootstrap-406 input,.factory-bootstrap-406 select,.factory-bootstrap-406 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-406 img{vertical-align:middle}.factory-bootstrap-406 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-406 .img-rounded{border-radius:6px}.factory-bootstrap-406 .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-406 .img-circle{border-radius:50%}.factory-bootstrap-406 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-406 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-406 .h1,.factory-bootstrap-406 .h2,.factory-bootstrap-406 .h3,.factory-bootstrap-406 .h4,.factory-bootstrap-406 .h5,.factory-bootstrap-406 .h6,.factory-bootstrap-406 h1,.factory-bootstrap-406 h2,.factory-bootstrap-406 h3,.factory-bootstrap-406 h4,.factory-bootstrap-406 h5,.factory-bootstrap-406 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-406 .h1 .small,.factory-bootstrap-406 .h1 small,.factory-bootstrap-406 .h2 .small,.factory-bootstrap-406 .h2 small,.factory-bootstrap-406 .h3 .small,.factory-bootstrap-406 .h3 small,.factory-bootstrap-406 .h4 .small,.factory-bootstrap-406 .h4 small,.factory-bootstrap-406 .h5 .small,.factory-bootstrap-406 .h5 small,.factory-bootstrap-406 .h6 .small,.factory-bootstrap-406 .h6 small,.factory-bootstrap-406 h1 .small,.factory-bootstrap-406 h1 small,.factory-bootstrap-406 h2 .small,.factory-bootstrap-406 h2 small,.factory-bootstrap-406 h3 .small,.factory-bootstrap-406 h3 small,.factory-bootstrap-406 h4 .small,.factory-bootstrap-406 h4 small,.factory-bootstrap-406 h5 .small,.factory-bootstrap-406 h5 small,.factory-bootstrap-406 h6 .small,.factory-bootstrap-406 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-406 h1,.factory-bootstrap-406 h2,.factory-bootstrap-406 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-406 h1 .small,.factory-bootstrap-406 h1 small,.factory-bootstrap-406 h2 .small,.factory-bootstrap-406 h2 small,.factory-bootstrap-406 h3 .small,.factory-bootstrap-406 h3 small{font-size:65%}.factory-bootstrap-406 h4,.factory-bootstrap-406 h5,.factory-bootstrap-406 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-406 h4 .small,.factory-bootstrap-406 h4 small,.factory-bootstrap-406 h5 .small,.factory-bootstrap-406 h5 small,.factory-bootstrap-406 h6 .small,.factory-bootstrap-406 h6 small{font-size:75%}.factory-bootstrap-406 .h1,.factory-bootstrap-406 h1{font-size:36px}.factory-bootstrap-406 .h2,.factory-bootstrap-406 h2{font-size:30px}.factory-bootstrap-406 .h3,.factory-bootstrap-406 h3{font-size:24px}.factory-bootstrap-406 .h4,.factory-bootstrap-406 h4{font-size:18px}.factory-bootstrap-406 .h5,.factory-bootstrap-406 h5{font-size:14px}.factory-bootstrap-406 .h6,.factory-bootstrap-406 h6{font-size:12px}.factory-bootstrap-406 p{margin:0 0 10px}.factory-bootstrap-406 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-406 .small,.factory-bootstrap-406 small{font-size:85%}.factory-bootstrap-406 cite{font-style:normal}.factory-bootstrap-406 .text-muted{color:#999}.factory-bootstrap-406 .text-primary{color:#428bca}.factory-bootstrap-406 .text-primary:hover{color:#3071a9}.factory-bootstrap-406 .text-warning{color:#8a6d3b}.factory-bootstrap-406 .text-warning:hover{color:#66512c}.factory-bootstrap-406 .text-danger{color:#a94442}.factory-bootstrap-406 .text-danger:hover{color:#843534}.factory-bootstrap-406 .text-success{color:#3c763d}.factory-bootstrap-406 .text-success:hover{color:#2b542c}.factory-bootstrap-406 .text-info{color:#31708f}.factory-bootstrap-406 .text-info:hover{color:#245269}.factory-bootstrap-406 .text-left{text-align:left}.factory-bootstrap-406 .text-right{text-align:right}.factory-bootstrap-406 .text-center{text-align:center}.factory-bootstrap-406 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-406 ol,.factory-bootstrap-406 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-406 ol ol,.factory-bootstrap-406 ol ul,.factory-bootstrap-406 ul ol,.factory-bootstrap-406 ul ul{margin-bottom:0}.factory-bootstrap-406 .list-inline,.factory-bootstrap-406 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-406 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-406 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-406 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-406 dd,.factory-bootstrap-406 dt{line-height:1.428571429}.factory-bootstrap-406 dt{font-weight:700}.factory-bootstrap-406 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-406 abbr[data-original-title],.factory-bootstrap-406 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-406 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-406 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-406 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-406 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-406 blockquote .small,.factory-bootstrap-406 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-406 blockquote .small:before,.factory-bootstrap-406 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-406 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-406 blockquote.pull-right .small,.factory-bootstrap-406 blockquote.pull-right p,.factory-bootstrap-406 blockquote.pull-right small{text-align:right}.factory-bootstrap-406 blockquote.pull-right .small:before,.factory-bootstrap-406 blockquote.pull-right small:before{content:''}.factory-bootstrap-406 blockquote.pull-right .small:after,.factory-bootstrap-406 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-406 blockquote:after,.factory-bootstrap-406 blockquote:before{content:""}.factory-bootstrap-406 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-406 code,.factory-bootstrap-406 kbd,.factory-bootstrap-406 pre,.factory-bootstrap-406 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-406 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-406 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-406 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-406 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-406 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-406 .container:after,.factory-bootstrap-406 .container:before{display:table;content:" "}.factory-bootstrap-406 .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-406 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-406 .row:after,.factory-bootstrap-406 .row:before{display:table;content:" "}.factory-bootstrap-406 .row:after{clear:both}.factory-bootstrap-406 .col-lg-1,.factory-bootstrap-406 .col-lg-10,.factory-bootstrap-406 .col-lg-11,.factory-bootstrap-406 .col-lg-12,.factory-bootstrap-406 .col-lg-2,.factory-bootstrap-406 .col-lg-3,.factory-bootstrap-406 .col-lg-4,.factory-bootstrap-406 .col-lg-5,.factory-bootstrap-406 .col-lg-6,.factory-bootstrap-406 .col-lg-7,.factory-bootstrap-406 .col-lg-8,.factory-bootstrap-406 .col-lg-9,.factory-bootstrap-406 .col-md-1,.factory-bootstrap-406 .col-md-10,.factory-bootstrap-406 .col-md-11,.factory-bootstrap-406 .col-md-12,.factory-bootstrap-406 .col-md-2,.factory-bootstrap-406 .col-md-3,.factory-bootstrap-406 .col-md-4,.factory-bootstrap-406 .col-md-5,.factory-bootstrap-406 .col-md-6,.factory-bootstrap-406 .col-md-7,.factory-bootstrap-406 .col-md-8,.factory-bootstrap-406 .col-md-9,.factory-bootstrap-406 .col-sm-1,.factory-bootstrap-406 .col-sm-10,.factory-bootstrap-406 .col-sm-11,.factory-bootstrap-406 .col-sm-12,.factory-bootstrap-406 .col-sm-2,.factory-bootstrap-406 .col-sm-3,.factory-bootstrap-406 .col-sm-4,.factory-bootstrap-406 .col-sm-5,.factory-bootstrap-406 .col-sm-6,.factory-bootstrap-406 .col-sm-7,.factory-bootstrap-406 .col-sm-8,.factory-bootstrap-406 .col-sm-9,.factory-bootstrap-406 .col-xs-1,.factory-bootstrap-406 .col-xs-10,.factory-bootstrap-406 .col-xs-11,.factory-bootstrap-406 .col-xs-12,.factory-bootstrap-406 .col-xs-2,.factory-bootstrap-406 .col-xs-3,.factory-bootstrap-406 .col-xs-4,.factory-bootstrap-406 .col-xs-5,.factory-bootstrap-406 .col-xs-6,.factory-bootstrap-406 .col-xs-7,.factory-bootstrap-406 .col-xs-8,.factory-bootstrap-406 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-406 .col-xs-1,.factory-bootstrap-406 .col-xs-10,.factory-bootstrap-406 .col-xs-11,.factory-bootstrap-406 .col-xs-12,.factory-bootstrap-406 .col-xs-2,.factory-bootstrap-406 .col-xs-3,.factory-bootstrap-406 .col-xs-4,.factory-bootstrap-406 .col-xs-5,.factory-bootstrap-406 .col-xs-6,.factory-bootstrap-406 .col-xs-7,.factory-bootstrap-406 .col-xs-8,.factory-bootstrap-406 .col-xs-9{float:left}.factory-bootstrap-406 .col-xs-12{width:100%}.factory-bootstrap-406 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-406 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-406 .col-xs-9{width:75%}.factory-bootstrap-406 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-406 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-406 .col-xs-6{width:50%}.factory-bootstrap-406 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-406 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-406 .col-xs-3{width:25%}.factory-bootstrap-406 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-406 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-406 .col-xs-pull-12{right:100%}.factory-bootstrap-406 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-406 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-406 .col-xs-pull-9{right:75%}.factory-bootstrap-406 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-406 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-406 .col-xs-pull-6{right:50%}.factory-bootstrap-406 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-406 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-406 .col-xs-pull-3{right:25%}.factory-bootstrap-406 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-406 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-406 .col-xs-pull-0{right:0}.factory-bootstrap-406 .col-xs-push-12{left:100%}.factory-bootstrap-406 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-406 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-406 .col-xs-push-9{left:75%}.factory-bootstrap-406 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-406 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-406 .col-xs-push-6{left:50%}.factory-bootstrap-406 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-406 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-406 .col-xs-push-3{left:25%}.factory-bootstrap-406 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-406 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-406 .col-xs-push-0{left:0}.factory-bootstrap-406 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-406 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-406 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-406 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-406 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-406 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-406 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-406 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-406 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-406 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-406 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-406 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-406 .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-406 table{max-width:100%;background-color:transparent}.factory-bootstrap-406 th{text-align:left}.factory-bootstrap-406 .table{width:100%;margin-bottom:20px}.factory-bootstrap-406 .table>tbody>tr>td,.factory-bootstrap-406 .table>tbody>tr>th,.factory-bootstrap-406 .table>tfoot>tr>td,.factory-bootstrap-406 .table>tfoot>tr>th,.factory-bootstrap-406 .table>thead>tr>td,.factory-bootstrap-406 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-406 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-406 .table>caption+thead>tr:first-child>td,.factory-bootstrap-406 .table>caption+thead>tr:first-child>th,.factory-bootstrap-406 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-406 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-406 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-406 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-406 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-406 .table .table{background-color:#fff}.factory-bootstrap-406 .table-condensed>tbody>tr>td,.factory-bootstrap-406 .table-condensed>tbody>tr>th,.factory-bootstrap-406 .table-condensed>tfoot>tr>td,.factory-bootstrap-406 .table-condensed>tfoot>tr>th,.factory-bootstrap-406 .table-condensed>thead>tr>td,.factory-bootstrap-406 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-406 .table-bordered,.factory-bootstrap-406 .table-bordered>tbody>tr>td,.factory-bootstrap-406 .table-bordered>tbody>tr>th,.factory-bootstrap-406 .table-bordered>tfoot>tr>td,.factory-bootstrap-406 .table-bordered>tfoot>tr>th,.factory-bootstrap-406 .table-bordered>thead>tr>td,.factory-bootstrap-406 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-406 .table-bordered>thead>tr>td,.factory-bootstrap-406 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-406 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-406 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-406 .table-hover>tbody>tr:hover>td,.factory-bootstrap-406 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-406 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-406 table td[class*=col-],.factory-bootstrap-406 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-406 .table>tbody>.active>td,.factory-bootstrap-406 .table>tbody>.active>th,.factory-bootstrap-406 .table>tbody>tr>.active,.factory-bootstrap-406 .table>tfoot>.active>td,.factory-bootstrap-406 .table>tfoot>.active>th,.factory-bootstrap-406 .table>tfoot>tr>.active,.factory-bootstrap-406 .table>thead>.active>td,.factory-bootstrap-406 .table>thead>.active>th,.factory-bootstrap-406 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-406 .table-hover>tbody>.active:hover>td,.factory-bootstrap-406 .table-hover>tbody>.active:hover>th,.factory-bootstrap-406 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-406 .table>tbody>.success>td,.factory-bootstrap-406 .table>tbody>.success>th,.factory-bootstrap-406 .table>tbody>tr>.success,.factory-bootstrap-406 .table>tfoot>.success>td,.factory-bootstrap-406 .table>tfoot>.success>th,.factory-bootstrap-406 .table>tfoot>tr>.success,.factory-bootstrap-406 .table>thead>.success>td,.factory-bootstrap-406 .table>thead>.success>th,.factory-bootstrap-406 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-406 .table-hover>tbody>.success:hover>td,.factory-bootstrap-406 .table-hover>tbody>.success:hover>th,.factory-bootstrap-406 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-406 .table>tbody>.danger>td,.factory-bootstrap-406 .table>tbody>.danger>th,.factory-bootstrap-406 .table>tbody>tr>.danger,.factory-bootstrap-406 .table>tfoot>.danger>td,.factory-bootstrap-406 .table>tfoot>.danger>th,.factory-bootstrap-406 .table>tfoot>tr>.danger,.factory-bootstrap-406 .table>thead>.danger>td,.factory-bootstrap-406 .table>thead>.danger>th,.factory-bootstrap-406 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-406 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-406 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-406 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-406 .table>tbody>.warning>td,.factory-bootstrap-406 .table>tbody>.warning>th,.factory-bootstrap-406 .table>tbody>tr>.warning,.factory-bootstrap-406 .table>tfoot>.warning>td,.factory-bootstrap-406 .table>tfoot>.warning>th,.factory-bootstrap-406 .table>tfoot>tr>.warning,.factory-bootstrap-406 .table>thead>.warning>td,.factory-bootstrap-406 .table>thead>.warning>th,.factory-bootstrap-406 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-406 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-406 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-406 .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-406 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-406 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-406 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-406 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-406 input[type=checkbox],.factory-bootstrap-406 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-406 input[type=file]{display:block}.factory-bootstrap-406 select[multiple],.factory-bootstrap-406 select[size]{height:auto}.factory-bootstrap-406 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-406 input[type=checkbox]:focus,.factory-bootstrap-406 input[type=file]:focus,.factory-bootstrap-406 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-406 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-406 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-406 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-406 .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-406 .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-406 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-406 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-406 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-406 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-406 .form-control[disabled],.factory-bootstrap-406 .form-control[readonly],.factory-bootstrap-406 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-406 textarea.form-control{height:auto}.factory-bootstrap-406 .form-group{margin-bottom:15px}.factory-bootstrap-406 .checkbox,.factory-bootstrap-406 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-406 .checkbox label,.factory-bootstrap-406 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-406 .checkbox input[type=checkbox],.factory-bootstrap-406 .checkbox-inline input[type=checkbox],.factory-bootstrap-406 .radio input[type=radio],.factory-bootstrap-406 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-406 .checkbox+.checkbox,.factory-bootstrap-406 .radio+.radio{margin-top:-5px}.factory-bootstrap-406 .checkbox-inline,.factory-bootstrap-406 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-406 .checkbox-inline+.checkbox-inline,.factory-bootstrap-406 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-406 .checkbox-inline[disabled],.factory-bootstrap-406 .checkbox[disabled],.factory-bootstrap-406 .radio-inline[disabled],.factory-bootstrap-406 .radio[disabled],.factory-bootstrap-406 fieldset[disabled] .checkbox,.factory-bootstrap-406 fieldset[disabled] .checkbox-inline,.factory-bootstrap-406 fieldset[disabled] .radio,.factory-bootstrap-406 fieldset[disabled] .radio-inline,.factory-bootstrap-406 fieldset[disabled] input[type=checkbox],.factory-bootstrap-406 fieldset[disabled] input[type=radio],.factory-bootstrap-406 input[type=checkbox][disabled],.factory-bootstrap-406 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-406 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-406 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-406 textarea.input-sm{height:auto}.factory-bootstrap-406 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-406 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-406 textarea.input-lg{height:auto}.factory-bootstrap-406 .has-warning .checkbox,.factory-bootstrap-406 .has-warning .checkbox-inline,.factory-bootstrap-406 .has-warning .control-label,.factory-bootstrap-406 .has-warning .help-block,.factory-bootstrap-406 .has-warning .radio,.factory-bootstrap-406 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-406 .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-406 .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-406 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-406 .has-error .checkbox,.factory-bootstrap-406 .has-error .checkbox-inline,.factory-bootstrap-406 .has-error .control-label,.factory-bootstrap-406 .has-error .help-block,.factory-bootstrap-406 .has-error .radio,.factory-bootstrap-406 .has-error .radio-inline{color:#a94442}.factory-bootstrap-406 .controls{display:block}.factory-bootstrap-406 .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-406 .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-406 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-406 .has-success .checkbox,.factory-bootstrap-406 .has-success .checkbox-inline,.factory-bootstrap-406 .has-success .control-label,.factory-bootstrap-406 .has-success .help-block,.factory-bootstrap-406 .has-success .radio,.factory-bootstrap-406 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-406 .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-406 .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-406 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-406 .form-control-static{margin-bottom:0}.factory-bootstrap-406 .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-406 .form-horizontal .checkbox,.factory-bootstrap-406 .form-horizontal .checkbox-inline,.factory-bootstrap-406 .form-horizontal .control-label,.factory-bootstrap-406 .form-horizontal .radio,.factory-bootstrap-406 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-406 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-406 .form-horizontal .checkbox,.factory-bootstrap-406 .form-horizontal .radio{min-height:27px}.factory-bootstrap-406 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-406 .form-horizontal .form-group:after,.factory-bootstrap-406 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-406 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-406 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-406 .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-406 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-406 .btn{text-decoration:none}.factory-bootstrap-406 .btn:focus,.factory-bootstrap-406 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-406 .btn.disabled,.factory-bootstrap-406 .btn[disabled],.factory-bootstrap-406 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-406 .btn-default.active,.factory-bootstrap-406 .btn-default:active,.factory-bootstrap-406 .btn-default:focus,.factory-bootstrap-406 .btn-default:hover,.factory-bootstrap-406 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-406 .btn-default.active,.factory-bootstrap-406 .btn-default:active,.factory-bootstrap-406 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-406 .btn-default.disabled,.factory-bootstrap-406 .btn-default.disabled.active,.factory-bootstrap-406 .btn-default.disabled:active,.factory-bootstrap-406 .btn-default.disabled:focus,.factory-bootstrap-406 .btn-default.disabled:hover,.factory-bootstrap-406 .btn-default[disabled],.factory-bootstrap-406 .btn-default[disabled].active,.factory-bootstrap-406 .btn-default[disabled]:active,.factory-bootstrap-406 .btn-default[disabled]:focus,.factory-bootstrap-406 .btn-default[disabled]:hover,.factory-bootstrap-406 fieldset[disabled] .btn-default,.factory-bootstrap-406 fieldset[disabled] .btn-default.active,.factory-bootstrap-406 fieldset[disabled] .btn-default:active,.factory-bootstrap-406 fieldset[disabled] .btn-default:focus,.factory-bootstrap-406 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-406 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-406 .btn-primary.active,.factory-bootstrap-406 .btn-primary:active,.factory-bootstrap-406 .btn-primary:focus,.factory-bootstrap-406 .btn-primary:hover,.factory-bootstrap-406 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-406 .btn-primary.active,.factory-bootstrap-406 .btn-primary:active,.factory-bootstrap-406 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-406 .btn-primary.disabled,.factory-bootstrap-406 .btn-primary.disabled.active,.factory-bootstrap-406 .btn-primary.disabled:active,.factory-bootstrap-406 .btn-primary.disabled:focus,.factory-bootstrap-406 .btn-primary.disabled:hover,.factory-bootstrap-406 .btn-primary[disabled],.factory-bootstrap-406 .btn-primary[disabled].active,.factory-bootstrap-406 .btn-primary[disabled]:active,.factory-bootstrap-406 .btn-primary[disabled]:focus,.factory-bootstrap-406 .btn-primary[disabled]:hover,.factory-bootstrap-406 fieldset[disabled] .btn-primary,.factory-bootstrap-406 fieldset[disabled] .btn-primary.active,.factory-bootstrap-406 fieldset[disabled] .btn-primary:active,.factory-bootstrap-406 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-406 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-406 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-406 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-406 .btn-warning.active,.factory-bootstrap-406 .btn-warning:active,.factory-bootstrap-406 .btn-warning:focus,.factory-bootstrap-406 .btn-warning:hover,.factory-bootstrap-406 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-406 .btn-warning.active,.factory-bootstrap-406 .btn-warning:active,.factory-bootstrap-406 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-406 .btn-warning.disabled,.factory-bootstrap-406 .btn-warning.disabled.active,.factory-bootstrap-406 .btn-warning.disabled:active,.factory-bootstrap-406 .btn-warning.disabled:focus,.factory-bootstrap-406 .btn-warning.disabled:hover,.factory-bootstrap-406 .btn-warning[disabled],.factory-bootstrap-406 .btn-warning[disabled].active,.factory-bootstrap-406 .btn-warning[disabled]:active,.factory-bootstrap-406 .btn-warning[disabled]:focus,.factory-bootstrap-406 .btn-warning[disabled]:hover,.factory-bootstrap-406 fieldset[disabled] .btn-warning,.factory-bootstrap-406 fieldset[disabled] .btn-warning.active,.factory-bootstrap-406 fieldset[disabled] .btn-warning:active,.factory-bootstrap-406 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-406 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-406 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-406 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-406 .btn-success.active,.factory-bootstrap-406 .btn-success:active,.factory-bootstrap-406 .btn-success:focus,.factory-bootstrap-406 .btn-success:hover,.factory-bootstrap-406 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-406 .btn-success.active,.factory-bootstrap-406 .btn-success:active,.factory-bootstrap-406 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-406 .btn-success.disabled,.factory-bootstrap-406 .btn-success.disabled.active,.factory-bootstrap-406 .btn-success.disabled:active,.factory-bootstrap-406 .btn-success.disabled:focus,.factory-bootstrap-406 .btn-success.disabled:hover,.factory-bootstrap-406 .btn-success[disabled],.factory-bootstrap-406 .btn-success[disabled].active,.factory-bootstrap-406 .btn-success[disabled]:active,.factory-bootstrap-406 .btn-success[disabled]:focus,.factory-bootstrap-406 .btn-success[disabled]:hover,.factory-bootstrap-406 fieldset[disabled] .btn-success,.factory-bootstrap-406 fieldset[disabled] .btn-success.active,.factory-bootstrap-406 fieldset[disabled] .btn-success:active,.factory-bootstrap-406 fieldset[disabled] .btn-success:focus,.factory-bootstrap-406 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-406 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-406 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-406 .btn-info.active,.factory-bootstrap-406 .btn-info:active,.factory-bootstrap-406 .btn-info:focus,.factory-bootstrap-406 .btn-info:hover,.factory-bootstrap-406 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-406 .btn-info.active,.factory-bootstrap-406 .btn-info:active,.factory-bootstrap-406 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-406 .btn-info.disabled,.factory-bootstrap-406 .btn-info.disabled.active,.factory-bootstrap-406 .btn-info.disabled:active,.factory-bootstrap-406 .btn-info.disabled:focus,.factory-bootstrap-406 .btn-info.disabled:hover,.factory-bootstrap-406 .btn-info[disabled],.factory-bootstrap-406 .btn-info[disabled].active,.factory-bootstrap-406 .btn-info[disabled]:active,.factory-bootstrap-406 .btn-info[disabled]:focus,.factory-bootstrap-406 .btn-info[disabled]:hover,.factory-bootstrap-406 fieldset[disabled] .btn-info,.factory-bootstrap-406 fieldset[disabled] .btn-info.active,.factory-bootstrap-406 fieldset[disabled] .btn-info:active,.factory-bootstrap-406 fieldset[disabled] .btn-info:focus,.factory-bootstrap-406 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-406 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-406 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-406 .btn-link,.factory-bootstrap-406 .btn-link:active,.factory-bootstrap-406 .btn-link[disabled],.factory-bootstrap-406 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-406 .btn-link,.factory-bootstrap-406 .btn-link:active,.factory-bootstrap-406 .btn-link:focus,.factory-bootstrap-406 .btn-link:hover{border-color:transparent}.factory-bootstrap-406 .btn-link:focus,.factory-bootstrap-406 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-406 .btn-link[disabled]:focus,.factory-bootstrap-406 .btn-link[disabled]:hover,.factory-bootstrap-406 fieldset[disabled] .btn-link:focus,.factory-bootstrap-406 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-406 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-406 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-406 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-406 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-406 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-406 input[type=button].btn-block,.factory-bootstrap-406 input[type=reset].btn-block,.factory-bootstrap-406 input[type=submit].btn-block{width:100%}.factory-bootstrap-406 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-406 .fade.in{opacity:1}.factory-bootstrap-406 .collapse{display:none}.factory-bootstrap-406 .collapse.in{display:block}.factory-bootstrap-406 .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-406 .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-406 .glyphicon:empty{width:1em}.factory-bootstrap-406 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-406 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-406 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-406 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-406 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-406 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-406 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-406 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-406 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-406 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-406 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-406 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-406 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-406 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-406 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-406 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-406 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-406 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-406 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-406 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-406 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-406 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-406 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-406 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-406 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-406 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-406 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-406 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-406 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-406 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-406 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-406 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-406 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-406 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-406 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-406 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-406 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-406 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-406 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-406 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-406 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-406 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-406 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-406 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-406 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-406 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-406 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-406 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-406 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-406 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-406 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-406 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-406 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-406 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-406 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-406 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-406 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-406 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-406 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-406 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-406 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-406 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-406 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-406 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-406 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-406 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-406 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-406 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-406 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-406 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-406 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-406 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-406 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-406 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-406 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-406 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-406 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-406 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-406 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-406 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-406 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-406 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-406 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-406 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-406 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-406 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-406 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-406 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-406 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-406 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-406 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-406 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-406 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-406 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-406 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-406 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-406 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-406 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-406 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-406 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-406 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-406 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-406 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-406 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-406 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-406 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-406 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-406 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-406 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-406 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-406 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-406 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-406 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-406 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-406 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-406 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-406 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-406 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-406 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-406 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-406 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-406 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-406 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-406 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-406 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-406 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-406 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-406 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-406 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-406 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-406 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-406 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-406 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-406 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-406 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-406 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-406 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-406 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-406 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-406 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-406 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-406 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-406 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-406 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-406 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-406 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-406 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-406 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-406 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-406 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-406 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-406 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-406 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-406 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-406 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-406 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-406 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-406 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-406 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-406 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-406 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-406 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-406 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-406 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-406 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-406 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-406 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-406 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-406 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-406 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-406 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-406 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-406 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-406 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-406 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-406 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-406 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-406 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-406 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-406 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-406 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-406 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-406 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-406 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-406 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-406 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-406 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-406 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-406 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-406 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-406 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-406 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-406 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-406 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-406 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-406 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-406 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-406 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-406 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-406 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-406 .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-406 .dropdown{position:relative}.factory-bootstrap-406 .dropdown-toggle:focus{outline:0}.factory-bootstrap-406 .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-406 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-406 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-406 .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-406 .dropdown-menu>li>a:focus,.factory-bootstrap-406 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-406 .dropdown-menu>.active>a,.factory-bootstrap-406 .dropdown-menu>.active>a:focus,.factory-bootstrap-406 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-406 .dropdown-menu>.disabled>a,.factory-bootstrap-406 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-406 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-406 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-406 .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-406 .open>.dropdown-menu{display:block}.factory-bootstrap-406 .open>a{outline:0}.factory-bootstrap-406 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-406 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-406 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-406 .dropup .caret,.factory-bootstrap-406 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-406 .dropup .dropdown-menu,.factory-bootstrap-406 .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-406 .btn-group,.factory-bootstrap-406 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-406 .btn-group-vertical>.btn,.factory-bootstrap-406 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-406 .btn-group-vertical>.btn.active,.factory-bootstrap-406 .btn-group-vertical>.btn:active,.factory-bootstrap-406 .btn-group-vertical>.btn:focus,.factory-bootstrap-406 .btn-group-vertical>.btn:hover,.factory-bootstrap-406 .btn-group>.btn.active,.factory-bootstrap-406 .btn-group>.btn:active,.factory-bootstrap-406 .btn-group>.btn:focus,.factory-bootstrap-406 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-406 .btn-group-vertical>.btn:focus,.factory-bootstrap-406 .btn-group>.btn:focus{outline:0}.factory-bootstrap-406 .btn-group .btn+.btn,.factory-bootstrap-406 .btn-group .btn+.btn-group,.factory-bootstrap-406 .btn-group .btn-group+.btn,.factory-bootstrap-406 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-406 .btn-toolbar:after,.factory-bootstrap-406 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-406 .btn-toolbar:after{clear:both}.factory-bootstrap-406 .btn-toolbar .btn-group{float:left}.factory-bootstrap-406 .btn-toolbar>.btn+.btn,.factory-bootstrap-406 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-406 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-406 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-406 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-406 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-406 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-406 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-406 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-406 .btn-group>.btn-group{float:left}.factory-bootstrap-406 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-406 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-406 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-406 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-406 .btn-group .dropdown-toggle:active,.factory-bootstrap-406 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-406 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-406 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-406 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-406 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-406 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-406 .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-406 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-406 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-406 .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-406 .btn .caret{margin-left:0}.factory-bootstrap-406 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-406 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-406 .btn-group-vertical>.btn,.factory-bootstrap-406 .btn-group-vertical>.btn-group,.factory-bootstrap-406 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-406 .btn-group-vertical>.btn-group:after,.factory-bootstrap-406 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-406 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-406 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-406 .btn-group-vertical>.btn+.btn,.factory-bootstrap-406 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-406 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-406 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-406 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-406 .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-406 .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-406 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-406 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-406 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-406 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-406 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-406 .btn-group-justified>.btn,.factory-bootstrap-406 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-406 .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-406 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-406 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-406 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-406 .input-group-lg>.form-control,.factory-bootstrap-406 .input-group-lg>.input-group-addon,.factory-bootstrap-406 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-406 select.input-group-lg>.form-control,.factory-bootstrap-406 select.input-group-lg>.input-group-addon,.factory-bootstrap-406 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-406 textarea.input-group-lg>.form-control,.factory-bootstrap-406 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-406 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-406 .input-group-sm>.form-control,.factory-bootstrap-406 .input-group-sm>.input-group-addon,.factory-bootstrap-406 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-406 select.input-group-sm>.form-control,.factory-bootstrap-406 select.input-group-sm>.input-group-addon,.factory-bootstrap-406 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-406 textarea.input-group-sm>.form-control,.factory-bootstrap-406 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-406 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-406 .input-group .form-control,.factory-bootstrap-406 .input-group-addon,.factory-bootstrap-406 .input-group-btn{display:table-cell}.factory-bootstrap-406 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-406 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-406 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-406 .input-group-addon,.factory-bootstrap-406 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-406 .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-406 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-406 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-406 .input-group-addon input[type=checkbox],.factory-bootstrap-406 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-406 .input-group .form-control:first-child,.factory-bootstrap-406 .input-group-addon:first-child,.factory-bootstrap-406 .input-group-btn:first-child>.btn,.factory-bootstrap-406 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-406 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-406 .input-group-addon:first-child{border-right:0}.factory-bootstrap-406 .input-group .form-control:last-child,.factory-bootstrap-406 .input-group-addon:last-child,.factory-bootstrap-406 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-406 .input-group-btn:last-child>.btn,.factory-bootstrap-406 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-406 .input-group-addon:last-child{border-left:0}.factory-bootstrap-406 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-406 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-406 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-406 .input-group-btn>.btn{position:relative}.factory-bootstrap-406 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-406 .input-group-btn>.btn:active,.factory-bootstrap-406 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-406 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-406 .nav:after,.factory-bootstrap-406 .nav:before{display:table;content:" "}.factory-bootstrap-406 .nav:after{clear:both}.factory-bootstrap-406 .nav>li{position:relative;display:block}.factory-bootstrap-406 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-406 .nav>li>a:focus,.factory-bootstrap-406 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-406 .nav>li.disabled>a{color:#999}.factory-bootstrap-406 .nav>li.disabled>a:focus,.factory-bootstrap-406 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-406 .nav .open>a,.factory-bootstrap-406 .nav .open>a:focus,.factory-bootstrap-406 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-406 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-406 .nav>li>a>img{max-width:none}.factory-bootstrap-406 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-406 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-406 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-406 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-406 .nav-tabs>li.active>a,.factory-bootstrap-406 .nav-tabs>li.active>a:focus,.factory-bootstrap-406 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-406 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-406 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-406 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-406 .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-406 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-406 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-406 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-406 .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-406 .nav-pills>li{float:left}.factory-bootstrap-406 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-406 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-406 .nav-pills>li.active>a,.factory-bootstrap-406 .nav-pills>li.active>a:focus,.factory-bootstrap-406 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-406 .nav-stacked>li{float:none}.factory-bootstrap-406 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-406 .nav-justified{width:100%}.factory-bootstrap-406 .nav-justified>li{float:none}.factory-bootstrap-406 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-406 .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-406 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-406 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-406 .nav-tabs-justified>.active>a,.factory-bootstrap-406 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-406 .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-406 .tab-content>.tab-pane{display:none}.factory-bootstrap-406 .tab-content>.active{display:block}.factory-bootstrap-406 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-406 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-406 .navbar:after,.factory-bootstrap-406 .navbar:before{display:table;content:" "}.factory-bootstrap-406 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-406 .navbar-header:after,.factory-bootstrap-406 .navbar-header:before{display:table;content:" "}.factory-bootstrap-406 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-406 .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-406 .navbar-collapse:after,.factory-bootstrap-406 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-406 .navbar-collapse:after{clear:both}.factory-bootstrap-406 .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-406 .container>.navbar-collapse,.factory-bootstrap-406 .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-406 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-406 .navbar-fixed-bottom,.factory-bootstrap-406 .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-406 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-406 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-406 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-406 .navbar-brand:focus,.factory-bootstrap-406 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-406 .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-406 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-406 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-406 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-406 .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-406 .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-406 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-406 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-406 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-406 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-406 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-406 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-406 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-406 .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-406 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-406 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-406 .navbar-default .navbar-brand:focus,.factory-bootstrap-406 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-406 .navbar-default .navbar-nav>li>a,.factory-bootstrap-406 .navbar-default .navbar-text{color:#777}.factory-bootstrap-406 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-406 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-406 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-406 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-406 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-406 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-406 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-406 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-406 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-406 .navbar-default .navbar-toggle:focus,.factory-bootstrap-406 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-406 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-406 .navbar-default .navbar-collapse,.factory-bootstrap-406 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-406 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-406 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-406 .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-406 .navbar-default .navbar-link{color:#777}.factory-bootstrap-406 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-406 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-406 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-406 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-406 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-406 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-406 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-406 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-406 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-406 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-406 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-406 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-406 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-406 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-406 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-406 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-406 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-406 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-406 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-406 .navbar-inverse .navbar-collapse,.factory-bootstrap-406 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-406 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-406 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-406 .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-406 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-406 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-406 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-406 .breadcrumb>li{display:inline-block}.factory-bootstrap-406 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-406 .breadcrumb>.active{color:#999}.factory-bootstrap-406 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-406 .pagination>li{display:inline}.factory-bootstrap-406 .pagination>li>a,.factory-bootstrap-406 .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-406 .pagination>li:first-child>a,.factory-bootstrap-406 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-406 .pagination>li:last-child>a,.factory-bootstrap-406 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-406 .pagination>li>a:focus,.factory-bootstrap-406 .pagination>li>a:hover,.factory-bootstrap-406 .pagination>li>span:focus,.factory-bootstrap-406 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-406 .pagination>.active>a,.factory-bootstrap-406 .pagination>.active>a:focus,.factory-bootstrap-406 .pagination>.active>a:hover,.factory-bootstrap-406 .pagination>.active>span,.factory-bootstrap-406 .pagination>.active>span:focus,.factory-bootstrap-406 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-406 .pagination>.disabled>a,.factory-bootstrap-406 .pagination>.disabled>a:focus,.factory-bootstrap-406 .pagination>.disabled>a:hover,.factory-bootstrap-406 .pagination>.disabled>span,.factory-bootstrap-406 .pagination>.disabled>span:focus,.factory-bootstrap-406 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-406 .pagination-lg>li>a,.factory-bootstrap-406 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-406 .pagination-lg>li:first-child>a,.factory-bootstrap-406 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-406 .pagination-lg>li:last-child>a,.factory-bootstrap-406 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-406 .pagination-sm>li>a,.factory-bootstrap-406 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-406 .pagination-sm>li:first-child>a,.factory-bootstrap-406 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-406 .pagination-sm>li:last-child>a,.factory-bootstrap-406 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-406 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-406 .pager:after,.factory-bootstrap-406 .pager:before{display:table;content:" "}.factory-bootstrap-406 .pager:after{clear:both}.factory-bootstrap-406 .pager li{display:inline}.factory-bootstrap-406 .pager li>a,.factory-bootstrap-406 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-406 .pager li>a:focus,.factory-bootstrap-406 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-406 .pager .next>a,.factory-bootstrap-406 .pager .next>span{float:right}.factory-bootstrap-406 .pager .previous>a,.factory-bootstrap-406 .pager .previous>span{float:left}.factory-bootstrap-406 .pager .disabled>a,.factory-bootstrap-406 .pager .disabled>a:focus,.factory-bootstrap-406 .pager .disabled>a:hover,.factory-bootstrap-406 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-406 .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-406 .label[href]:focus,.factory-bootstrap-406 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-406 .label:empty{display:none}.factory-bootstrap-406 .btn .label{position:relative;top:-1px}.factory-bootstrap-406 .label-default{background-color:#999}.factory-bootstrap-406 .label-default[href]:focus,.factory-bootstrap-406 .label-default[href]:hover{background-color:gray}.factory-bootstrap-406 .label-primary{background-color:#428bca}.factory-bootstrap-406 .label-primary[href]:focus,.factory-bootstrap-406 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-406 .label-success{background-color:#5cb85c}.factory-bootstrap-406 .label-success[href]:focus,.factory-bootstrap-406 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-406 .label-info{background-color:#5bc0de}.factory-bootstrap-406 .label-info[href]:focus,.factory-bootstrap-406 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-406 .label-warning{background-color:#f0ad4e}.factory-bootstrap-406 .label-warning[href]:focus,.factory-bootstrap-406 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-406 .label-danger{background-color:#d9534f}.factory-bootstrap-406 .label-danger[href]:focus,.factory-bootstrap-406 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-406 .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-406 .badge:empty{display:none}.factory-bootstrap-406 .btn .badge{position:relative;top:-1px}.factory-bootstrap-406 a.badge:focus,.factory-bootstrap-406 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-406 .nav-pills>.active>a>.badge,.factory-bootstrap-406 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-406 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-406 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-406 .jumbotron .h1,.factory-bootstrap-406 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-406 .jumbotron p{line-height:1.4}.factory-bootstrap-406 .container .jumbotron{border-radius:6px}.factory-bootstrap-406 .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-406 .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-406 .thumbnail a>img,.factory-bootstrap-406 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-406 a.thumbnail.active,.factory-bootstrap-406 a.thumbnail:focus,.factory-bootstrap-406 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-406 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-406 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-406 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-406 .alert .alert-link{font-weight:700}.factory-bootstrap-406 .alert>p,.factory-bootstrap-406 .alert>ul{margin-bottom:0}.factory-bootstrap-406 .alert>p+p{margin-top:5px}.factory-bootstrap-406 .alert-dismissable{padding-right:35px}.factory-bootstrap-406 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-406 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-406 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-406 .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-406 .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-406 .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-406 .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-406 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-406 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-406 .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-406 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-406 .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-406 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-406 .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-406 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-406 .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-406 .media,.factory-bootstrap-406 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-406 .media,.factory-bootstrap-406 .media .media{margin-top:15px}.factory-bootstrap-406 .media:first-child{margin-top:0}.factory-bootstrap-406 .media-object{display:block}.factory-bootstrap-406 .media-heading{margin:0 0 5px}.factory-bootstrap-406 .media>.pull-left{margin-right:10px}.factory-bootstrap-406 .media>.pull-right{margin-left:10px}.factory-bootstrap-406 .media-list{padding-left:0;list-style:none}.factory-bootstrap-406 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-406 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-406 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-406 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-406 .list-group-item>.badge{float:right}.factory-bootstrap-406 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-406 a.list-group-item{color:#555}.factory-bootstrap-406 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-406 a.list-group-item:focus,.factory-bootstrap-406 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-406 a.list-group-item.active,.factory-bootstrap-406 a.list-group-item.active:focus,.factory-bootstrap-406 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-406 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-406 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-406 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-406 a.list-group-item.active .list-group-item-text,.factory-bootstrap-406 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-406 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-406 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-406 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-406 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-406 .panel-body{padding:15px}.factory-bootstrap-406 .panel-body:after,.factory-bootstrap-406 .panel-body:before{display:table;content:" "}.factory-bootstrap-406 .panel-body:after{clear:both}.factory-bootstrap-406 .panel>.list-group{margin-bottom:0}.factory-bootstrap-406 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-406 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-406 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-406 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-406 .panel>.table,.factory-bootstrap-406 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-406 .panel>.panel-body+.table,.factory-bootstrap-406 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-406 .panel>.table>tbody:first-child td,.factory-bootstrap-406 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-406 .panel>.table-bordered,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-406 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-406 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-406 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-406 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-406 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-406 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-406 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-406 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-406 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-406 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-406 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-406 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-406 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-406 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-406 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-406 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-406 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-406 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-406 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-406 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-406 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-406 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-406 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-406 .panel-title>a{color:inherit}.factory-bootstrap-406 .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-406 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-406 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-406 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-406 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-406 .panel-group .panel-footer{border-top:0}.factory-bootstrap-406 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-406 .panel-default{border-color:#ddd}.factory-bootstrap-406 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-406 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-406 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-406 .panel-primary{border-color:#428bca}.factory-bootstrap-406 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-406 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-406 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-406 .panel-success{border-color:#d6e9c6}.factory-bootstrap-406 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-406 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-406 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-406 .panel-warning{border-color:#faebcc}.factory-bootstrap-406 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-406 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-406 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-406 .panel-danger{border-color:#ebccd1}.factory-bootstrap-406 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-406 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-406 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-406 .panel-info{border-color:#bce8f1}.factory-bootstrap-406 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-406 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-406 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-406 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-406 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-406 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-406 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-406 .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-406 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-406 .close:focus,.factory-bootstrap-406 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-406 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-406 .modal-open{overflow:hidden}.factory-bootstrap-406 .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-406 .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-406 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-406 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-406 .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-406 .modal-backdrop,.factory-bootstrap-406-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-406 .modal-backdrop.fade,.factory-bootstrap-406-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-406 .modal-backdrop.in,.factory-bootstrap-406-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-406 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-406 .modal-header .close{margin-top:-2px}.factory-bootstrap-406 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-406 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-406 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-406 .modal-footer:after,.factory-bootstrap-406 .modal-footer:before{display:table;content:" "}.factory-bootstrap-406 .modal-footer:after{clear:both}.factory-bootstrap-406 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-406 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-406 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-406 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-406 .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-406 .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-406 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-406 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-406 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-406 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-406 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-406 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-406 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-406 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-406 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-406 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-406 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-406 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-406 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-406 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-406 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-406 .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-406 .popover.top{margin-top:-10px}.factory-bootstrap-406 .popover.right{margin-left:10px}.factory-bootstrap-406 .popover.bottom{margin-top:10px}.factory-bootstrap-406 .popover.left{margin-left:-10px}.factory-bootstrap-406 .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-406 .popover-content{padding:9px 14px}.factory-bootstrap-406 .popover .arrow,.factory-bootstrap-406 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-406 .popover .arrow{border-width:11px}.factory-bootstrap-406 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-406 .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-406 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-406 .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-406 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-406 .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-406 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-406 .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-406 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-406 .carousel{position:relative}.factory-bootstrap-406 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-406 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-406 .carousel-inner>.item>a>img,.factory-bootstrap-406 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-406 .carousel-inner>.active,.factory-bootstrap-406 .carousel-inner>.next,.factory-bootstrap-406 .carousel-inner>.prev{display:block}.factory-bootstrap-406 .carousel-inner>.active{left:0}.factory-bootstrap-406 .carousel-inner>.next,.factory-bootstrap-406 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-406 .carousel-inner>.next{left:100%}.factory-bootstrap-406 .carousel-inner>.prev{left:-100%}.factory-bootstrap-406 .carousel-inner>.next.left,.factory-bootstrap-406 .carousel-inner>.prev.right{left:0}.factory-bootstrap-406 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-406 .carousel-inner>.active.right{left:100%}.factory-bootstrap-406 .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-406 .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-406 .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-406 .carousel-control:focus,.factory-bootstrap-406 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-406 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-406 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-406 .carousel-control .icon-next,.factory-bootstrap-406 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-406 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-406 .carousel-control .icon-prev{left:50%}.factory-bootstrap-406 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-406 .carousel-control .icon-next{right:50%}.factory-bootstrap-406 .carousel-control .icon-next,.factory-bootstrap-406 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-406 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-406 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-406 .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-406 .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-406 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-406 .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-406 .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-406 .clearfix:after,.factory-bootstrap-406 .clearfix:before{display:table;content:" "}.factory-bootstrap-406 .clearfix:after{clear:both}.factory-bootstrap-406 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-406 .pull-right{float:right!important}.factory-bootstrap-406 .pull-left{float:left!important}.factory-bootstrap-406 .hide{display:none!important}.factory-bootstrap-406 .show{display:block!important}.factory-bootstrap-406 .invisible{visibility:hidden}.factory-bootstrap-406 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-406 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-406 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-406 .visible-lg,.factory-bootstrap-406 .visible-md,.factory-bootstrap-406 .visible-sm,.factory-bootstrap-406 .visible-xs,.factory-bootstrap-406 td.visible-lg,.factory-bootstrap-406 td.visible-md,.factory-bootstrap-406 td.visible-sm,.factory-bootstrap-406 td.visible-xs,.factory-bootstrap-406 th.visible-lg,.factory-bootstrap-406 th.visible-md,.factory-bootstrap-406 th.visible-sm,.factory-bootstrap-406 th.visible-xs,.factory-bootstrap-406 tr.visible-lg,.factory-bootstrap-406 tr.visible-md,.factory-bootstrap-406 tr.visible-sm,.factory-bootstrap-406 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-406 .hidden-xs{display:block!important}.factory-bootstrap-406 table.hidden-xs{display:table}.factory-bootstrap-406 tr.hidden-xs{display:table-row!important}.factory-bootstrap-406 td.hidden-xs,.factory-bootstrap-406 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-406 .hidden-sm{display:block!important}.factory-bootstrap-406 table.hidden-sm{display:table}.factory-bootstrap-406 tr.hidden-sm{display:table-row!important}.factory-bootstrap-406 td.hidden-sm,.factory-bootstrap-406 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-406 .hidden-md{display:block!important}.factory-bootstrap-406 table.hidden-md{display:table}.factory-bootstrap-406 tr.hidden-md{display:table-row!important}.factory-bootstrap-406 td.hidden-md,.factory-bootstrap-406 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-406 .hidden-lg{display:block!important}.factory-bootstrap-406 table.hidden-lg{display:table}.factory-bootstrap-406 tr.hidden-lg{display:table-row!important}.factory-bootstrap-406 td.hidden-lg,.factory-bootstrap-406 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-406 .hidden-lg.hidden-xs,.factory-bootstrap-406 td.hidden-lg.hidden-xs,.factory-bootstrap-406 th.hidden-lg.hidden-xs,.factory-bootstrap-406 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-406 .hidden-lg.hidden-sm,.factory-bootstrap-406 td.hidden-lg.hidden-sm,.factory-bootstrap-406 th.hidden-lg.hidden-sm,.factory-bootstrap-406 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-406 .hidden-lg.hidden-md,.factory-bootstrap-406 td.hidden-lg.hidden-md,.factory-bootstrap-406 th.hidden-lg.hidden-md,.factory-bootstrap-406 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-406 .hidden-lg,.factory-bootstrap-406 td.hidden-lg,.factory-bootstrap-406 th.hidden-lg,.factory-bootstrap-406 tr.hidden-lg{display:none!important}}.factory-bootstrap-406 .visible-print,.factory-bootstrap-406 td.visible-print,.factory-bootstrap-406 th.visible-print,.factory-bootstrap-406 tr.visible-print{display:none!important}@media print{.factory-bootstrap-406 .visible-print{display:block!important}.factory-bootstrap-406 table.visible-print{display:table}.factory-bootstrap-406 tr.visible-print{display:table-row!important}.factory-bootstrap-406 td.visible-print,.factory-bootstrap-406 th.visible-print{display:table-cell!important}.factory-bootstrap-406 .hidden-print,.factory-bootstrap-406 td.hidden-print,.factory-bootstrap-406 th.hidden-print,.factory-bootstrap-406 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-406 .btn-danger,.factory-bootstrap-406 .btn-default,.factory-bootstrap-406 .btn-info,.factory-bootstrap-406 .btn-primary,.factory-bootstrap-406 .btn-success,.factory-bootstrap-406 .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-406 .btn-danger.active,.factory-bootstrap-406 .btn-danger:active,.factory-bootstrap-406 .btn-default.active,.factory-bootstrap-406 .btn-default:active,.factory-bootstrap-406 .btn-info.active,.factory-bootstrap-406 .btn-info:active,.factory-bootstrap-406 .btn-primary.active,.factory-bootstrap-406 .btn-primary:active,.factory-bootstrap-406 .btn-success.active,.factory-bootstrap-406 .btn-success:active,.factory-bootstrap-406 .btn-warning.active,.factory-bootstrap-406 .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-406 .btn.active,.factory-bootstrap-406 .btn:active{background-image:none}.factory-bootstrap-406 .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-406 .btn-default.active,.factory-bootstrap-406 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-406 .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-406 .btn-gold:focus,.factory-bootstrap-406 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-406 .btn-gold.active,.factory-bootstrap-406 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .btn-primary.active,.factory-bootstrap-406 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-406 .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-406 .btn-success:focus,.factory-bootstrap-406 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-406 .btn-success.active,.factory-bootstrap-406 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-406 .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-406 .btn-warning:focus,.factory-bootstrap-406 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-406 .btn-warning.active,.factory-bootstrap-406 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-406 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-406 .btn-danger.active,.factory-bootstrap-406 .btn-danger:active,.factory-bootstrap-406 .btn-danger:focus,.factory-bootstrap-406 .btn-danger:hover,.factory-bootstrap-406 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-406 .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-406 .btn-info:focus,.factory-bootstrap-406 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-406 .btn-info.active,.factory-bootstrap-406 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-406 .img-thumbnail,.factory-bootstrap-406 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-406 .dropdown-menu>li>a:focus,.factory-bootstrap-406 .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-406 .dropdown-menu>.active>a,.factory-bootstrap-406 .dropdown-menu>.active>a:focus,.factory-bootstrap-406 .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-406 .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-406 .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-406 .navbar-brand,.factory-bootstrap-406 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-406 .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-406 .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-406 .navbar-inverse .navbar-brand,.factory-bootstrap-406 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-406 .navbar-fixed-bottom,.factory-bootstrap-406 .navbar-fixed-top,.factory-bootstrap-406 .navbar-static-top{border-radius:0}.factory-bootstrap-406 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-406 .alert .actions{padding-top:10px}.factory-bootstrap-406 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-406 .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-406 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-406 .alert-normal,.factory-bootstrap-406 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-406 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-406 .alert-danger a:not(.btn),.factory-bootstrap-406 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-406 .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-406 .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-406 .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-406 .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-406 .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-406 .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-406 .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-406 .list-group-item.active,.factory-bootstrap-406 .list-group-item.active:focus,.factory-bootstrap-406 .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-406 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-406 .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-406 .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-406 .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-406 .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-406 .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-406 .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-406 .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-406 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-406 .factory-hidden{display:none}.factory-bootstrap-406 .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-409 article,.factory-bootstrap-409 aside,.factory-bootstrap-409 details,.factory-bootstrap-409 figcaption,.factory-bootstrap-409 figure,.factory-bootstrap-409 footer,.factory-bootstrap-409 header,.factory-bootstrap-409 hgroup,.factory-bootstrap-409 main,.factory-bootstrap-409 nav,.factory-bootstrap-409 section,.factory-bootstrap-409 summary{display:block}.factory-bootstrap-409 audio,.factory-bootstrap-409 canvas,.factory-bootstrap-409 video{display:inline-block}.factory-bootstrap-409 audio:not([controls]){display:none;height:0}.factory-bootstrap-409 [hidden],.factory-bootstrap-409 template{display:none}.factory-bootstrap-409 body{margin:0}.factory-bootstrap-409 a{background:0 0}.factory-bootstrap-409 a:focus{outline:thin dotted}.factory-bootstrap-409 a:active,.factory-bootstrap-409 a:hover{outline:0}.factory-bootstrap-409 h1{margin:.67em 0}.factory-bootstrap-409 b,.factory-bootstrap-409 strong{font-weight:700}.factory-bootstrap-409 dfn{font-style:italic}.factory-bootstrap-409 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-409 mark{color:#000;background:#ff0}.factory-bootstrap-409 code,.factory-bootstrap-409 kbd,.factory-bootstrap-409 pre,.factory-bootstrap-409 samp{font-size:1em}.factory-bootstrap-409 pre{white-space:pre-wrap}.factory-bootstrap-409 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-409 sub,.factory-bootstrap-409 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-409 sup{top:-.5em}.factory-bootstrap-409 sub{bottom:-.25em}.factory-bootstrap-409 img{border:0}.factory-bootstrap-409 svg:not(:root){overflow:hidden}.factory-bootstrap-409 figure{margin:0}.factory-bootstrap-409 button,.factory-bootstrap-409 input,.factory-bootstrap-409 select,.factory-bootstrap-409 textarea{margin:0}.factory-bootstrap-409 button,.factory-bootstrap-409 select{text-transform:none}.factory-bootstrap-409 select{padding-right:4px!important}.factory-bootstrap-409 button,.factory-bootstrap-409 input[type=reset],.factory-bootstrap-409 input[type=submit],html .factory-bootstrap-409 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-409 button[disabled],html .factory-bootstrap-409 input[disabled]{cursor:default}.factory-bootstrap-409 input[type=checkbox],.factory-bootstrap-409 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-409 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-409 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-409 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-409 button::-moz-focus-inner,.factory-bootstrap-409 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-409 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-409 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-409 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-409 a,.factory-bootstrap-409 a:visited{text-decoration:underline}.factory-bootstrap-409 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-409 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-409 a[href^="javascript:"]:after,.factory-bootstrap-409 a[href^="#"]:after{content:""}.factory-bootstrap-409 blockquote,.factory-bootstrap-409 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-409 thead{display:table-header-group}.factory-bootstrap-409 img,.factory-bootstrap-409 tr{page-break-inside:avoid}.factory-bootstrap-409 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-409 h2,.factory-bootstrap-409 h3,.factory-bootstrap-409 p{orphans:3;widows:3}.factory-bootstrap-409 h2,.factory-bootstrap-409 h3{page-break-after:avoid}.factory-bootstrap-409 select{background:#fff!important}.factory-bootstrap-409 .navbar{display:none}.factory-bootstrap-409 .table td,.factory-bootstrap-409 .table th{background-color:#fff!important}.factory-bootstrap-409 .btn>.caret,.factory-bootstrap-409 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-409 .label{border:1px solid #000}.factory-bootstrap-409 .table{border-collapse:collapse!important}.factory-bootstrap-409 .table-bordered td,.factory-bootstrap-409 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-409 *,.factory-bootstrap-409 :after,.factory-bootstrap-409 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-409{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-409 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-409 button,.factory-bootstrap-409 input,.factory-bootstrap-409 select,.factory-bootstrap-409 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-409 img{vertical-align:middle}.factory-bootstrap-409 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-409 .img-rounded{border-radius:6px}.factory-bootstrap-409 .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-409 .img-circle{border-radius:50%}.factory-bootstrap-409 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-409 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-409 .h1,.factory-bootstrap-409 .h2,.factory-bootstrap-409 .h3,.factory-bootstrap-409 .h4,.factory-bootstrap-409 .h5,.factory-bootstrap-409 .h6,.factory-bootstrap-409 h1,.factory-bootstrap-409 h2,.factory-bootstrap-409 h3,.factory-bootstrap-409 h4,.factory-bootstrap-409 h5,.factory-bootstrap-409 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-409 .h1 .small,.factory-bootstrap-409 .h1 small,.factory-bootstrap-409 .h2 .small,.factory-bootstrap-409 .h2 small,.factory-bootstrap-409 .h3 .small,.factory-bootstrap-409 .h3 small,.factory-bootstrap-409 .h4 .small,.factory-bootstrap-409 .h4 small,.factory-bootstrap-409 .h5 .small,.factory-bootstrap-409 .h5 small,.factory-bootstrap-409 .h6 .small,.factory-bootstrap-409 .h6 small,.factory-bootstrap-409 h1 .small,.factory-bootstrap-409 h1 small,.factory-bootstrap-409 h2 .small,.factory-bootstrap-409 h2 small,.factory-bootstrap-409 h3 .small,.factory-bootstrap-409 h3 small,.factory-bootstrap-409 h4 .small,.factory-bootstrap-409 h4 small,.factory-bootstrap-409 h5 .small,.factory-bootstrap-409 h5 small,.factory-bootstrap-409 h6 .small,.factory-bootstrap-409 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-409 h1,.factory-bootstrap-409 h2,.factory-bootstrap-409 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-409 h1 .small,.factory-bootstrap-409 h1 small,.factory-bootstrap-409 h2 .small,.factory-bootstrap-409 h2 small,.factory-bootstrap-409 h3 .small,.factory-bootstrap-409 h3 small{font-size:65%}.factory-bootstrap-409 h4,.factory-bootstrap-409 h5,.factory-bootstrap-409 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-409 h4 .small,.factory-bootstrap-409 h4 small,.factory-bootstrap-409 h5 .small,.factory-bootstrap-409 h5 small,.factory-bootstrap-409 h6 .small,.factory-bootstrap-409 h6 small{font-size:75%}.factory-bootstrap-409 .h1,.factory-bootstrap-409 h1{font-size:36px}.factory-bootstrap-409 .h2,.factory-bootstrap-409 h2{font-size:30px}.factory-bootstrap-409 .h3,.factory-bootstrap-409 h3{font-size:24px}.factory-bootstrap-409 .h4,.factory-bootstrap-409 h4{font-size:18px}.factory-bootstrap-409 .h5,.factory-bootstrap-409 h5{font-size:14px}.factory-bootstrap-409 .h6,.factory-bootstrap-409 h6{font-size:12px}.factory-bootstrap-409 p{margin:0 0 10px}.factory-bootstrap-409 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-409 .small,.factory-bootstrap-409 small{font-size:85%}.factory-bootstrap-409 cite{font-style:normal}.factory-bootstrap-409 .text-muted{color:#999}.factory-bootstrap-409 .text-primary{color:#428bca}.factory-bootstrap-409 .text-primary:hover{color:#3071a9}.factory-bootstrap-409 .text-warning{color:#8a6d3b}.factory-bootstrap-409 .text-warning:hover{color:#66512c}.factory-bootstrap-409 .text-danger{color:#a94442}.factory-bootstrap-409 .text-danger:hover{color:#843534}.factory-bootstrap-409 .text-success{color:#3c763d}.factory-bootstrap-409 .text-success:hover{color:#2b542c}.factory-bootstrap-409 .text-info{color:#31708f}.factory-bootstrap-409 .text-info:hover{color:#245269}.factory-bootstrap-409 .text-left{text-align:left}.factory-bootstrap-409 .text-right{text-align:right}.factory-bootstrap-409 .text-center{text-align:center}.factory-bootstrap-409 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-409 ol,.factory-bootstrap-409 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-409 ol ol,.factory-bootstrap-409 ol ul,.factory-bootstrap-409 ul ol,.factory-bootstrap-409 ul ul{margin-bottom:0}.factory-bootstrap-409 .list-inline,.factory-bootstrap-409 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-409 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-409 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-409 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-409 dd,.factory-bootstrap-409 dt{line-height:1.428571429}.factory-bootstrap-409 dt{font-weight:700}.factory-bootstrap-409 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-409 abbr[data-original-title],.factory-bootstrap-409 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-409 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-409 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-409 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-409 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-409 blockquote .small,.factory-bootstrap-409 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-409 blockquote .small:before,.factory-bootstrap-409 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-409 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-409 blockquote.pull-right .small,.factory-bootstrap-409 blockquote.pull-right p,.factory-bootstrap-409 blockquote.pull-right small{text-align:right}.factory-bootstrap-409 blockquote.pull-right .small:before,.factory-bootstrap-409 blockquote.pull-right small:before{content:''}.factory-bootstrap-409 blockquote.pull-right .small:after,.factory-bootstrap-409 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-409 blockquote:after,.factory-bootstrap-409 blockquote:before{content:""}.factory-bootstrap-409 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-409 code,.factory-bootstrap-409 kbd,.factory-bootstrap-409 pre,.factory-bootstrap-409 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-409 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-409 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-409 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-409 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-409 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-409 .container:after,.factory-bootstrap-409 .container:before{display:table;content:" "}.factory-bootstrap-409 .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-409 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-409 .row:after,.factory-bootstrap-409 .row:before{display:table;content:" "}.factory-bootstrap-409 .row:after{clear:both}.factory-bootstrap-409 .col-lg-1,.factory-bootstrap-409 .col-lg-10,.factory-bootstrap-409 .col-lg-11,.factory-bootstrap-409 .col-lg-12,.factory-bootstrap-409 .col-lg-2,.factory-bootstrap-409 .col-lg-3,.factory-bootstrap-409 .col-lg-4,.factory-bootstrap-409 .col-lg-5,.factory-bootstrap-409 .col-lg-6,.factory-bootstrap-409 .col-lg-7,.factory-bootstrap-409 .col-lg-8,.factory-bootstrap-409 .col-lg-9,.factory-bootstrap-409 .col-md-1,.factory-bootstrap-409 .col-md-10,.factory-bootstrap-409 .col-md-11,.factory-bootstrap-409 .col-md-12,.factory-bootstrap-409 .col-md-2,.factory-bootstrap-409 .col-md-3,.factory-bootstrap-409 .col-md-4,.factory-bootstrap-409 .col-md-5,.factory-bootstrap-409 .col-md-6,.factory-bootstrap-409 .col-md-7,.factory-bootstrap-409 .col-md-8,.factory-bootstrap-409 .col-md-9,.factory-bootstrap-409 .col-sm-1,.factory-bootstrap-409 .col-sm-10,.factory-bootstrap-409 .col-sm-11,.factory-bootstrap-409 .col-sm-12,.factory-bootstrap-409 .col-sm-2,.factory-bootstrap-409 .col-sm-3,.factory-bootstrap-409 .col-sm-4,.factory-bootstrap-409 .col-sm-5,.factory-bootstrap-409 .col-sm-6,.factory-bootstrap-409 .col-sm-7,.factory-bootstrap-409 .col-sm-8,.factory-bootstrap-409 .col-sm-9,.factory-bootstrap-409 .col-xs-1,.factory-bootstrap-409 .col-xs-10,.factory-bootstrap-409 .col-xs-11,.factory-bootstrap-409 .col-xs-12,.factory-bootstrap-409 .col-xs-2,.factory-bootstrap-409 .col-xs-3,.factory-bootstrap-409 .col-xs-4,.factory-bootstrap-409 .col-xs-5,.factory-bootstrap-409 .col-xs-6,.factory-bootstrap-409 .col-xs-7,.factory-bootstrap-409 .col-xs-8,.factory-bootstrap-409 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-409 .col-xs-1,.factory-bootstrap-409 .col-xs-10,.factory-bootstrap-409 .col-xs-11,.factory-bootstrap-409 .col-xs-12,.factory-bootstrap-409 .col-xs-2,.factory-bootstrap-409 .col-xs-3,.factory-bootstrap-409 .col-xs-4,.factory-bootstrap-409 .col-xs-5,.factory-bootstrap-409 .col-xs-6,.factory-bootstrap-409 .col-xs-7,.factory-bootstrap-409 .col-xs-8,.factory-bootstrap-409 .col-xs-9{float:left}.factory-bootstrap-409 .col-xs-12{width:100%}.factory-bootstrap-409 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-409 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-409 .col-xs-9{width:75%}.factory-bootstrap-409 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-409 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-409 .col-xs-6{width:50%}.factory-bootstrap-409 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-409 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-409 .col-xs-3{width:25%}.factory-bootstrap-409 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-409 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-409 .col-xs-pull-12{right:100%}.factory-bootstrap-409 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-409 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-409 .col-xs-pull-9{right:75%}.factory-bootstrap-409 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-409 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-409 .col-xs-pull-6{right:50%}.factory-bootstrap-409 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-409 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-409 .col-xs-pull-3{right:25%}.factory-bootstrap-409 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-409 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-409 .col-xs-pull-0{right:0}.factory-bootstrap-409 .col-xs-push-12{left:100%}.factory-bootstrap-409 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-409 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-409 .col-xs-push-9{left:75%}.factory-bootstrap-409 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-409 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-409 .col-xs-push-6{left:50%}.factory-bootstrap-409 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-409 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-409 .col-xs-push-3{left:25%}.factory-bootstrap-409 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-409 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-409 .col-xs-push-0{left:0}.factory-bootstrap-409 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-409 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-409 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-409 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-409 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-409 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-409 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-409 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-409 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-409 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-409 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-409 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-409 .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-409 table{max-width:100%;background-color:transparent}.factory-bootstrap-409 th{text-align:left}.factory-bootstrap-409 .table{width:100%;margin-bottom:20px}.factory-bootstrap-409 .table>tbody>tr>td,.factory-bootstrap-409 .table>tbody>tr>th,.factory-bootstrap-409 .table>tfoot>tr>td,.factory-bootstrap-409 .table>tfoot>tr>th,.factory-bootstrap-409 .table>thead>tr>td,.factory-bootstrap-409 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-409 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-409 .table>caption+thead>tr:first-child>td,.factory-bootstrap-409 .table>caption+thead>tr:first-child>th,.factory-bootstrap-409 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-409 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-409 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-409 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-409 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-409 .table .table{background-color:#fff}.factory-bootstrap-409 .table-condensed>tbody>tr>td,.factory-bootstrap-409 .table-condensed>tbody>tr>th,.factory-bootstrap-409 .table-condensed>tfoot>tr>td,.factory-bootstrap-409 .table-condensed>tfoot>tr>th,.factory-bootstrap-409 .table-condensed>thead>tr>td,.factory-bootstrap-409 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-409 .table-bordered,.factory-bootstrap-409 .table-bordered>tbody>tr>td,.factory-bootstrap-409 .table-bordered>tbody>tr>th,.factory-bootstrap-409 .table-bordered>tfoot>tr>td,.factory-bootstrap-409 .table-bordered>tfoot>tr>th,.factory-bootstrap-409 .table-bordered>thead>tr>td,.factory-bootstrap-409 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-409 .table-bordered>thead>tr>td,.factory-bootstrap-409 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-409 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-409 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-409 .table-hover>tbody>tr:hover>td,.factory-bootstrap-409 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-409 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-409 table td[class*=col-],.factory-bootstrap-409 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-409 .table>tbody>.active>td,.factory-bootstrap-409 .table>tbody>.active>th,.factory-bootstrap-409 .table>tbody>tr>.active,.factory-bootstrap-409 .table>tfoot>.active>td,.factory-bootstrap-409 .table>tfoot>.active>th,.factory-bootstrap-409 .table>tfoot>tr>.active,.factory-bootstrap-409 .table>thead>.active>td,.factory-bootstrap-409 .table>thead>.active>th,.factory-bootstrap-409 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-409 .table-hover>tbody>.active:hover>td,.factory-bootstrap-409 .table-hover>tbody>.active:hover>th,.factory-bootstrap-409 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-409 .table>tbody>.success>td,.factory-bootstrap-409 .table>tbody>.success>th,.factory-bootstrap-409 .table>tbody>tr>.success,.factory-bootstrap-409 .table>tfoot>.success>td,.factory-bootstrap-409 .table>tfoot>.success>th,.factory-bootstrap-409 .table>tfoot>tr>.success,.factory-bootstrap-409 .table>thead>.success>td,.factory-bootstrap-409 .table>thead>.success>th,.factory-bootstrap-409 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-409 .table-hover>tbody>.success:hover>td,.factory-bootstrap-409 .table-hover>tbody>.success:hover>th,.factory-bootstrap-409 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-409 .table>tbody>.danger>td,.factory-bootstrap-409 .table>tbody>.danger>th,.factory-bootstrap-409 .table>tbody>tr>.danger,.factory-bootstrap-409 .table>tfoot>.danger>td,.factory-bootstrap-409 .table>tfoot>.danger>th,.factory-bootstrap-409 .table>tfoot>tr>.danger,.factory-bootstrap-409 .table>thead>.danger>td,.factory-bootstrap-409 .table>thead>.danger>th,.factory-bootstrap-409 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-409 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-409 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-409 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-409 .table>tbody>.warning>td,.factory-bootstrap-409 .table>tbody>.warning>th,.factory-bootstrap-409 .table>tbody>tr>.warning,.factory-bootstrap-409 .table>tfoot>.warning>td,.factory-bootstrap-409 .table>tfoot>.warning>th,.factory-bootstrap-409 .table>tfoot>tr>.warning,.factory-bootstrap-409 .table>thead>.warning>td,.factory-bootstrap-409 .table>thead>.warning>th,.factory-bootstrap-409 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-409 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-409 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-409 .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-409 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-409 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-409 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-409 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-409 input[type=checkbox],.factory-bootstrap-409 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-409 input[type=file]{display:block}.factory-bootstrap-409 select[multiple],.factory-bootstrap-409 select[size]{height:auto}.factory-bootstrap-409 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-409 input[type=checkbox]:focus,.factory-bootstrap-409 input[type=file]:focus,.factory-bootstrap-409 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-409 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-409 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-409 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-409 .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-409 .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-409 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-409 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-409 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-409 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-409 .form-control[disabled],.factory-bootstrap-409 .form-control[readonly],.factory-bootstrap-409 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-409 textarea.form-control{height:auto}.factory-bootstrap-409 .form-group{margin-bottom:15px}.factory-bootstrap-409 .checkbox,.factory-bootstrap-409 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-409 .checkbox label,.factory-bootstrap-409 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-409 .checkbox input[type=checkbox],.factory-bootstrap-409 .checkbox-inline input[type=checkbox],.factory-bootstrap-409 .radio input[type=radio],.factory-bootstrap-409 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-409 .checkbox+.checkbox,.factory-bootstrap-409 .radio+.radio{margin-top:-5px}.factory-bootstrap-409 .checkbox-inline,.factory-bootstrap-409 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-409 .checkbox-inline+.checkbox-inline,.factory-bootstrap-409 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-409 .checkbox-inline[disabled],.factory-bootstrap-409 .checkbox[disabled],.factory-bootstrap-409 .radio-inline[disabled],.factory-bootstrap-409 .radio[disabled],.factory-bootstrap-409 fieldset[disabled] .checkbox,.factory-bootstrap-409 fieldset[disabled] .checkbox-inline,.factory-bootstrap-409 fieldset[disabled] .radio,.factory-bootstrap-409 fieldset[disabled] .radio-inline,.factory-bootstrap-409 fieldset[disabled] input[type=checkbox],.factory-bootstrap-409 fieldset[disabled] input[type=radio],.factory-bootstrap-409 input[type=checkbox][disabled],.factory-bootstrap-409 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-409 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-409 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-409 textarea.input-sm{height:auto}.factory-bootstrap-409 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-409 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-409 textarea.input-lg{height:auto}.factory-bootstrap-409 .has-warning .checkbox,.factory-bootstrap-409 .has-warning .checkbox-inline,.factory-bootstrap-409 .has-warning .control-label,.factory-bootstrap-409 .has-warning .help-block,.factory-bootstrap-409 .has-warning .radio,.factory-bootstrap-409 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-409 .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-409 .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-409 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-409 .has-error .checkbox,.factory-bootstrap-409 .has-error .checkbox-inline,.factory-bootstrap-409 .has-error .control-label,.factory-bootstrap-409 .has-error .help-block,.factory-bootstrap-409 .has-error .radio,.factory-bootstrap-409 .has-error .radio-inline{color:#a94442}.factory-bootstrap-409 .controls{display:block}.factory-bootstrap-409 .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-409 .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-409 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-409 .has-success .checkbox,.factory-bootstrap-409 .has-success .checkbox-inline,.factory-bootstrap-409 .has-success .control-label,.factory-bootstrap-409 .has-success .help-block,.factory-bootstrap-409 .has-success .radio,.factory-bootstrap-409 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-409 .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-409 .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-409 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-409 .form-control-static{margin-bottom:0}.factory-bootstrap-409 .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-409 .form-horizontal .checkbox,.factory-bootstrap-409 .form-horizontal .checkbox-inline,.factory-bootstrap-409 .form-horizontal .control-label,.factory-bootstrap-409 .form-horizontal .radio,.factory-bootstrap-409 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-409 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-409 .form-horizontal .checkbox,.factory-bootstrap-409 .form-horizontal .radio{min-height:27px}.factory-bootstrap-409 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-409 .form-horizontal .form-group:after,.factory-bootstrap-409 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-409 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-409 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-409 .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-409 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-409 .btn{text-decoration:none}.factory-bootstrap-409 .btn:focus,.factory-bootstrap-409 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-409 .btn.disabled,.factory-bootstrap-409 .btn[disabled],.factory-bootstrap-409 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-409 .btn-default.active,.factory-bootstrap-409 .btn-default:active,.factory-bootstrap-409 .btn-default:focus,.factory-bootstrap-409 .btn-default:hover,.factory-bootstrap-409 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-409 .btn-default.active,.factory-bootstrap-409 .btn-default:active,.factory-bootstrap-409 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-409 .btn-default.disabled,.factory-bootstrap-409 .btn-default.disabled.active,.factory-bootstrap-409 .btn-default.disabled:active,.factory-bootstrap-409 .btn-default.disabled:focus,.factory-bootstrap-409 .btn-default.disabled:hover,.factory-bootstrap-409 .btn-default[disabled],.factory-bootstrap-409 .btn-default[disabled].active,.factory-bootstrap-409 .btn-default[disabled]:active,.factory-bootstrap-409 .btn-default[disabled]:focus,.factory-bootstrap-409 .btn-default[disabled]:hover,.factory-bootstrap-409 fieldset[disabled] .btn-default,.factory-bootstrap-409 fieldset[disabled] .btn-default.active,.factory-bootstrap-409 fieldset[disabled] .btn-default:active,.factory-bootstrap-409 fieldset[disabled] .btn-default:focus,.factory-bootstrap-409 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-409 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-409 .btn-primary.active,.factory-bootstrap-409 .btn-primary:active,.factory-bootstrap-409 .btn-primary:focus,.factory-bootstrap-409 .btn-primary:hover,.factory-bootstrap-409 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-409 .btn-primary.active,.factory-bootstrap-409 .btn-primary:active,.factory-bootstrap-409 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-409 .btn-primary.disabled,.factory-bootstrap-409 .btn-primary.disabled.active,.factory-bootstrap-409 .btn-primary.disabled:active,.factory-bootstrap-409 .btn-primary.disabled:focus,.factory-bootstrap-409 .btn-primary.disabled:hover,.factory-bootstrap-409 .btn-primary[disabled],.factory-bootstrap-409 .btn-primary[disabled].active,.factory-bootstrap-409 .btn-primary[disabled]:active,.factory-bootstrap-409 .btn-primary[disabled]:focus,.factory-bootstrap-409 .btn-primary[disabled]:hover,.factory-bootstrap-409 fieldset[disabled] .btn-primary,.factory-bootstrap-409 fieldset[disabled] .btn-primary.active,.factory-bootstrap-409 fieldset[disabled] .btn-primary:active,.factory-bootstrap-409 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-409 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-409 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-409 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-409 .btn-warning.active,.factory-bootstrap-409 .btn-warning:active,.factory-bootstrap-409 .btn-warning:focus,.factory-bootstrap-409 .btn-warning:hover,.factory-bootstrap-409 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-409 .btn-warning.active,.factory-bootstrap-409 .btn-warning:active,.factory-bootstrap-409 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-409 .btn-warning.disabled,.factory-bootstrap-409 .btn-warning.disabled.active,.factory-bootstrap-409 .btn-warning.disabled:active,.factory-bootstrap-409 .btn-warning.disabled:focus,.factory-bootstrap-409 .btn-warning.disabled:hover,.factory-bootstrap-409 .btn-warning[disabled],.factory-bootstrap-409 .btn-warning[disabled].active,.factory-bootstrap-409 .btn-warning[disabled]:active,.factory-bootstrap-409 .btn-warning[disabled]:focus,.factory-bootstrap-409 .btn-warning[disabled]:hover,.factory-bootstrap-409 fieldset[disabled] .btn-warning,.factory-bootstrap-409 fieldset[disabled] .btn-warning.active,.factory-bootstrap-409 fieldset[disabled] .btn-warning:active,.factory-bootstrap-409 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-409 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-409 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-409 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-409 .btn-success.active,.factory-bootstrap-409 .btn-success:active,.factory-bootstrap-409 .btn-success:focus,.factory-bootstrap-409 .btn-success:hover,.factory-bootstrap-409 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-409 .btn-success.active,.factory-bootstrap-409 .btn-success:active,.factory-bootstrap-409 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-409 .btn-success.disabled,.factory-bootstrap-409 .btn-success.disabled.active,.factory-bootstrap-409 .btn-success.disabled:active,.factory-bootstrap-409 .btn-success.disabled:focus,.factory-bootstrap-409 .btn-success.disabled:hover,.factory-bootstrap-409 .btn-success[disabled],.factory-bootstrap-409 .btn-success[disabled].active,.factory-bootstrap-409 .btn-success[disabled]:active,.factory-bootstrap-409 .btn-success[disabled]:focus,.factory-bootstrap-409 .btn-success[disabled]:hover,.factory-bootstrap-409 fieldset[disabled] .btn-success,.factory-bootstrap-409 fieldset[disabled] .btn-success.active,.factory-bootstrap-409 fieldset[disabled] .btn-success:active,.factory-bootstrap-409 fieldset[disabled] .btn-success:focus,.factory-bootstrap-409 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-409 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-409 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-409 .btn-info.active,.factory-bootstrap-409 .btn-info:active,.factory-bootstrap-409 .btn-info:focus,.factory-bootstrap-409 .btn-info:hover,.factory-bootstrap-409 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-409 .btn-info.active,.factory-bootstrap-409 .btn-info:active,.factory-bootstrap-409 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-409 .btn-info.disabled,.factory-bootstrap-409 .btn-info.disabled.active,.factory-bootstrap-409 .btn-info.disabled:active,.factory-bootstrap-409 .btn-info.disabled:focus,.factory-bootstrap-409 .btn-info.disabled:hover,.factory-bootstrap-409 .btn-info[disabled],.factory-bootstrap-409 .btn-info[disabled].active,.factory-bootstrap-409 .btn-info[disabled]:active,.factory-bootstrap-409 .btn-info[disabled]:focus,.factory-bootstrap-409 .btn-info[disabled]:hover,.factory-bootstrap-409 fieldset[disabled] .btn-info,.factory-bootstrap-409 fieldset[disabled] .btn-info.active,.factory-bootstrap-409 fieldset[disabled] .btn-info:active,.factory-bootstrap-409 fieldset[disabled] .btn-info:focus,.factory-bootstrap-409 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-409 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-409 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-409 .btn-link,.factory-bootstrap-409 .btn-link:active,.factory-bootstrap-409 .btn-link[disabled],.factory-bootstrap-409 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-409 .btn-link,.factory-bootstrap-409 .btn-link:active,.factory-bootstrap-409 .btn-link:focus,.factory-bootstrap-409 .btn-link:hover{border-color:transparent}.factory-bootstrap-409 .btn-link:focus,.factory-bootstrap-409 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-409 .btn-link[disabled]:focus,.factory-bootstrap-409 .btn-link[disabled]:hover,.factory-bootstrap-409 fieldset[disabled] .btn-link:focus,.factory-bootstrap-409 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-409 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-409 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-409 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-409 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-409 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-409 input[type=button].btn-block,.factory-bootstrap-409 input[type=reset].btn-block,.factory-bootstrap-409 input[type=submit].btn-block{width:100%}.factory-bootstrap-409 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-409 .fade.in{opacity:1}.factory-bootstrap-409 .collapse{display:none}.factory-bootstrap-409 .collapse.in{display:block}.factory-bootstrap-409 .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-409 .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-409 .glyphicon:empty{width:1em}.factory-bootstrap-409 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-409 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-409 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-409 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-409 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-409 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-409 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-409 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-409 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-409 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-409 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-409 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-409 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-409 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-409 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-409 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-409 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-409 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-409 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-409 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-409 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-409 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-409 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-409 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-409 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-409 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-409 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-409 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-409 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-409 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-409 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-409 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-409 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-409 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-409 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-409 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-409 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-409 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-409 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-409 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-409 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-409 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-409 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-409 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-409 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-409 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-409 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-409 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-409 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-409 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-409 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-409 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-409 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-409 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-409 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-409 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-409 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-409 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-409 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-409 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-409 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-409 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-409 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-409 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-409 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-409 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-409 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-409 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-409 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-409 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-409 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-409 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-409 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-409 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-409 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-409 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-409 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-409 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-409 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-409 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-409 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-409 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-409 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-409 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-409 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-409 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-409 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-409 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-409 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-409 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-409 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-409 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-409 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-409 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-409 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-409 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-409 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-409 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-409 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-409 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-409 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-409 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-409 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-409 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-409 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-409 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-409 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-409 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-409 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-409 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-409 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-409 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-409 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-409 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-409 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-409 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-409 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-409 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-409 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-409 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-409 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-409 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-409 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-409 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-409 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-409 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-409 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-409 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-409 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-409 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-409 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-409 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-409 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-409 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-409 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-409 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-409 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-409 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-409 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-409 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-409 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-409 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-409 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-409 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-409 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-409 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-409 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-409 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-409 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-409 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-409 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-409 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-409 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-409 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-409 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-409 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-409 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-409 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-409 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-409 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-409 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-409 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-409 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-409 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-409 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-409 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-409 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-409 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-409 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-409 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-409 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-409 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-409 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-409 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-409 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-409 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-409 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-409 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-409 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-409 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-409 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-409 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-409 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-409 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-409 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-409 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-409 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-409 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-409 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-409 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-409 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-409 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-409 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-409 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-409 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-409 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-409 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-409 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-409 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-409 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-409 .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-409 .dropdown{position:relative}.factory-bootstrap-409 .dropdown-toggle:focus{outline:0}.factory-bootstrap-409 .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-409 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-409 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-409 .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-409 .dropdown-menu>li>a:focus,.factory-bootstrap-409 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-409 .dropdown-menu>.active>a,.factory-bootstrap-409 .dropdown-menu>.active>a:focus,.factory-bootstrap-409 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-409 .dropdown-menu>.disabled>a,.factory-bootstrap-409 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-409 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-409 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-409 .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-409 .open>.dropdown-menu{display:block}.factory-bootstrap-409 .open>a{outline:0}.factory-bootstrap-409 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-409 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-409 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-409 .dropup .caret,.factory-bootstrap-409 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-409 .dropup .dropdown-menu,.factory-bootstrap-409 .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-409 .btn-group,.factory-bootstrap-409 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-409 .btn-group-vertical>.btn,.factory-bootstrap-409 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-409 .btn-group-vertical>.btn.active,.factory-bootstrap-409 .btn-group-vertical>.btn:active,.factory-bootstrap-409 .btn-group-vertical>.btn:focus,.factory-bootstrap-409 .btn-group-vertical>.btn:hover,.factory-bootstrap-409 .btn-group>.btn.active,.factory-bootstrap-409 .btn-group>.btn:active,.factory-bootstrap-409 .btn-group>.btn:focus,.factory-bootstrap-409 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-409 .btn-group-vertical>.btn:focus,.factory-bootstrap-409 .btn-group>.btn:focus{outline:0}.factory-bootstrap-409 .btn-group .btn+.btn,.factory-bootstrap-409 .btn-group .btn+.btn-group,.factory-bootstrap-409 .btn-group .btn-group+.btn,.factory-bootstrap-409 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-409 .btn-toolbar:after,.factory-bootstrap-409 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-409 .btn-toolbar:after{clear:both}.factory-bootstrap-409 .btn-toolbar .btn-group{float:left}.factory-bootstrap-409 .btn-toolbar>.btn+.btn,.factory-bootstrap-409 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-409 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-409 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-409 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-409 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-409 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-409 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-409 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-409 .btn-group>.btn-group{float:left}.factory-bootstrap-409 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-409 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-409 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-409 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-409 .btn-group .dropdown-toggle:active,.factory-bootstrap-409 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-409 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-409 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-409 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-409 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-409 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-409 .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-409 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-409 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-409 .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-409 .btn .caret{margin-left:0}.factory-bootstrap-409 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-409 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-409 .btn-group-vertical>.btn,.factory-bootstrap-409 .btn-group-vertical>.btn-group,.factory-bootstrap-409 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-409 .btn-group-vertical>.btn-group:after,.factory-bootstrap-409 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-409 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-409 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-409 .btn-group-vertical>.btn+.btn,.factory-bootstrap-409 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-409 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-409 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-409 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-409 .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-409 .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-409 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-409 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-409 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-409 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-409 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-409 .btn-group-justified>.btn,.factory-bootstrap-409 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-409 .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-409 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-409 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-409 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-409 .input-group-lg>.form-control,.factory-bootstrap-409 .input-group-lg>.input-group-addon,.factory-bootstrap-409 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-409 select.input-group-lg>.form-control,.factory-bootstrap-409 select.input-group-lg>.input-group-addon,.factory-bootstrap-409 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-409 textarea.input-group-lg>.form-control,.factory-bootstrap-409 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-409 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-409 .input-group-sm>.form-control,.factory-bootstrap-409 .input-group-sm>.input-group-addon,.factory-bootstrap-409 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-409 select.input-group-sm>.form-control,.factory-bootstrap-409 select.input-group-sm>.input-group-addon,.factory-bootstrap-409 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-409 textarea.input-group-sm>.form-control,.factory-bootstrap-409 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-409 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-409 .input-group .form-control,.factory-bootstrap-409 .input-group-addon,.factory-bootstrap-409 .input-group-btn{display:table-cell}.factory-bootstrap-409 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-409 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-409 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-409 .input-group-addon,.factory-bootstrap-409 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-409 .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-409 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-409 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-409 .input-group-addon input[type=checkbox],.factory-bootstrap-409 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-409 .input-group .form-control:first-child,.factory-bootstrap-409 .input-group-addon:first-child,.factory-bootstrap-409 .input-group-btn:first-child>.btn,.factory-bootstrap-409 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-409 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-409 .input-group-addon:first-child{border-right:0}.factory-bootstrap-409 .input-group .form-control:last-child,.factory-bootstrap-409 .input-group-addon:last-child,.factory-bootstrap-409 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-409 .input-group-btn:last-child>.btn,.factory-bootstrap-409 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-409 .input-group-addon:last-child{border-left:0}.factory-bootstrap-409 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-409 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-409 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-409 .input-group-btn>.btn{position:relative}.factory-bootstrap-409 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-409 .input-group-btn>.btn:active,.factory-bootstrap-409 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-409 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-409 .nav:after,.factory-bootstrap-409 .nav:before{display:table;content:" "}.factory-bootstrap-409 .nav:after{clear:both}.factory-bootstrap-409 .nav>li{position:relative;display:block}.factory-bootstrap-409 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-409 .nav>li>a:focus,.factory-bootstrap-409 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-409 .nav>li.disabled>a{color:#999}.factory-bootstrap-409 .nav>li.disabled>a:focus,.factory-bootstrap-409 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-409 .nav .open>a,.factory-bootstrap-409 .nav .open>a:focus,.factory-bootstrap-409 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-409 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-409 .nav>li>a>img{max-width:none}.factory-bootstrap-409 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-409 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-409 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-409 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-409 .nav-tabs>li.active>a,.factory-bootstrap-409 .nav-tabs>li.active>a:focus,.factory-bootstrap-409 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-409 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-409 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-409 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-409 .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-409 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-409 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-409 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-409 .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-409 .nav-pills>li{float:left}.factory-bootstrap-409 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-409 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-409 .nav-pills>li.active>a,.factory-bootstrap-409 .nav-pills>li.active>a:focus,.factory-bootstrap-409 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-409 .nav-stacked>li{float:none}.factory-bootstrap-409 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-409 .nav-justified{width:100%}.factory-bootstrap-409 .nav-justified>li{float:none}.factory-bootstrap-409 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-409 .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-409 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-409 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-409 .nav-tabs-justified>.active>a,.factory-bootstrap-409 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-409 .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-409 .tab-content>.tab-pane{display:none}.factory-bootstrap-409 .tab-content>.active{display:block}.factory-bootstrap-409 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-409 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-409 .navbar:after,.factory-bootstrap-409 .navbar:before{display:table;content:" "}.factory-bootstrap-409 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-409 .navbar-header:after,.factory-bootstrap-409 .navbar-header:before{display:table;content:" "}.factory-bootstrap-409 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-409 .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-409 .navbar-collapse:after,.factory-bootstrap-409 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-409 .navbar-collapse:after{clear:both}.factory-bootstrap-409 .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-409 .container>.navbar-collapse,.factory-bootstrap-409 .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-409 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-409 .navbar-fixed-bottom,.factory-bootstrap-409 .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-409 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-409 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-409 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-409 .navbar-brand:focus,.factory-bootstrap-409 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-409 .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-409 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-409 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-409 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-409 .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-409 .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-409 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-409 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-409 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-409 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-409 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-409 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-409 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-409 .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-409 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-409 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-409 .navbar-default .navbar-brand:focus,.factory-bootstrap-409 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-409 .navbar-default .navbar-nav>li>a,.factory-bootstrap-409 .navbar-default .navbar-text{color:#777}.factory-bootstrap-409 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-409 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-409 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-409 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-409 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-409 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-409 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-409 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-409 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-409 .navbar-default .navbar-toggle:focus,.factory-bootstrap-409 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-409 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-409 .navbar-default .navbar-collapse,.factory-bootstrap-409 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-409 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-409 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-409 .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-409 .navbar-default .navbar-link{color:#777}.factory-bootstrap-409 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-409 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-409 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-409 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-409 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-409 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-409 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-409 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-409 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-409 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-409 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-409 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-409 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-409 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-409 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-409 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-409 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-409 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-409 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-409 .navbar-inverse .navbar-collapse,.factory-bootstrap-409 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-409 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-409 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-409 .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-409 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-409 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-409 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-409 .breadcrumb>li{display:inline-block}.factory-bootstrap-409 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-409 .breadcrumb>.active{color:#999}.factory-bootstrap-409 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-409 .pagination>li{display:inline}.factory-bootstrap-409 .pagination>li>a,.factory-bootstrap-409 .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-409 .pagination>li:first-child>a,.factory-bootstrap-409 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-409 .pagination>li:last-child>a,.factory-bootstrap-409 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-409 .pagination>li>a:focus,.factory-bootstrap-409 .pagination>li>a:hover,.factory-bootstrap-409 .pagination>li>span:focus,.factory-bootstrap-409 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-409 .pagination>.disabled>a,.factory-bootstrap-409 .pagination>.disabled>a:focus,.factory-bootstrap-409 .pagination>.disabled>a:hover,.factory-bootstrap-409 .pagination>.disabled>span,.factory-bootstrap-409 .pagination>.disabled>span:focus,.factory-bootstrap-409 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-409 .pagination-lg>li>a,.factory-bootstrap-409 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-409 .pagination-lg>li:first-child>a,.factory-bootstrap-409 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-409 .pagination-lg>li:last-child>a,.factory-bootstrap-409 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-409 .pagination-sm>li>a,.factory-bootstrap-409 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-409 .pagination-sm>li:first-child>a,.factory-bootstrap-409 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-409 .pagination-sm>li:last-child>a,.factory-bootstrap-409 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-409 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-409 .pager:after,.factory-bootstrap-409 .pager:before{display:table;content:" "}.factory-bootstrap-409 .pager:after{clear:both}.factory-bootstrap-409 .pager li{display:inline}.factory-bootstrap-409 .pager li>a,.factory-bootstrap-409 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-409 .pager li>a:focus,.factory-bootstrap-409 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-409 .pager .next>a,.factory-bootstrap-409 .pager .next>span{float:right}.factory-bootstrap-409 .pager .previous>a,.factory-bootstrap-409 .pager .previous>span{float:left}.factory-bootstrap-409 .pager .disabled>a,.factory-bootstrap-409 .pager .disabled>a:focus,.factory-bootstrap-409 .pager .disabled>a:hover,.factory-bootstrap-409 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-409 .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-409 .label[href]:focus,.factory-bootstrap-409 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-409 .label:empty{display:none}.factory-bootstrap-409 .btn .label{position:relative;top:-1px}.factory-bootstrap-409 .label-default{background-color:#999}.factory-bootstrap-409 .label-default[href]:focus,.factory-bootstrap-409 .label-default[href]:hover{background-color:gray}.factory-bootstrap-409 .label-primary{background-color:#428bca}.factory-bootstrap-409 .label-primary[href]:focus,.factory-bootstrap-409 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-409 .label-success{background-color:#5cb85c}.factory-bootstrap-409 .label-success[href]:focus,.factory-bootstrap-409 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-409 .label-info{background-color:#5bc0de}.factory-bootstrap-409 .label-info[href]:focus,.factory-bootstrap-409 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-409 .label-warning{background-color:#f0ad4e}.factory-bootstrap-409 .label-warning[href]:focus,.factory-bootstrap-409 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-409 .label-danger{background-color:#d9534f}.factory-bootstrap-409 .label-danger[href]:focus,.factory-bootstrap-409 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-409 .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-409 .badge:empty{display:none}.factory-bootstrap-409 .btn .badge{position:relative;top:-1px}.factory-bootstrap-409 a.badge:focus,.factory-bootstrap-409 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-409 .nav-pills>.active>a>.badge,.factory-bootstrap-409 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-409 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-409 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-409 .jumbotron .h1,.factory-bootstrap-409 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-409 .jumbotron p{line-height:1.4}.factory-bootstrap-409 .container .jumbotron{border-radius:6px}.factory-bootstrap-409 .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-409 .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-409 .thumbnail a>img,.factory-bootstrap-409 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-409 a.thumbnail.active,.factory-bootstrap-409 a.thumbnail:focus,.factory-bootstrap-409 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-409 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-409 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-409 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-409 .alert .alert-link{font-weight:700}.factory-bootstrap-409 .alert>p,.factory-bootstrap-409 .alert>ul{margin-bottom:0}.factory-bootstrap-409 .alert>p+p{margin-top:5px}.factory-bootstrap-409 .alert-dismissable{padding-right:35px}.factory-bootstrap-409 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-409 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-409 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-409 .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-409 .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-409 .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-409 .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-409 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-409 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-409 .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-409 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-409 .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-409 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-409 .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-409 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-409 .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-409 .media,.factory-bootstrap-409 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-409 .media,.factory-bootstrap-409 .media .media{margin-top:15px}.factory-bootstrap-409 .media:first-child{margin-top:0}.factory-bootstrap-409 .media-object{display:block}.factory-bootstrap-409 .media-heading{margin:0 0 5px}.factory-bootstrap-409 .media>.pull-left{margin-right:10px}.factory-bootstrap-409 .media>.pull-right{margin-left:10px}.factory-bootstrap-409 .media-list{padding-left:0;list-style:none}.factory-bootstrap-409 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-409 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-409 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-409 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-409 .list-group-item>.badge{float:right}.factory-bootstrap-409 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-409 a.list-group-item{color:#555}.factory-bootstrap-409 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-409 a.list-group-item:focus,.factory-bootstrap-409 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-409 a.list-group-item.active,.factory-bootstrap-409 a.list-group-item.active:focus,.factory-bootstrap-409 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-409 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-409 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-409 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-409 a.list-group-item.active .list-group-item-text,.factory-bootstrap-409 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-409 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-409 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-409 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-409 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-409 .panel-body{padding:15px}.factory-bootstrap-409 .panel-body:after,.factory-bootstrap-409 .panel-body:before{display:table;content:" "}.factory-bootstrap-409 .panel-body:after{clear:both}.factory-bootstrap-409 .panel>.list-group{margin-bottom:0}.factory-bootstrap-409 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-409 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-409 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-409 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-409 .panel>.table,.factory-bootstrap-409 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-409 .panel>.panel-body+.table,.factory-bootstrap-409 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-409 .panel>.table>tbody:first-child td,.factory-bootstrap-409 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-409 .panel>.table-bordered,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-409 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-409 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-409 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-409 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-409 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-409 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-409 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-409 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-409 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-409 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-409 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-409 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-409 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-409 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-409 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-409 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-409 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-409 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-409 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-409 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-409 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-409 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-409 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-409 .panel-title>a{color:inherit}.factory-bootstrap-409 .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-409 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-409 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-409 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-409 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-409 .panel-group .panel-footer{border-top:0}.factory-bootstrap-409 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-409 .panel-default{border-color:#ddd}.factory-bootstrap-409 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-409 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-409 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-409 .panel-primary{border-color:#428bca}.factory-bootstrap-409 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-409 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-409 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-409 .panel-success{border-color:#d6e9c6}.factory-bootstrap-409 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-409 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-409 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-409 .panel-warning{border-color:#faebcc}.factory-bootstrap-409 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-409 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-409 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-409 .panel-danger{border-color:#ebccd1}.factory-bootstrap-409 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-409 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-409 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-409 .panel-info{border-color:#bce8f1}.factory-bootstrap-409 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-409 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-409 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-409 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-409 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-409 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-409 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-409 .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-409 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-409 .close:focus,.factory-bootstrap-409 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-409 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-409 .modal-open{overflow:hidden}.factory-bootstrap-409 .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-409 .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-409 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-409 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-409 .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-409 .modal-backdrop,.factory-bootstrap-409-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-409 .modal-backdrop.fade,.factory-bootstrap-409-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-409 .modal-backdrop.in,.factory-bootstrap-409-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-409 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-409 .modal-header .close{margin-top:-2px}.factory-bootstrap-409 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-409 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-409 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-409 .modal-footer:after,.factory-bootstrap-409 .modal-footer:before{display:table;content:" "}.factory-bootstrap-409 .modal-footer:after{clear:both}.factory-bootstrap-409 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-409 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-409 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-409 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-409 .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-409 .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-409 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-409 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-409 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-409 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-409 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-409 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-409 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-409 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-409 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-409 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-409 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-409 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-409 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-409 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-409 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-409 .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-409 .popover.top{margin-top:-10px}.factory-bootstrap-409 .popover.right{margin-left:10px}.factory-bootstrap-409 .popover.bottom{margin-top:10px}.factory-bootstrap-409 .popover.left{margin-left:-10px}.factory-bootstrap-409 .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-409 .popover-content{padding:9px 14px}.factory-bootstrap-409 .popover .arrow,.factory-bootstrap-409 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-409 .popover .arrow{border-width:11px}.factory-bootstrap-409 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-409 .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-409 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-409 .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-409 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-409 .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-409 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-409 .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-409 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-409 .carousel{position:relative}.factory-bootstrap-409 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-409 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-409 .carousel-inner>.item>a>img,.factory-bootstrap-409 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-409 .carousel-inner>.active,.factory-bootstrap-409 .carousel-inner>.next,.factory-bootstrap-409 .carousel-inner>.prev{display:block}.factory-bootstrap-409 .carousel-inner>.active{left:0}.factory-bootstrap-409 .carousel-inner>.next,.factory-bootstrap-409 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-409 .carousel-inner>.next{left:100%}.factory-bootstrap-409 .carousel-inner>.prev{left:-100%}.factory-bootstrap-409 .carousel-inner>.next.left,.factory-bootstrap-409 .carousel-inner>.prev.right{left:0}.factory-bootstrap-409 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-409 .carousel-inner>.active.right{left:100%}.factory-bootstrap-409 .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-409 .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-409 .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-409 .carousel-control:focus,.factory-bootstrap-409 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-409 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-409 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-409 .carousel-control .icon-next,.factory-bootstrap-409 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-409 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-409 .carousel-control .icon-prev{left:50%}.factory-bootstrap-409 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-409 .carousel-control .icon-next{right:50%}.factory-bootstrap-409 .carousel-control .icon-next,.factory-bootstrap-409 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-409 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-409 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-409 .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-409 .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-409 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-409 .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-409 .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-409 .clearfix:after,.factory-bootstrap-409 .clearfix:before{display:table;content:" "}.factory-bootstrap-409 .clearfix:after{clear:both}.factory-bootstrap-409 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-409 .pull-right{float:right!important}.factory-bootstrap-409 .pull-left{float:left!important}.factory-bootstrap-409 .hide{display:none!important}.factory-bootstrap-409 .show{display:block!important}.factory-bootstrap-409 .invisible{visibility:hidden}.factory-bootstrap-409 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-409 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-409 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-409 .visible-lg,.factory-bootstrap-409 .visible-md,.factory-bootstrap-409 .visible-sm,.factory-bootstrap-409 .visible-xs,.factory-bootstrap-409 td.visible-lg,.factory-bootstrap-409 td.visible-md,.factory-bootstrap-409 td.visible-sm,.factory-bootstrap-409 td.visible-xs,.factory-bootstrap-409 th.visible-lg,.factory-bootstrap-409 th.visible-md,.factory-bootstrap-409 th.visible-sm,.factory-bootstrap-409 th.visible-xs,.factory-bootstrap-409 tr.visible-lg,.factory-bootstrap-409 tr.visible-md,.factory-bootstrap-409 tr.visible-sm,.factory-bootstrap-409 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-409 .hidden-xs{display:block!important}.factory-bootstrap-409 table.hidden-xs{display:table}.factory-bootstrap-409 tr.hidden-xs{display:table-row!important}.factory-bootstrap-409 td.hidden-xs,.factory-bootstrap-409 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-409 .hidden-sm{display:block!important}.factory-bootstrap-409 table.hidden-sm{display:table}.factory-bootstrap-409 tr.hidden-sm{display:table-row!important}.factory-bootstrap-409 td.hidden-sm,.factory-bootstrap-409 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-409 .hidden-md{display:block!important}.factory-bootstrap-409 table.hidden-md{display:table}.factory-bootstrap-409 tr.hidden-md{display:table-row!important}.factory-bootstrap-409 td.hidden-md,.factory-bootstrap-409 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-409 .hidden-lg{display:block!important}.factory-bootstrap-409 table.hidden-lg{display:table}.factory-bootstrap-409 tr.hidden-lg{display:table-row!important}.factory-bootstrap-409 td.hidden-lg,.factory-bootstrap-409 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-409 .hidden-lg.hidden-xs,.factory-bootstrap-409 td.hidden-lg.hidden-xs,.factory-bootstrap-409 th.hidden-lg.hidden-xs,.factory-bootstrap-409 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-409 .hidden-lg.hidden-sm,.factory-bootstrap-409 td.hidden-lg.hidden-sm,.factory-bootstrap-409 th.hidden-lg.hidden-sm,.factory-bootstrap-409 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-409 .hidden-lg.hidden-md,.factory-bootstrap-409 td.hidden-lg.hidden-md,.factory-bootstrap-409 th.hidden-lg.hidden-md,.factory-bootstrap-409 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-409 .hidden-lg,.factory-bootstrap-409 td.hidden-lg,.factory-bootstrap-409 th.hidden-lg,.factory-bootstrap-409 tr.hidden-lg{display:none!important}}.factory-bootstrap-409 .visible-print,.factory-bootstrap-409 td.visible-print,.factory-bootstrap-409 th.visible-print,.factory-bootstrap-409 tr.visible-print{display:none!important}@media print{.factory-bootstrap-409 .visible-print{display:block!important}.factory-bootstrap-409 table.visible-print{display:table}.factory-bootstrap-409 tr.visible-print{display:table-row!important}.factory-bootstrap-409 td.visible-print,.factory-bootstrap-409 th.visible-print{display:table-cell!important}.factory-bootstrap-409 .hidden-print,.factory-bootstrap-409 td.hidden-print,.factory-bootstrap-409 th.hidden-print,.factory-bootstrap-409 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-409 .btn-danger,.factory-bootstrap-409 .btn-default,.factory-bootstrap-409 .btn-info,.factory-bootstrap-409 .btn-primary,.factory-bootstrap-409 .btn-success,.factory-bootstrap-409 .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-409 .btn-danger.active,.factory-bootstrap-409 .btn-danger:active,.factory-bootstrap-409 .btn-default.active,.factory-bootstrap-409 .btn-default:active,.factory-bootstrap-409 .btn-info.active,.factory-bootstrap-409 .btn-info:active,.factory-bootstrap-409 .btn-primary.active,.factory-bootstrap-409 .btn-primary:active,.factory-bootstrap-409 .btn-success.active,.factory-bootstrap-409 .btn-success:active,.factory-bootstrap-409 .btn-warning.active,.factory-bootstrap-409 .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-409 .btn.active,.factory-bootstrap-409 .btn:active{background-image:none}.factory-bootstrap-409 .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-409 .btn-default.active,.factory-bootstrap-409 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-409 .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-409 .btn-gold:focus,.factory-bootstrap-409 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-409 .btn-gold.active,.factory-bootstrap-409 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .btn-primary.active,.factory-bootstrap-409 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-409 .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-409 .btn-success:focus,.factory-bootstrap-409 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-409 .btn-success.active,.factory-bootstrap-409 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-409 .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-409 .btn-warning:focus,.factory-bootstrap-409 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-409 .btn-warning.active,.factory-bootstrap-409 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-409 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-409 .btn-danger.active,.factory-bootstrap-409 .btn-danger:active,.factory-bootstrap-409 .btn-danger:focus,.factory-bootstrap-409 .btn-danger:hover,.factory-bootstrap-409 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-409 .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-409 .btn-info:focus,.factory-bootstrap-409 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-409 .btn-info.active,.factory-bootstrap-409 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-409 .img-thumbnail,.factory-bootstrap-409 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-409 .dropdown-menu>li>a:focus,.factory-bootstrap-409 .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-409 .dropdown-menu>.active>a,.factory-bootstrap-409 .dropdown-menu>.active>a:focus,.factory-bootstrap-409 .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-409 .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-409 .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-409 .navbar-brand,.factory-bootstrap-409 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-409 .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-409 .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-409 .navbar-inverse .navbar-brand,.factory-bootstrap-409 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-409 .navbar-fixed-bottom,.factory-bootstrap-409 .navbar-fixed-top,.factory-bootstrap-409 .navbar-static-top{border-radius:0}.factory-bootstrap-409 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-409 .alert .actions{padding-top:10px}.factory-bootstrap-409 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-409 .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-409 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-409 .alert-normal,.factory-bootstrap-409 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-409 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-409 .alert-danger a:not(.btn),.factory-bootstrap-409 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .list-group-item.active,.factory-bootstrap-409 .list-group-item.active:focus,.factory-bootstrap-409 .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-409 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-409 .factory-hidden{display:none}.factory-bootstrap-409 .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-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:disabled,.factory-bootstrap-409 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-409 .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-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .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-409 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-409 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-409 .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-409 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-409 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-409 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-409 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-409 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-409 .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-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:disabled,.factory-bootstrap-409 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-409 .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-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:disabled,.factory-bootstrap-409 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-409 .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-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:disabled,.factory-bootstrap-409 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-409 .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-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .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-409 .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-409 .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-409 .btn-primary:focus,.factory-bootstrap-409 .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-409 .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-409 .btn-primary:disabled,.factory-bootstrap-409 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-409 .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-409 .pagination>.active>a,.factory-bootstrap-409 .pagination>.active>a:focus,.factory-bootstrap-409 .pagination>.active>a:hover,.factory-bootstrap-409 .pagination>.active>span,.factory-bootstrap-409 .pagination>.active>span:focus,.factory-bootstrap-409 .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-409 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-409 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-409 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-409 .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-409 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-409 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-409 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-409 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .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-409 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-409 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-409 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-409 .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-409 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-409 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-409 .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-409 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-409 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-409 .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-409 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-409 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-409 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-409 .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-409 .factory-tab .factory-more-link-hide:hover{color:#999}
|
libs/factory/bootstrap/assets/css-min/index.php
ADDED
File without changes
|
libs/factory/bootstrap/assets/images/index.php
ADDED
File without changes
|
libs/factory/bootstrap/assets/index.php
ADDED
File without changes
|
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.factoryBootstrap409_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.factoryBootstrap409_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.factoryBootstrap409_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.factoryBootstrap409_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-409 .factory-checkbox.factory-buttons-way").factoryBootstrap409_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.factoryBootstrap409_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.factoryBootstrap409_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-409 .factory-dropdown").factoryBootstrap409_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.factoryBootstrap409_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.factoryBootstrap409_listControl.Constructor=b,a(function(){a(".factory-bootstrap-409 .factory-list").factoryBootstrap409_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.factoryBootstrap409_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-409 .factory-multiple-textbox-group").factoryBootstrap409_MultipleTextboxControl()})}(jQuery);
|
libs/factory/bootstrap/assets/js-min/index.php
ADDED
File without changes
|
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_409_LOADED') ) {
|
23 |
return;
|
24 |
}
|
25 |
+
define('FACTORY_BOOTSTRAP_409_LOADED', true);
|
26 |
|
27 |
+
define('FACTORY_BOOTSTRAP_409_DIR', dirname(__FILE__));
|
28 |
+
define('FACTORY_BOOTSTRAP_409_URL', plugins_url(null, __FILE__));
|
29 |
|
30 |
// sets version of admin interface
|
31 |
+
define('FACTORY_BOOTSTRAP_409_VERSION', 'FACTORY_BOOTSTRAP_409');
|
32 |
|
33 |
if( !defined('FACTORY_FLAT_ADMIN') ) {
|
34 |
define('FACTORY_FLAT_ADMIN', true);
|
35 |
}
|
36 |
|
37 |
+
include_once(FACTORY_BOOTSTRAP_409_DIR . '/includes/functions.php');
|
libs/factory/bootstrap/includes/functions.php
CHANGED
@@ -10,31 +10,31 @@
|
|
10 |
* @since 1.0.0
|
11 |
*/
|
12 |
|
13 |
-
add_action('
|
14 |
|
15 |
/**
|
16 |
-
* @param
|
17 |
*/
|
18 |
-
function
|
19 |
{
|
20 |
-
$manager = new
|
21 |
$plugin->setBootstap($manager);
|
22 |
}
|
23 |
|
24 |
-
if( !class_exists('
|
25 |
|
26 |
/**
|
27 |
* The Bootstrap Manager class.
|
28 |
*
|
29 |
* @since 3.2.0
|
30 |
*/
|
31 |
-
class
|
32 |
|
33 |
/**
|
34 |
* A plugin for which the manager was created.
|
35 |
*
|
36 |
* @since 3.2.0
|
37 |
-
* @var
|
38 |
*/
|
39 |
public $plugin;
|
40 |
|
@@ -59,7 +59,7 @@
|
|
59 |
*
|
60 |
* @since 1.0.0
|
61 |
*/
|
62 |
-
public function __construct(
|
63 |
{
|
64 |
$this->plugin = $plugin;
|
65 |
|
@@ -120,8 +120,8 @@
|
|
120 |
public function loadAssets($hook)
|
121 |
{
|
122 |
|
123 |
-
do_action('
|
124 |
-
do_action('
|
125 |
|
126 |
$dependencies = array();
|
127 |
if( !empty($this->scripts) ) {
|
@@ -151,8 +151,8 @@
|
|
151 |
$color_name = get_user_meta($user_id, 'admin_color', true);
|
152 |
|
153 |
if( $color_name !== 'fresh' ) {
|
154 |
-
if( file_exists(
|
155 |
-
wp_enqueue_style('wbcr-factory-bootstrap-
|
156 |
}
|
157 |
}
|
158 |
|
@@ -188,10 +188,10 @@
|
|
188 |
if( !window.factory ) {
|
189 |
window.factory = {};
|
190 |
}
|
191 |
-
if( !window.factory.
|
192 |
-
window.factory.
|
193 |
}
|
194 |
-
window.factory.
|
195 |
primaryDark: '<?php echo $primary_dark ?>',
|
196 |
primaryLight: '<?php echo $primary_light ?>'
|
197 |
};
|
@@ -209,8 +209,8 @@
|
|
209 |
|
210 |
$is_first = true;
|
211 |
$cache_id = md5(implode(',', $this->scripts) . $type . $this->plugin->getPluginVersion());
|
212 |
-
$cache_dir_path =
|
213 |
-
$cache_dir_url =
|
214 |
|
215 |
$cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
|
216 |
$cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
|
@@ -237,7 +237,7 @@
|
|
237 |
foreach($sripts as $script_to_load) {
|
238 |
$script_to_load = sanitize_text_field($script_to_load);
|
239 |
if( $cache_dir_exists ) {
|
240 |
-
$fname =
|
241 |
if( file_exists($fname) ) {
|
242 |
$f = @fopen($fname, 'r');
|
243 |
$concat_files[] = @fread($f, filesize($fname));
|
@@ -245,11 +245,11 @@
|
|
245 |
}
|
246 |
} else {
|
247 |
if( $type == 'js' ) {
|
248 |
-
wp_enqueue_script(md5($script_to_load),
|
249 |
? $dependencies
|
250 |
: false, $this->plugin->getPluginVersion());
|
251 |
} else {
|
252 |
-
wp_enqueue_style(md5($script_to_load),
|
253 |
}
|
254 |
$is_first = false;
|
255 |
}
|
10 |
* @since 1.0.0
|
11 |
*/
|
12 |
|
13 |
+
add_action('wbcr_factory_bootstrap_409_plugin_created', 'wbcr_factory_bootstrap_409_plugin_created');
|
14 |
|
15 |
/**
|
16 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
17 |
*/
|
18 |
+
function wbcr_factory_bootstrap_409_plugin_created($plugin)
|
19 |
{
|
20 |
+
$manager = new Wbcr_FactoryBootstrap409_Manager($plugin);
|
21 |
$plugin->setBootstap($manager);
|
22 |
}
|
23 |
|
24 |
+
if( !class_exists('Wbcr_FactoryBootstrap409_Manager') ) {
|
25 |
|
26 |
/**
|
27 |
* The Bootstrap Manager class.
|
28 |
*
|
29 |
* @since 3.2.0
|
30 |
*/
|
31 |
+
class Wbcr_FactoryBootstrap409_Manager {
|
32 |
|
33 |
/**
|
34 |
* A plugin for which the manager was created.
|
35 |
*
|
36 |
* @since 3.2.0
|
37 |
+
* @var Wbcr_Factory409_Plugin
|
38 |
*/
|
39 |
public $plugin;
|
40 |
|
59 |
*
|
60 |
* @since 1.0.0
|
61 |
*/
|
62 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
63 |
{
|
64 |
$this->plugin = $plugin;
|
65 |
|
120 |
public function loadAssets($hook)
|
121 |
{
|
122 |
|
123 |
+
do_action('wbcr_factory_409_bootstrap_enqueue_scripts', $hook);
|
124 |
+
do_action('wbcr_factory_409_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook);
|
125 |
|
126 |
$dependencies = array();
|
127 |
if( !empty($this->scripts) ) {
|
151 |
$color_name = get_user_meta($user_id, 'admin_color', true);
|
152 |
|
153 |
if( $color_name !== 'fresh' ) {
|
154 |
+
if( file_exists(FACTORY_BOOTSTRAP_409_DIR . '/assets/flat/css/bootstrap.' . $color_name . '.css') ) {
|
155 |
+
wp_enqueue_style('wbcr-factory-bootstrap-409-colors', FACTORY_BOOTSTRAP_409_URL . '/assets/flat/css/bootstrap.' . $color_name . '.css');
|
156 |
}
|
157 |
}
|
158 |
|
188 |
if( !window.factory ) {
|
189 |
window.factory = {};
|
190 |
}
|
191 |
+
if( !window.factory.factoryBootstrap409 ) {
|
192 |
+
window.factory.factoryBootstrap409 = {};
|
193 |
}
|
194 |
+
window.factory.factoryBootstrap409.colors = {
|
195 |
primaryDark: '<?php echo $primary_dark ?>',
|
196 |
primaryLight: '<?php echo $primary_light ?>'
|
197 |
};
|
209 |
|
210 |
$is_first = true;
|
211 |
$cache_id = md5(implode(',', $this->scripts) . $type . $this->plugin->getPluginVersion());
|
212 |
+
$cache_dir_path = FACTORY_BOOTSTRAP_409_DIR . '/assets/cache/';
|
213 |
+
$cache_dir_url = FACTORY_BOOTSTRAP_409_URL . '/assets/cache/';
|
214 |
|
215 |
$cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
|
216 |
$cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
|
237 |
foreach($sripts as $script_to_load) {
|
238 |
$script_to_load = sanitize_text_field($script_to_load);
|
239 |
if( $cache_dir_exists ) {
|
240 |
+
$fname = FACTORY_BOOTSTRAP_409_DIR . "/assets/$type-min/$script_to_load.min." . $type;
|
241 |
if( file_exists($fname) ) {
|
242 |
$f = @fopen($fname, 'r');
|
243 |
$concat_files[] = @fread($f, filesize($fname));
|
245 |
}
|
246 |
} else {
|
247 |
if( $type == 'js' ) {
|
248 |
+
wp_enqueue_script(md5($script_to_load), FACTORY_BOOTSTRAP_409_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_409_URL . "/assets/$type-min/$script_to_load.min." . $type, array(), $this->plugin->getPluginVersion());
|
253 |
}
|
254 |
$is_first = false;
|
255 |
}
|
libs/factory/bootstrap/includes/index.php
ADDED
File without changes
|
libs/factory/bootstrap/index.php
ADDED
File without changes
|
libs/factory/clearfy/assets/css/clearfy-base.css
ADDED
@@ -0,0 +1,180 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Базовые стили для всех копомпонентов Clearfy
|
3 |
+
|
4 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
5 |
+
* @copyright Webcraftic 06.10.2018
|
6 |
+
* @sicne 2.0.5
|
7 |
+
*/
|
8 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-suggetion {
|
9 |
+
padding: 30px 80px;
|
10 |
+
}
|
11 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-suggetion h3 {
|
12 |
+
margin: 0 0 20px;
|
13 |
+
}
|
14 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-suggetion .wbcr-factory-inner-contanier {
|
15 |
+
border: 2px dashed #8bc34a;
|
16 |
+
background: #fff;
|
17 |
+
padding: 20px;
|
18 |
+
}
|
19 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-suggetion .wbcr-factory-activate-premium {
|
20 |
+
display: inline-block;
|
21 |
+
cursor: pointer;
|
22 |
+
line-height: 16px;
|
23 |
+
font-size: 13px;
|
24 |
+
font-weight: 600;
|
25 |
+
padding: 12px 20px;
|
26 |
+
text-align: center;
|
27 |
+
text-decoration: none;
|
28 |
+
text-transform: uppercase;
|
29 |
+
border-radius: 2px;
|
30 |
+
-moz-border-radius: 2px;
|
31 |
+
-webkit-border-radius: 2px;
|
32 |
+
color: #353535;
|
33 |
+
background: #e8e8e8;
|
34 |
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
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-410-impressive-page-template .wbcr-factory-clearfy-206-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-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-suggetion .wbcr-factory-activate-premium:focus {
|
44 |
+
outline: none;
|
45 |
+
border: 0;
|
46 |
+
}
|
47 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-suggetion .wbcr-factory-purchase-premium {
|
48 |
+
display: inline-block;
|
49 |
+
cursor: pointer;
|
50 |
+
line-height: 16px;
|
51 |
+
font-size: 13px;
|
52 |
+
font-weight: 600;
|
53 |
+
padding: 12px 20px;
|
54 |
+
text-align: center;
|
55 |
+
text-decoration: none;
|
56 |
+
text-transform: uppercase;
|
57 |
+
border-radius: 2px;
|
58 |
+
-moz-border-radius: 2px;
|
59 |
+
-webkit-border-radius: 2px;
|
60 |
+
color: #755c0e;
|
61 |
+
background: #fdd868;
|
62 |
+
box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
|
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-410-impressive-page-template .wbcr-factory-clearfy-206-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-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-suggetion .wbcr-factory-purchase-premium:focus {
|
72 |
+
outline: none;
|
73 |
+
border: 0;
|
74 |
+
}
|
75 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion {
|
76 |
+
background: #fff;
|
77 |
+
color: #353535;
|
78 |
+
font-weight: 600;
|
79 |
+
border: 2px dashed #8bc34a;
|
80 |
+
}
|
81 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion h3 {
|
82 |
+
margin: 0 0 20px;
|
83 |
+
padding: 10px 0;
|
84 |
+
text-align: center;
|
85 |
+
border-bottom: 2px solid #e6e6e6;
|
86 |
+
color: #636363;
|
87 |
+
font-size: 17px;
|
88 |
+
font-weight: 600;
|
89 |
+
vertical-align: middle;
|
90 |
+
text-transform: uppercase;
|
91 |
+
}
|
92 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion ul {
|
93 |
+
position: relative;
|
94 |
+
margin-bottom: 20px;
|
95 |
+
}
|
96 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion ul li {
|
97 |
+
font-size: 15px;
|
98 |
+
padding: 7px;
|
99 |
+
padding-left: 20px;
|
100 |
+
}
|
101 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion ul li:before {
|
102 |
+
content: " ";
|
103 |
+
display: inline-block;
|
104 |
+
width: 0.4em;
|
105 |
+
height: 0.7em;
|
106 |
+
border: solid #8bc34a;
|
107 |
+
border-width: 0 0.2em 0.2em 0;
|
108 |
+
left: 0;
|
109 |
+
margin-right: 10px;
|
110 |
+
-webkit-transform: rotate(45deg);
|
111 |
+
-moz-transform: rotate(45deg);
|
112 |
+
-o-transform: rotate(45deg);
|
113 |
+
transform: rotate(45deg);
|
114 |
+
}
|
115 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion .wbcr-factory-purchase-premium {
|
116 |
+
display: block;
|
117 |
+
cursor: pointer;
|
118 |
+
line-height: 16px;
|
119 |
+
font-size: 13px;
|
120 |
+
font-weight: 600;
|
121 |
+
padding: 12px 20px;
|
122 |
+
text-align: center;
|
123 |
+
text-decoration: none;
|
124 |
+
text-transform: uppercase;
|
125 |
+
border-radius: 2px;
|
126 |
+
-moz-border-radius: 2px;
|
127 |
+
-webkit-border-radius: 2px;
|
128 |
+
color: #353535;
|
129 |
+
background: #e8e8e8;
|
130 |
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
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-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-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-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-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-410-impressive-page-template .wbcr-factory-clearfy-206-multisite-pro-suggetion {
|
145 |
+
padding: 10px 80px;
|
146 |
+
}
|
147 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion {
|
148 |
+
padding: 10px;
|
149 |
+
}
|
150 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-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-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion ul {
|
157 |
+
margin-bottom: 20px;
|
158 |
+
}
|
159 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion ul li {
|
160 |
+
font-size: 13px;
|
161 |
+
padding: 2px;
|
162 |
+
padding-left: 10px;
|
163 |
+
}
|
164 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-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-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-206-pro-suggettion .wbcr-factory-purchase-premium {
|
172 |
+
font-weight: 700;
|
173 |
+
line-height: 16px;
|
174 |
+
font-size: 12px;
|
175 |
+
padding: 8px 12px;
|
176 |
+
border-radius: 2px;
|
177 |
+
-moz-border-radius: 2px;
|
178 |
+
-webkit-border-radius: 2px;
|
179 |
+
}
|
180 |
+
}
|
libs/factory/clearfy/assets/css/clearfy-base.less
ADDED
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Базовые стили для всех копомпонентов Clearfy
|
3 |
+
|
4 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
5 |
+
* @copyright Webcraftic 06.10.2018
|
6 |
+
* @sicne 2.0.5
|
7 |
+
*/
|
8 |
+
|
9 |
+
.button(@backgroundColor: #e8e8e8,@color:#353535, @boxShadow:rgba(0, 0, 0, 0.2)) {
|
10 |
+
cursor: pointer;
|
11 |
+
line-height: 16px;
|
12 |
+
font-size: 13px;
|
13 |
+
font-weight: 600;
|
14 |
+
padding: 12px 20px;
|
15 |
+
text-align: center;
|
16 |
+
text-decoration: none;
|
17 |
+
text-transform: uppercase;
|
18 |
+
border-radius: 2px;
|
19 |
+
-moz-border-radius: 2px;
|
20 |
+
-webkit-border-radius: 2px;
|
21 |
+
color: @color;
|
22 |
+
background: @backgroundColor;
|
23 |
+
box-shadow: 0 1px 0 @boxShadow;
|
24 |
+
-moz-box-shadow: 0 1px 0 @boxShadow;
|
25 |
+
-webkit-box-shadow: 0 1px 0 @boxShadow;
|
26 |
+
&:active {
|
27 |
+
box-shadow: inset 0 1px 0 @boxShadow;
|
28 |
+
-moz-box-shadow: inset 0 1px 0 @boxShadow;
|
29 |
+
-webkit-box-shadow: inset 0 1px 0 @boxShadow;
|
30 |
+
}
|
31 |
+
&:focus {
|
32 |
+
outline: none;
|
33 |
+
border: 0;
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
#WBCR {
|
38 |
+
|
39 |
+
.wbcr-factory-pages-000-impressive-page-template {
|
40 |
+
.wbcr-factory-clearfy-000-multisite-suggetion {
|
41 |
+
padding: 30px 80px;
|
42 |
+
|
43 |
+
h3 {
|
44 |
+
margin: 0 0 20px;
|
45 |
+
}
|
46 |
+
|
47 |
+
.wbcr-factory-inner-contanier {
|
48 |
+
border: 2px dashed #8bc34a;
|
49 |
+
background: #fff;
|
50 |
+
padding: 20px;
|
51 |
+
}
|
52 |
+
|
53 |
+
.wbcr-factory-activate-premium {
|
54 |
+
display: inline-block;
|
55 |
+
.button();
|
56 |
+
}
|
57 |
+
.wbcr-factory-purchase-premium {
|
58 |
+
display: inline-block;
|
59 |
+
.button(#fdd868, #755c0e, rgba(60, 45, 2, 0.31));
|
60 |
+
}
|
61 |
+
}
|
62 |
+
|
63 |
+
.wbcr-factory-right-sidebar-section {
|
64 |
+
.wbcr-factory-clearfy-000-pro-suggettion {
|
65 |
+
background: #fff;
|
66 |
+
color: #353535;
|
67 |
+
font-weight: 600;
|
68 |
+
border: 2px dashed #8bc34a;
|
69 |
+
|
70 |
+
h3 {
|
71 |
+
margin: 0 0 20px;
|
72 |
+
padding: 10px 0;
|
73 |
+
text-align: center;
|
74 |
+
border-bottom: 2px solid #e6e6e6;
|
75 |
+
color: #636363;
|
76 |
+
font-size: 17px;
|
77 |
+
font-weight: 600;
|
78 |
+
vertical-align: middle;
|
79 |
+
text-transform: uppercase;
|
80 |
+
}
|
81 |
+
|
82 |
+
ul {
|
83 |
+
//list-style: circle;
|
84 |
+
position: relative;
|
85 |
+
margin-bottom: 20px;
|
86 |
+
|
87 |
+
li {
|
88 |
+
font-size: 15px;
|
89 |
+
padding: 7px;
|
90 |
+
padding-left: 20px;
|
91 |
+
&:before {
|
92 |
+
}
|
93 |
+
|
94 |
+
&:before {
|
95 |
+
content: " ";
|
96 |
+
display: inline-block;
|
97 |
+
width: 0.4em;
|
98 |
+
height: 0.7em;
|
99 |
+
border: solid #8bc34a;
|
100 |
+
border-width: 0 0.2em 0.2em 0;
|
101 |
+
left: 0;
|
102 |
+
margin-right: 10px;
|
103 |
+
-webkit-transform: rotate(45deg);
|
104 |
+
-moz-transform: rotate(45deg);
|
105 |
+
-o-transform: rotate(45deg);
|
106 |
+
transform: rotate(45deg);
|
107 |
+
}
|
108 |
+
|
109 |
+
}
|
110 |
+
}
|
111 |
+
|
112 |
+
.wbcr-factory-purchase-premium {
|
113 |
+
display: block;
|
114 |
+
.button();
|
115 |
+
}
|
116 |
+
}
|
117 |
+
}
|
118 |
+
}
|
119 |
+
}
|
120 |
+
|
121 |
+
@media screen and (max-width: 1550px) {
|
122 |
+
#WBCR {
|
123 |
+
.wbcr-factory-pages-000-impressive-page-template {
|
124 |
+
.wbcr-factory-clearfy-000-multisite-pro-suggetion {
|
125 |
+
padding: 10px 80px;
|
126 |
+
}
|
127 |
+
|
128 |
+
.wbcr-factory-right-sidebar-section {
|
129 |
+
.wbcr-factory-clearfy-000-pro-suggettion {
|
130 |
+
padding: 10px;
|
131 |
+
|
132 |
+
h3 {
|
133 |
+
margin: 0 0 20px;
|
134 |
+
padding: 10px 0;
|
135 |
+
font-size: 13px;
|
136 |
+
font-weight: 600;
|
137 |
+
}
|
138 |
+
|
139 |
+
ul {
|
140 |
+
margin-bottom: 20px;
|
141 |
+
|
142 |
+
li {
|
143 |
+
font-size: 13px;
|
144 |
+
padding: 2px;
|
145 |
+
padding-left: 10px;
|
146 |
+
|
147 |
+
&:before {
|
148 |
+
width: 0.4em;
|
149 |
+
height: 0.7em;
|
150 |
+
border-width: 0 0.2em 0.2em 0;
|
151 |
+
left: 0;
|
152 |
+
margin-right: 10px;
|
153 |
+
}
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
.wbcr-factory-purchase-premium {
|
158 |
+
font-weight: 700;
|
159 |
+
line-height: 16px;
|
160 |
+
font-size: 12px;
|
161 |
+
padding: 8px 12px;
|
162 |
+
border-radius: 2px;
|
163 |
+
-moz-border-radius: 2px;
|
164 |
+
-webkit-border-radius: 2px;
|
165 |
+
}
|
166 |
+
}
|
167 |
+
}
|
168 |
+
}
|
169 |
+
}
|
170 |
+
}
|
libs/factory/clearfy/assets/css/index.php
ADDED
File without changes
|
libs/factory/clearfy/assets/index.php
ADDED
File without changes
|
libs/factory/clearfy/assets/js/globals.js
ADDED
@@ -0,0 +1,203 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Глобальный JS файл, который регистрирует глобальные переменные с общими методами для всех компонентов Clearfy
|
3 |
+
* и самого Clearfy.
|
4 |
+
*
|
5 |
+
* $.wbcr_factory_clearfy_206.app - методы для работы с приложением. Скрыть, показать уведомления.
|
6 |
+
* $.wbcr_factory_clearfy_206.hooks - это иммитация хуков и фильтров аналогично тем, что используются в Wordpress
|
7 |
+
*
|
8 |
+
* Copyright 2018, Webcraftic, http://webcraftic.com
|
9 |
+
*
|
10 |
+
* @since 2.0.5
|
11 |
+
* @pacakge clearfy
|
12 |
+
*/
|
13 |
+
(function($) {
|
14 |
+
'use strict';
|
15 |
+
|
16 |
+
if( !$.wbcr_factory_clearfy_206 ) {
|
17 |
+
$.wbcr_factory_clearfy_206 = {};
|
18 |
+
}
|
19 |
+
|
20 |
+
$.wbcr_factory_clearfy_206.app = $.wbcr_factory_clearfy_206.app || {
|
21 |
+
/**
|
22 |
+
* Создает и показывает уведомление внутри интерфейса Clearfy
|
23 |
+
*
|
24 |
+
* @param {string} message - сообщение об ошибке или предупреждение
|
25 |
+
* @param {string} type - тип уведомления (error, warning, success)
|
26 |
+
*/
|
27 |
+
showNotice: function(message, type) {
|
28 |
+
var noticeContanier = $('<div></div>'),
|
29 |
+
noticeInnerWrap = $('<p></p>'),
|
30 |
+
dashicon = $('<span></span>'),
|
31 |
+
dashiconClass,
|
32 |
+
noticeId = this.makeid();
|
33 |
+
|
34 |
+
if( !type ) {
|
35 |
+
type = 'warning';
|
36 |
+
}
|
37 |
+
|
38 |
+
noticeContanier.addClass('alert', 'wbcr-factory-warning-notice')
|
39 |
+
.addClass('alert-' + type).addClass('wbcr-factory-' + type + '-notice');
|
40 |
+
|
41 |
+
noticeContanier.append(noticeInnerWrap);
|
42 |
+
noticeContanier.attr('id', 'uq-' + noticeId);
|
43 |
+
|
44 |
+
if( type == 'success' ) {
|
45 |
+
dashiconClass = 'dashicons-plus';
|
46 |
+
} else if( type == 'error' ) {
|
47 |
+
dashiconClass = 'dashicons-no';
|
48 |
+
} else {
|
49 |
+
dashiconClass = 'dashicons-warning';
|
50 |
+
}
|
51 |
+
|
52 |
+
dashicon.addClass('dashicons').addClass(dashiconClass);
|
53 |
+
noticeInnerWrap.prepend(dashicon);
|
54 |
+
dashicon.after(message);
|
55 |
+
|
56 |
+
$([document.documentElement, document.body]).animate({
|
57 |
+
scrollTop: $('.wbcr-factory-content').offset().top - 100
|
58 |
+
}, 300, function() {
|
59 |
+
noticeContanier.hide();
|
60 |
+
$('.wbcr-factory-content').prepend(noticeContanier);
|
61 |
+
noticeContanier.fadeIn();
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Хук выполняет проивольную функцию, после того как уведомление отображено
|
65 |
+
* Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
|
66 |
+
* Пример регистрации хука $.wbcr_factory_clearfy_206.hooks.add('wbcr/factory_clearfy_206/updated',
|
67 |
+
* function(noticeId) {});
|
68 |
+
* @param {string} noticeId - id уведомления
|
69 |
+
*/
|
70 |
+
$.wbcr_factory_clearfy_206.hooks.run('wbcr/factory_clearfy_206/showed_notice', [noticeId]);
|
71 |
+
$.wbcr_factory_clearfy_206.hooks.run('wbcr/clearfy/showed_notice', [noticeId]);
|
72 |
+
});
|
73 |
+
|
74 |
+
return noticeId;
|
75 |
+
},
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Удаляет уведомление из интерфейса Clearfy
|
79 |
+
*
|
80 |
+
* @param {string} noticeId - id уведомления
|
81 |
+
*/
|
82 |
+
hideNotice: function(noticeId) {
|
83 |
+
var el;
|
84 |
+
if( !noticeId ) {
|
85 |
+
el = $('.wbcr-factory-content').find('.alert');
|
86 |
+
} else {
|
87 |
+
el = $('#uq-' + noticeId);
|
88 |
+
}
|
89 |
+
|
90 |
+
el.fadeOut(500, function(e) {
|
91 |
+
$(e).remove();
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Хук выполняет проивольную функцию, после того как уведомление скрыто
|
95 |
+
* Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
|
96 |
+
* Пример регистрации хука $.wbcr_factory_clearfy_206.hooks.add('wbcr/factory_clearfy_206/updated',
|
97 |
+
* function(noticeId)
|
98 |
+
* {});
|
99 |
+
* @param {string} noticeId - id уведомления
|
100 |
+
*/
|
101 |
+
$.wbcr_factory_clearfy_206.hooks.run('wbcr/factory_clearfy_206/hidded_notice', [noticeId]);
|
102 |
+
$.wbcr_factory_clearfy_206.hooks.run('wbcr/clearfy/hidded_notice', [noticeId]);
|
103 |
+
});
|
104 |
+
},
|
105 |
+
|
106 |
+
makeid: function() {
|
107 |
+
var text = "";
|
108 |
+
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
109 |
+
|
110 |
+
for( var i = 0; i < 32; i++ ) {
|
111 |
+
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
112 |
+
}
|
113 |
+
|
114 |
+
return text;
|
115 |
+
}
|
116 |
+
|
117 |
+
};
|
118 |
+
|
119 |
+
$.wbcr_factory_clearfy_206.filters = $.wbcr_factory_clearfy_206.filters || {
|
120 |
+
|
121 |
+
/**
|
122 |
+
* A set of registered filters.
|
123 |
+
*/
|
124 |
+
_items: {},
|
125 |
+
|
126 |
+
/**
|
127 |
+
* A set of priorities of registered filters.
|
128 |
+
*/
|
129 |
+
_priorities: {},
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Applies filters to a given input value.
|
133 |
+
*/
|
134 |
+
run: function(filterName, args) {
|
135 |
+
var input = args && args.length > 0 ? args[0] : null;
|
136 |
+
if( !this._items[filterName] ) {
|
137 |
+
return input;
|
138 |
+
}
|
139 |
+
|
140 |
+
for( var i in this._priorities[filterName] ) {
|
141 |
+
if( !this._priorities[filterName].hasOwnProperty(i) ) {
|
142 |
+
continue;
|
143 |
+
}
|
144 |
+
|
145 |
+
var priority = this._priorities[filterName][i];
|
146 |
+
|
147 |
+
for( var k = 0; k < this._items[filterName][priority].length; k++ ) {
|
148 |
+
var f = this._items[filterName][priority][k];
|
149 |
+
input = f.apply(f, args);
|
150 |
+
}
|
151 |
+
}
|
152 |
+
|
153 |
+
return input;
|
154 |
+
},
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Registers a new filter.
|
158 |
+
*/
|
159 |
+
add: function(filterName, callback, priority) {
|
160 |
+
|
161 |
+
if( !priority ) {
|
162 |
+
priority = 10;
|
163 |
+
}
|
164 |
+
|
165 |
+
if( !this._items[filterName] ) {
|
166 |
+
this._items[filterName] = {};
|
167 |
+
}
|
168 |
+
if( !this._items[filterName][priority] ) {
|
169 |
+
this._items[filterName][priority] = [];
|
170 |
+
}
|
171 |
+
this._items[filterName][priority].push(callback);
|
172 |
+
|
173 |
+
if( !this._priorities[filterName] ) {
|
174 |
+
this._priorities[filterName] = [];
|
175 |
+
}
|
176 |
+
if( $.inArray(priority, this._priorities[filterName]) === -1 ) {
|
177 |
+
this._priorities[filterName].push(priority);
|
178 |
+
}
|
179 |
+
|
180 |
+
this._priorities[filterName].sort(function(a, b) {
|
181 |
+
return a - b;
|
182 |
+
});
|
183 |
+
}
|
184 |
+
};
|
185 |
+
|
186 |
+
$.wbcr_factory_clearfy_206.hooks = $.wbcr_factory_clearfy_206.hooks || {
|
187 |
+
|
188 |
+
/**
|
189 |
+
* Applies filters to a given input value.
|
190 |
+
*/
|
191 |
+
run: function(filterName, args) {
|
192 |
+
$.wbcr_factory_clearfy_206.filters.run(filterName, args);
|
193 |
+
},
|
194 |
+
|
195 |
+
/**
|
196 |
+
* Registers a new filter.
|
197 |
+
*/
|
198 |
+
add: function(filterName, callback, priority) {
|
199 |
+
$.wbcr_factory_clearfy_206.filters.add(filterName, callback, priority);
|
200 |
+
}
|
201 |
+
};
|
202 |
+
|
203 |
+
})(jQuery);
|
libs/factory/clearfy/assets/js/index.php
ADDED
File without changes
|
libs/factory/clearfy/boot.php
CHANGED
@@ -14,24 +14,34 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( defined('
|
18 |
return;
|
19 |
}
|
20 |
-
define('FACTORY_CLEARFY_203_LOADED', true);
|
21 |
|
22 |
-
define('
|
23 |
-
define('FACTORY_CLEARFY_203_URL', plugins_url(null, __FILE__));
|
24 |
|
25 |
-
|
26 |
|
27 |
-
|
28 |
-
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
// module provides function only for the admin area
|
31 |
-
if(
|
32 |
-
|
33 |
-
|
|
|
|
|
|
|
|
|
|
|
34 |
|
35 |
-
|
36 |
-
|
|
|
|
|
37 |
}
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( defined('FACTORY_CLEARFY_206_LOADED') ) {
|
18 |
return;
|
19 |
}
|
|
|
20 |
|
21 |
+
define('FACTORY_CLEARFY_206_LOADED', true);
|
|
|
22 |
|
23 |
+
define('FACTORY_CLEARFY_206', '2.0.6');
|
24 |
|
25 |
+
define('FACTORY_CLEARFY_206_DIR', dirname(__FILE__));
|
26 |
+
define('FACTORY_CLEARFY_206_URL', plugins_url(null, __FILE__));
|
27 |
+
|
28 |
+
load_plugin_textdomain('wbcr_factory_clearfy_206', false, dirname(plugin_basename(__FILE__)) . '/langs');
|
29 |
+
|
30 |
+
require(FACTORY_CLEARFY_206_DIR . '/includes/class.helpers.php');
|
31 |
+
require(FACTORY_CLEARFY_206_DIR . '/includes/class.configurate.php');
|
32 |
|
33 |
// module provides function only for the admin area
|
34 |
+
if( is_admin() ) {
|
35 |
+
/**
|
36 |
+
* Подключаем скрипты для установки компонентов Clearfy
|
37 |
+
* на все страницы админпанели
|
38 |
+
*/
|
39 |
+
add_action('admin_enqueue_scripts', function () {
|
40 |
+
wp_enqueue_script('wbcr-factory-clearfy-206-global', FACTORY_CLEARFY_206_URL . '/assets/js/globals.js', array('jquery'), FACTORY_CLEARFY_206);
|
41 |
+
});
|
42 |
|
43 |
+
if( defined('FACTORY_PAGES_410_LOADED') ) {
|
44 |
+
require(FACTORY_CLEARFY_206_DIR . '/pages/more-features.php');
|
45 |
+
require(FACTORY_CLEARFY_206_DIR . '/pages/class.pages.php');
|
46 |
+
}
|
47 |
}
|
libs/factory/clearfy/includes/check-clearfy-compatibility.php
ADDED
@@ -0,0 +1,306 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Класс позволяет получить информацию о плагине Clearfy и его совместимость с другими плагинами.
|
5 |
+
* Наследует класс Wbcr_Factory_Compatibility, который отвечает за проверку базовой совместимости сайта.
|
6 |
+
*
|
7 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
8 |
+
* @copyright (c) 26.09.2018, Webcraftic
|
9 |
+
* @version 1.0.0
|
10 |
+
* @since 2.0.5
|
11 |
+
*/
|
12 |
+
if( !class_exists('Wbcr_FactoryClearfy_Compatibility') ) {
|
13 |
+
|
14 |
+
class Wbcr_FactoryClearfy_Compatibility extends Wbcr_Factory_Compatibility {
|
15 |
+
|
16 |
+
protected $factory_version;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @var bool
|
20 |
+
*/
|
21 |
+
protected $plugin_as_component;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @var bool
|
25 |
+
*/
|
26 |
+
protected $plugin_already_activate;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @var bool
|
30 |
+
*/
|
31 |
+
protected $plugin_dir;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @var bool
|
35 |
+
*/
|
36 |
+
protected $plugin_base;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @var bool
|
40 |
+
*/
|
41 |
+
protected $plugin_url;
|
42 |
+
|
43 |
+
/**
|
44 |
+
* С какой версией Clearfy может работать этот плагин
|
45 |
+
*
|
46 |
+
* @var string
|
47 |
+
*/
|
48 |
+
protected $required_clearfy_version = '1.4.2';
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Нужно ли требовать активацию Clearfy для работы этого плагина
|
52 |
+
* Если true, то нужно
|
53 |
+
*
|
54 |
+
* @var bool по умолчанию false
|
55 |
+
*/
|
56 |
+
protected $required_clearfy_active = false;
|
57 |
+
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Нужно ли проверять активирован ли этот плагин, как компонент в плагине Clearfy
|
61 |
+
* Если true, то нужно
|
62 |
+
*
|
63 |
+
* @var bool по умолчанию false
|
64 |
+
*/
|
65 |
+
protected $required_clearfy_check_component = false;
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Нужно ли проверять совместимость фреймворка для работы с плагином Clearfy
|
69 |
+
* Если true, то нужно
|
70 |
+
*
|
71 |
+
* @var bool по умолчанию false
|
72 |
+
*/
|
73 |
+
protected $required_clearfy_framework_compatibility = false;
|
74 |
+
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Нужно ли проверять совместимость этого плагин с версией Clearfy
|
78 |
+
* Если true, то нужно
|
79 |
+
*
|
80 |
+
* @var bool по умолчанию false
|
81 |
+
*/
|
82 |
+
protected $required_clearfy_version_compatibility = false;
|
83 |
+
|
84 |
+
|
85 |
+
function __construct(array $plugin_info)
|
86 |
+
{
|
87 |
+
parent::__construct($plugin_info);
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Это статистический метод. Вовзращает директорию плагина Clearfy
|
92 |
+
*
|
93 |
+
* @return string
|
94 |
+
*/
|
95 |
+
public static function getClearfyDir()
|
96 |
+
{
|
97 |
+
$folder_name = 'clearfy';
|
98 |
+
|
99 |
+
return WP_PLUGIN_DIR . '/' . $folder_name;
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* Это статистический метод. Вовзращает базовый путь к плагину Clearfy
|
104 |
+
* Пример: clearfy/clearfy.php
|
105 |
+
*
|
106 |
+
* @return string
|
107 |
+
*/
|
108 |
+
public static function getClearfyBasePath()
|
109 |
+
{
|
110 |
+
return plugin_basename(self::getClearfyPluginFile());
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Это статистический метод. Вовзращает aбсолютный путь к основному файлу плагина Clearfy *
|
115 |
+
* Пример: www/wp-content/plugins/clearfy/clearfy.php
|
116 |
+
*
|
117 |
+
* @return string
|
118 |
+
*/
|
119 |
+
public static function getClearfyPluginFile()
|
120 |
+
{
|
121 |
+
return self::getClearfyDir() . '/clearfy.php';
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Это статистический метод. Возвращает версию плагина Clearfy *
|
126 |
+
* Пример: 1.3.0
|
127 |
+
*
|
128 |
+
* @return string
|
129 |
+
*/
|
130 |
+
public static function getClearfyVersion()
|
131 |
+
{
|
132 |
+
require_once ABSPATH . '/wp-admin/includes/plugin.php';
|
133 |
+
|
134 |
+
$plugin_data = get_plugin_data(self::getClearfyPluginFile());
|
135 |
+
|
136 |
+
return !empty($plugin_data['Version']) ? $plugin_data['Version'] : null;
|
137 |
+
}
|
138 |
+
|
139 |
+
public function registerNotices()
|
140 |
+
{
|
141 |
+
if( current_user_can('activate_plugins') && current_user_can('edit_plugins') && current_user_can('install_plugins') ) {
|
142 |
+
if( is_plugin_active_for_network(self::getClearfyBasePath()) ) {
|
143 |
+
add_action('network_admin_notices', array($this, 'showNotice'));
|
144 |
+
} else {
|
145 |
+
add_action('admin_notices', array($this, 'showNotice'));
|
146 |
+
}
|
147 |
+
}
|
148 |
+
}
|
149 |
+
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Проверяем, активирован ли плагин Clearfy
|
153 |
+
*
|
154 |
+
* @return bool
|
155 |
+
*/
|
156 |
+
public static function isClearfyActivate()
|
157 |
+
{
|
158 |
+
require_once ABSPATH . '/wp-admin/includes/plugin.php';
|
159 |
+
|
160 |
+
return is_plugin_active(self::getClearfyBasePath());
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Проверяем, активирован ли плагин, как компонент в Clearfy
|
165 |
+
*
|
166 |
+
* @return bool
|
167 |
+
*/
|
168 |
+
public function isPluginActiveAsComponent()
|
169 |
+
{
|
170 |
+
return self::isClearfyActivate() && !$this->plugin_as_component;
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Проверяем совместимость с версией фреймворка, который использует плагина Clearfy
|
175 |
+
*
|
176 |
+
* @return bool
|
177 |
+
*/
|
178 |
+
public function checkClearfyFrameworkCompatibility()
|
179 |
+
{
|
180 |
+
if( !defined('WBCR_CLEARFY_FRAMEWORK_VER') || empty($this->factory_version) ) {
|
181 |
+
return false;
|
182 |
+
}
|
183 |
+
|
184 |
+
return WBCR_CLEARFY_FRAMEWORK_VER == $this->factory_version;
|
185 |
+
}
|
186 |
+
|
187 |
+
/**
|
188 |
+
* Проверяем совместимость этого плагина с версией Clearfy
|
189 |
+
*
|
190 |
+
* @return bool
|
191 |
+
*/
|
192 |
+
public function checkClearfyVersionCompatibility()
|
193 |
+
{
|
194 |
+
$plugin_version = self::getClearfyVersion();
|
195 |
+
|
196 |
+
if( !empty($plugin_version) ) {
|
197 |
+
if( !version_compare($plugin_version, $this->required_clearfy_version, '>=') ) {
|
198 |
+
return false;
|
199 |
+
}
|
200 |
+
}
|
201 |
+
|
202 |
+
return true;
|
203 |
+
}
|
204 |
+
|
205 |
+
/**
|
206 |
+
* Совместимость с плагином Clearfy, проверяется только в премиум компонентах,
|
207 |
+
* так как компоненты компилируются с Clearfy на одной версии фреймворка
|
208 |
+
*
|
209 |
+
* @return bool|mixed
|
210 |
+
*/
|
211 |
+
public function check()
|
212 |
+
{
|
213 |
+
if( $this->plugin_already_activate ) {
|
214 |
+
return false;
|
215 |
+
}
|
216 |
+
|
217 |
+
if( $this->required_clearfy_check_component && $this->isPluginActiveAsComponent() ) {
|
218 |
+
return false;
|
219 |
+
}
|
220 |
+
|
221 |
+
if( !parent::check() ) {
|
222 |
+
return false;
|
223 |
+
}
|
224 |
+
|
225 |
+
if( !self::checkClearfyFrameworkCompatibility() && $this->required_clearfy_framework_compatibility ) {
|
226 |
+
return false;
|
227 |
+
}
|
228 |
+
|
229 |
+
if( $this->required_clearfy_active ) {
|
230 |
+
if( self::isClearfyActivate() ) {
|
231 |
+
if( $this->required_clearfy_version_compatibility ) {
|
232 |
+
$plugin_version = self::getClearfyVersion();
|
233 |
+
|
234 |
+
if( !empty($plugin_version) ) {
|
235 |
+
if( !version_compare($plugin_version, $this->required_clearfy_version, '>=') ) {
|
236 |
+
return false;
|
237 |
+
}
|
238 |
+
}
|
239 |
+
}
|
240 |
+
} else {
|
241 |
+
return false;
|
242 |
+
}
|
243 |
+
}
|
244 |
+
|
245 |
+
return true;
|
246 |
+
}
|
247 |
+
|
248 |
+
/**
|
249 |
+
* Метод возвращает текст уведомления
|
250 |
+
*
|
251 |
+
* @return string
|
252 |
+
*/
|
253 |
+
public function getNoticeText()
|
254 |
+
{
|
255 |
+
if( !self::isClearfyActivate() && !$this->required_clearfy_active ) {
|
256 |
+
return parent::getNoticeText();
|
257 |
+
}
|
258 |
+
|
259 |
+
$notice_text = $notice_default_text = '';
|
260 |
+
|
261 |
+
if( self::isClearfyActivate() ) {
|
262 |
+
$notice_default_text .= '<b>' . __('Clearfy warning', 'wbcr_factory_clearfy_206') . ':</b>' . '<br>';
|
263 |
+
$phrase = sprintf(__('The %s component', 'wbcr_factory_clearfy_206'), $this->plugin_title);
|
264 |
+
} else {
|
265 |
+
$notice_default_text .= '<b>' . $this->plugin_title . ' ' . __('warning', 'wbcr_factory_clearfy_206') . ':</b>' . '<br>';
|
266 |
+
$phrase = sprintf(__('The %s plugin', 'wbcr_factory_clearfy_206'), $this->plugin_title);
|
267 |
+
}
|
268 |
+
|
269 |
+
$notice_default_text .= $phrase . ' ' . __('has stopped.', 'wbcr_factory_clearfy_206');
|
270 |
+
$notice_default_text .= __('Possible reasons:', 'wbcr_factory_clearfy_206') . ' <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_206'), $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_206'), $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_206'), $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_206'), $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_206'), $this->plugin_title, $this->plugin_title) . '<br>';
|
297 |
+
}
|
298 |
+
|
299 |
+
if( $has_one ) {
|
300 |
+
$notice_text = $notice_default_text . $notice_text;
|
301 |
+
}
|
302 |
+
|
303 |
+
return $notice_text;
|
304 |
+
}
|
305 |
+
}
|
306 |
+
}
|
libs/factory/clearfy/includes/class.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();
|
@@ -33,6 +33,18 @@
|
|
33 |
*/
|
34 |
abstract protected function registerActionsAndFilters();
|
35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
/**
|
37 |
* Get options with namespace
|
38 |
*
|
@@ -45,6 +57,38 @@
|
|
45 |
return $this->plugin->getOption($option_name, $default);
|
46 |
}
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
/**
|
49 |
* @param $option_name
|
50 |
* @param $value
|
@@ -55,6 +99,15 @@
|
|
55 |
$this->plugin->updateOption($option_name, $value);
|
56 |
}
|
57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
/**
|
59 |
* @param $option_name
|
60 |
* @return bool
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_FactoryClearfy206_Configurate') ) {
|
18 |
|
19 |
+
abstract class Wbcr_FactoryClearfy206_Configurate {
|
20 |
|
21 |
/**
|
22 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
23 |
*/
|
24 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
25 |
{
|
26 |
$this->plugin = $plugin;
|
27 |
$this->registerActionsAndFilters();
|
33 |
*/
|
34 |
abstract protected function registerActionsAndFilters();
|
35 |
|
36 |
+
/**
|
37 |
+
* Get options with namespace
|
38 |
+
*
|
39 |
+
* @param $option_name
|
40 |
+
* @param bool $default
|
41 |
+
* @return mixed|void
|
42 |
+
*/
|
43 |
+
public function getPopulateOption($option_name, $default = false)
|
44 |
+
{
|
45 |
+
return $this->plugin->getPopulateOption($option_name, $default);
|
46 |
+
}
|
47 |
+
|
48 |
/**
|
49 |
* Get options with namespace
|
50 |
*
|
57 |
return $this->plugin->getOption($option_name, $default);
|
58 |
}
|
59 |
|
60 |
+
/**
|
61 |
+
* Get network options with namespace
|
62 |
+
*
|
63 |
+
* @param $option_name
|
64 |
+
* @param bool $default
|
65 |
+
* @return mixed|void
|
66 |
+
*/
|
67 |
+
public function getNetworkOption($option_name, $default = false)
|
68 |
+
{
|
69 |
+
return $this->plugin->getNetworkOption($option_name, $default);
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* @param $option_name
|
74 |
+
* @param $value
|
75 |
+
* @return bool
|
76 |
+
*/
|
77 |
+
public function updatePopulateOption($option_name, $value)
|
78 |
+
{
|
79 |
+
$this->plugin->updatePopulateOption($option_name, $value);
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* @param $option_name
|
84 |
+
* @param $value
|
85 |
+
* @return bool
|
86 |
+
*/
|
87 |
+
public function updateNetworkOption($option_name, $value)
|
88 |
+
{
|
89 |
+
$this->plugin->updateNetworkOption($option_name, $value);
|
90 |
+
}
|
91 |
+
|
92 |
/**
|
93 |
* @param $option_name
|
94 |
* @param $value
|
99 |
$this->plugin->updateOption($option_name, $value);
|
100 |
}
|
101 |
|
102 |
+
/**
|
103 |
+
* @param $option_name
|
104 |
+
* @return bool
|
105 |
+
*/
|
106 |
+
public function deletePopulateOption($option_name)
|
107 |
+
{
|
108 |
+
$this->plugin->deletePopulateOption($option_name);
|
109 |
+
}
|
110 |
+
|
111 |
/**
|
112 |
* @param $option_name
|
113 |
* @return bool
|
libs/factory/clearfy/includes/class.helpers.php
CHANGED
@@ -15,8 +15,124 @@
|
|
15 |
exit;
|
16 |
}
|
17 |
|
18 |
-
if( !class_exists('
|
19 |
-
class
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
21 |
/**
|
22 |
* Is permalink enabled?
|
@@ -78,9 +194,7 @@
|
|
78 |
|
79 |
public static function userTrailingslashit($string)
|
80 |
{
|
81 |
-
return self::useTrailingSlashes()
|
82 |
-
? trailingslashit($string)
|
83 |
-
: untrailingslashit($string);
|
84 |
}
|
85 |
|
86 |
/**
|
@@ -97,9 +211,7 @@
|
|
97 |
return false;
|
98 |
}
|
99 |
|
100 |
-
$pos = $case_sensitive
|
101 |
-
? strpos($string, $find)
|
102 |
-
: stripos($string, $find);
|
103 |
|
104 |
return !($pos === false);
|
105 |
}
|
@@ -145,9 +257,7 @@
|
|
145 |
if( $position == 'top' ) {
|
146 |
return array_merge($inserted, $arr);
|
147 |
}
|
148 |
-
$key_position = ($key === null)
|
149 |
-
? false
|
150 |
-
: array_search($key, array_keys($arr));
|
151 |
if( $key_position === false OR ($position != 'before' AND $position != 'after') ) {
|
152 |
return array_merge($arr, $inserted);
|
153 |
}
|
@@ -176,5 +286,85 @@
|
|
176 |
{
|
177 |
return htmlspecialchars(json_encode($data), ENT_QUOTES, 'UTF-8');
|
178 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
179 |
}
|
180 |
}
|
15 |
exit;
|
16 |
}
|
17 |
|
18 |
+
if( !class_exists('WbcrFactoryClearfy206_Helpers') ) {
|
19 |
+
class WbcrFactoryClearfy206_Helpers {
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Ссылка по умолчанию (анг)
|
23 |
+
*/
|
24 |
+
const WEBCRAFTIC_SITE_URL = 'https://clearfy.pro';
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Русская локализация сайта
|
28 |
+
*/
|
29 |
+
const WEBCRAFTIC_RU_SITE_URL = 'https://ru.clearfy.pro';
|
30 |
+
/**
|
31 |
+
* Украинская локализация сайта
|
32 |
+
*/
|
33 |
+
const WEBCRAFTIC_UA_SITE_URL = 'https://ua.clearfy.pro';
|
34 |
+
/**
|
35 |
+
* Испанская
|
36 |
+
*/
|
37 |
+
const WEBCRAFTIC_ES_SITE_URL = 'https://es.clearfy.pro';
|
38 |
+
/**
|
39 |
+
* Французкая
|
40 |
+
*/
|
41 |
+
const WEBCRAFTIC_DE_SITE_URL = 'https://de.clearfy.pro';
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @since 2.0.5
|
45 |
+
* @param int $price
|
46 |
+
* @return int
|
47 |
+
*/
|
48 |
+
public static function getClearfyBusinessPrice($price = 19)
|
49 |
+
{
|
50 |
+
return (int)apply_filters('wbcr/clearfy/business_price', $price);
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @since 2.0.5
|
55 |
+
* @param int $price
|
56 |
+
* @return int
|
57 |
+
*/
|
58 |
+
public static function getClearfyBusinessRevPrice($price = 69)
|
59 |
+
{
|
60 |
+
return (int)apply_filters('wbcr/clearfy/business_rev_price', $price);
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Get a link to the official website of the developer
|
65 |
+
*
|
66 |
+
* @return string|null
|
67 |
+
*/
|
68 |
+
public static function getWebcrafticSiteUrl()
|
69 |
+
{
|
70 |
+
if( get_locale() == 'ru_RU' ) {
|
71 |
+
return self::WEBCRAFTIC_RU_SITE_URL;
|
72 |
+
}
|
73 |
+
|
74 |
+
return self::WEBCRAFTIC_SITE_URL;
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* /**
|
79 |
+
* Get a link to the official website of the developer
|
80 |
+
*
|
81 |
+
* @since 2.0.5
|
82 |
+
* @param string $plugin_name
|
83 |
+
* @param string $page - page address
|
84 |
+
* @param string $utm_content - from which page or part of the plugin user moved to the site
|
85 |
+
* @param string $urm_source
|
86 |
+
* @return string
|
87 |
+
*/
|
88 |
+
public static function getWebcrafticSitePageUrl($plugin_name, $page, $utm_content = null, $urm_source = 'wordpress.org')
|
89 |
+
{
|
90 |
+
$args = array('utm_source' => $urm_source);
|
91 |
+
|
92 |
+
if( !empty($plugin_name) ) {
|
93 |
+
$args['utm_campaign'] = $plugin_name;
|
94 |
+
}
|
95 |
+
|
96 |
+
if( !empty($utm_content) ) {
|
97 |
+
$args['utm_content'] = $utm_content;
|
98 |
+
}
|
99 |
+
|
100 |
+
$raw_url = add_query_arg($args, self::getWebcrafticSiteUrl() . '/' . $page . '/');
|
101 |
+
$url = esc_url($raw_url);
|
102 |
+
|
103 |
+
/**
|
104 |
+
* @param string $url
|
105 |
+
* @param string $raw_url
|
106 |
+
* @param string $plugin_name
|
107 |
+
* @param string $page - page address
|
108 |
+
* @param string $utm_content - from which page or part of the plugin user moved to the site
|
109 |
+
* @param string $urm_source
|
110 |
+
*/
|
111 |
+
|
112 |
+
return apply_filters('wbcr/clearfy/webcraftic_site_page_url', $url, $raw_url, $plugin_name, $page, $utm_content, $urm_source);
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Recursive sanitation for an array
|
117 |
+
*
|
118 |
+
* @param $array
|
119 |
+
* @since 2.0.5
|
120 |
+
* @return mixed
|
121 |
+
*/
|
122 |
+
public static function recursiveSanitizeArray($array, $function)
|
123 |
+
{
|
124 |
+
foreach($array as $key => &$value) {
|
125 |
+
if( is_array($value) ) {
|
126 |
+
$value = self::recursiveSanitizeArray($value, $function);
|
127 |
+
} else {
|
128 |
+
if( function_exists($function) ) {
|
129 |
+
$value = $function($value);
|
130 |
+
}
|
131 |
+
}
|
132 |
+
}
|
133 |
+
|
134 |
+
return $array;
|
135 |
+
}
|
136 |
|
137 |
/**
|
138 |
* Is permalink enabled?
|
194 |
|
195 |
public static function userTrailingslashit($string)
|
196 |
{
|
197 |
+
return self::useTrailingSlashes() ? trailingslashit($string) : untrailingslashit($string);
|
|
|
|
|
198 |
}
|
199 |
|
200 |
/**
|
211 |
return false;
|
212 |
}
|
213 |
|
214 |
+
$pos = $case_sensitive ? strpos($string, $find) : stripos($string, $find);
|
|
|
|
|
215 |
|
216 |
return !($pos === false);
|
217 |
}
|
257 |
if( $position == 'top' ) {
|
258 |
return array_merge($inserted, $arr);
|
259 |
}
|
260 |
+
$key_position = ($key === null) ? false : array_search($key, array_keys($arr));
|
|
|
|
|
261 |
if( $key_position === false OR ($position != 'before' AND $position != 'after') ) {
|
262 |
return array_merge($arr, $inserted);
|
263 |
}
|
286 |
{
|
287 |
return htmlspecialchars(json_encode($data), ENT_QUOTES, 'UTF-8');
|
288 |
}
|
289 |
+
|
290 |
+
/**
|
291 |
+
* Replace url for multisite
|
292 |
+
*
|
293 |
+
* @param $string
|
294 |
+
*
|
295 |
+
* @return string
|
296 |
+
*/
|
297 |
+
public static function replaceMsUrl($string)
|
298 |
+
{
|
299 |
+
if( is_multisite() && BLOG_ID_CURRENT_SITE != get_current_blog_id() ) {
|
300 |
+
return str_replace(get_site_url(BLOG_ID_CURRENT_SITE), get_site_url(get_current_blog_id()), $string);
|
301 |
+
}
|
302 |
+
|
303 |
+
return $string;
|
304 |
+
}
|
305 |
+
|
306 |
+
/*
|
307 |
+
* Flushes as many page cache plugin's caches as possible.
|
308 |
+
*
|
309 |
+
* @return void
|
310 |
+
*/
|
311 |
+
public static function flushPageCache()
|
312 |
+
{
|
313 |
+
if( function_exists('wp_cache_clear_cache') ) {
|
314 |
+
if( is_multisite() ) {
|
315 |
+
$blog_id = get_current_blog_id();
|
316 |
+
wp_cache_clear_cache($blog_id);
|
317 |
+
} else {
|
318 |
+
wp_cache_clear_cache();
|
319 |
+
}
|
320 |
+
} elseif( has_action('cachify_flush_cache') ) {
|
321 |
+
do_action('cachify_flush_cache');
|
322 |
+
} elseif( function_exists('w3tc_pgcache_flush') ) {
|
323 |
+
w3tc_pgcache_flush();
|
324 |
+
} elseif( function_exists('wp_fast_cache_bulk_delete_all') ) {
|
325 |
+
wp_fast_cache_bulk_delete_all();
|
326 |
+
} elseif( class_exists('WpFastestCache') ) {
|
327 |
+
$wpfc = new WpFastestCache();
|
328 |
+
$wpfc->deleteCache();
|
329 |
+
} elseif( class_exists('c_ws_plugin__qcache_purging_routines') ) {
|
330 |
+
c_ws_plugin__qcache_purging_routines::purge_cache_dir(); // quick cache
|
331 |
+
} elseif( class_exists('zencache') ) {
|
332 |
+
zencache::clear();
|
333 |
+
} elseif( class_exists('comet_cache') ) {
|
334 |
+
comet_cache::clear();
|
335 |
+
} elseif( class_exists('WpeCommon') ) {
|
336 |
+
// WPEngine cache purge/flush methods to call by default
|
337 |
+
$wpe_methods = array(
|
338 |
+
'purge_varnish_cache',
|
339 |
+
);
|
340 |
+
|
341 |
+
// More agressive clear/flush/purge behind a filter
|
342 |
+
if( apply_filters('wbcr/factory/flush_wpengine_aggressive', false) ) {
|
343 |
+
$wpe_methods = array_merge($wpe_methods, array('purge_memcached', 'clear_maxcdn_cache'));
|
344 |
+
}
|
345 |
+
|
346 |
+
// Filtering the entire list of WpeCommon methods to be called (for advanced usage + easier testing)
|
347 |
+
$wpe_methods = apply_filters('wbcr/factory/wpengine_methods', $wpe_methods);
|
348 |
+
|
349 |
+
foreach($wpe_methods as $wpe_method) {
|
350 |
+
if( method_exists('WpeCommon', $wpe_method) ) {
|
351 |
+
WpeCommon::$wpe_method();
|
352 |
+
}
|
353 |
+
}
|
354 |
+
} elseif( function_exists('sg_cachepress_purge_cache') ) {
|
355 |
+
sg_cachepress_purge_cache();
|
356 |
+
} elseif( file_exists(WP_CONTENT_DIR . '/wp-cache-config.php') && function_exists('prune_super_cache') ) {
|
357 |
+
// fallback for WP-Super-Cache
|
358 |
+
global $cache_path;
|
359 |
+
if( is_multisite() ) {
|
360 |
+
$blog_id = get_current_blog_id();
|
361 |
+
prune_super_cache(get_supercache_dir($blog_id), true);
|
362 |
+
prune_super_cache($cache_path . 'blogs/', true);
|
363 |
+
} else {
|
364 |
+
prune_super_cache($cache_path . 'supercache/', true);
|
365 |
+
prune_super_cache($cache_path, true);
|
366 |
+
}
|
367 |
+
}
|
368 |
+
}
|
369 |
}
|
370 |
}
|
libs/factory/clearfy/includes/index.php
ADDED
File without changes
|
libs/factory/clearfy/index.php
ADDED
File without changes
|
libs/factory/clearfy/langs/index.php
ADDED
File without changes
|
libs/factory/clearfy/langs/wbcr_factory_clearfy_203-fr-FR.mo
DELETED
Binary file
|
libs/factory/clearfy/langs/wbcr_factory_clearfy_203-fr-FR.po
DELETED
@@ -1,129 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: clearfy\n"
|
4 |
-
"POT-Creation-Date: 2017-11-09 10:35+0300\n"
|
5 |
-
"PO-Revision-Date: 2017-11-09 13:50+0100\n"
|
6 |
-
"Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
|
7 |
-
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
-
"Language: fr\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 2.0.4\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
-
"X-Poedit-SearchPath-0: .\n"
|
19 |
-
|
20 |
-
#: pages/more-features.php:29
|
21 |
-
msgid "More features (<b>free</b>)"
|
22 |
-
msgstr "Plus de fonctionnalités (<b>gratuit</b>)"
|
23 |
-
|
24 |
-
#: pages/more-features.php:36
|
25 |
-
msgid "install the ultimate version of the plugin for free!"
|
26 |
-
msgstr "installez la version ultime du plugin gratuitement!"
|
27 |
-
|
28 |
-
#: pages/more-features.php:47
|
29 |
-
msgid "Code cleaning"
|
30 |
-
msgstr "Nettoyage du code"
|
31 |
-
|
32 |
-
#: pages/more-features.php:49
|
33 |
-
msgid "Clears the source code of the page from unused code."
|
34 |
-
msgstr "Efface le code source de la page du code inutilisé."
|
35 |
-
|
36 |
-
#: pages/more-features.php:56
|
37 |
-
msgid "Improve SEO"
|
38 |
-
msgstr "Améliorer le référencement"
|
39 |
-
|
40 |
-
#: pages/more-features.php:58
|
41 |
-
msgid ""
|
42 |
-
"Removes duplicate pages, closes external links, changes the headers of the "
|
43 |
-
"server."
|
44 |
-
msgstr ""
|
45 |
-
"Supprime les pages en double, ferme les liens externes, modifie les en-têtes "
|
46 |
-
"du serveur."
|
47 |
-
|
48 |
-
#: pages/more-features.php:65
|
49 |
-
msgid "Site ptotection"
|
50 |
-
msgstr "Protection du site"
|
51 |
-
|
52 |
-
#: pages/more-features.php:67
|
53 |
-
msgid "Enables and disables features that improve the protection of your site."
|
54 |
-
msgstr ""
|
55 |
-
"Active et désactive les fonctionnalités qui améliorent la protection de "
|
56 |
-
"votre site."
|
57 |
-
|
58 |
-
#: pages/more-features.php:74
|
59 |
-
msgid "Disable comments"
|
60 |
-
msgstr "Désactiver les commentaires"
|
61 |
-
|
62 |
-
#: pages/more-features.php:76
|
63 |
-
msgid "Disables comments on the entire site or on specific pages."
|
64 |
-
msgstr ""
|
65 |
-
"Désactive les commentaires sur l'intégralité du site ou sur des pages "
|
66 |
-
"spécifiques."
|
67 |
-
|
68 |
-
#: pages/more-features.php:83
|
69 |
-
msgid "Manage updates"
|
70 |
-
msgstr "Gérer les mises à jour"
|
71 |
-
|
72 |
-
#: pages/more-features.php:85
|
73 |
-
msgid ""
|
74 |
-
"Enables or disables automatically updates for plugins, themes and core. It "
|
75 |
-
"is also possible\n"
|
76 |
-
"\t\t\t\t\t\t\tto disable all updates."
|
77 |
-
msgstr ""
|
78 |
-
"Active ou désactive automatiquement les mises à jour pour les plugins, les "
|
79 |
-
"thèmes et le core. C'est aussi possible\n"
|
80 |
-
"\t\t\t\t\t\t\tdésactiver toutes les mises à jour."
|
81 |
-
|
82 |
-
#: pages/more-features.php:93
|
83 |
-
msgid "Manage widgets"
|
84 |
-
msgstr "Gérer les widgets"
|
85 |
-
|
86 |
-
#: pages/more-features.php:95
|
87 |
-
msgid "Allows you to remove unused widgets."
|
88 |
-
msgstr "Vous permet de supprimer les widgets inutilisés."
|
89 |
-
|
90 |
-
#: pages/more-features.php:102
|
91 |
-
msgid "Speed Optimization"
|
92 |
-
msgstr "Optimisation de la vitesse"
|
93 |
-
|
94 |
-
#: pages/more-features.php:104
|
95 |
-
msgid ""
|
96 |
-
"Increases performance by disabling unused functions and reducing the number "
|
97 |
-
"of requests."
|
98 |
-
msgstr ""
|
99 |
-
"Augmente les performances en désactivant les fonctions inutilisées et en "
|
100 |
-
"réduisant le nombre de requêtes."
|
101 |
-
|
102 |
-
#: pages/more-features.php:111
|
103 |
-
msgid "Site privacy"
|
104 |
-
msgstr "Confidentialité du site"
|
105 |
-
|
106 |
-
#: pages/more-features.php:113
|
107 |
-
msgid ""
|
108 |
-
"Allows you to hide the version of the site and plugins. Allows you to hide "
|
109 |
-
"your\n"
|
110 |
-
"\t\t\t\t\t\t\tWordPress."
|
111 |
-
msgstr ""
|
112 |
-
"Vous permet de masquer la version du site et des plugins. Vous permet de "
|
113 |
-
"cacher votre\n"
|
114 |
-
"\t\t\t\t\t\t\tWordPress."
|
115 |
-
|
116 |
-
#: pages/more-features.php:121
|
117 |
-
msgid "Easy setup"
|
118 |
-
msgstr "Configuration facile"
|
119 |
-
|
120 |
-
#: pages/more-features.php:123
|
121 |
-
msgid ""
|
122 |
-
"In quick mode, you can easily configure the plugin according to your needs."
|
123 |
-
msgstr ""
|
124 |
-
"En mode rapide, vous pouvez facilement configurer le plugin en fonction de "
|
125 |
-
"vos besoins."
|
126 |
-
|
127 |
-
#: pages/more-features.php:130
|
128 |
-
msgid "Get the ultimate plugin 100% FREE"
|
129 |
-
msgstr "Obtenez le plugin ultime 100% GRATUIT"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/langs/wbcr_factory_clearfy_203-ru_RU.mo
DELETED
Binary file
|
libs/factory/clearfy/langs/wbcr_factory_clearfy_203-ru_RU.po
DELETED
@@ -1,124 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: clearfy\n"
|
4 |
-
"POT-Creation-Date: 2017-10-14 13:50+0300\n"
|
5 |
-
"PO-Revision-Date: 2017-10-14 13:50+0300\n"
|
6 |
-
"Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
|
7 |
-
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
-
"Language: ru_RU\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 1.8.8\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
-
"X-Poedit-SearchPath-0: .\n"
|
19 |
-
|
20 |
-
#: pages/more-features.php:27
|
21 |
-
msgid "More features (<b>free</b>)"
|
22 |
-
msgstr "Дополнительно"
|
23 |
-
|
24 |
-
#: pages/more-features.php:34
|
25 |
-
msgid "install the ultimate version of the plugin for free!"
|
26 |
-
msgstr "установите полную версию плагина бесплатно!"
|
27 |
-
|
28 |
-
#: pages/more-features.php:45
|
29 |
-
msgid "Code cleaning"
|
30 |
-
msgstr "Очищает код"
|
31 |
-
|
32 |
-
#: pages/more-features.php:47
|
33 |
-
msgid "Clears the source code of the page from unused code."
|
34 |
-
msgstr "Очищает исходный код страницы от неиспользуемого кода."
|
35 |
-
|
36 |
-
#: pages/more-features.php:54
|
37 |
-
msgid "Improve SEO"
|
38 |
-
msgstr "Улучшает SEO"
|
39 |
-
|
40 |
-
#: pages/more-features.php:56
|
41 |
-
msgid ""
|
42 |
-
"Removes duplicate pages, closes external links, changes the headers of the "
|
43 |
-
"server."
|
44 |
-
msgstr ""
|
45 |
-
"Удаляет дубликаты страниц, закрывает внешние ссылки, изменяет заголовки "
|
46 |
-
"сервера."
|
47 |
-
|
48 |
-
#: pages/more-features.php:63
|
49 |
-
msgid "Site ptotection"
|
50 |
-
msgstr "Защищает ваш сайт"
|
51 |
-
|
52 |
-
#: pages/more-features.php:65
|
53 |
-
msgid "Enables and disables features that improve the protection of your site."
|
54 |
-
msgstr "Включает и отключает функции, которые улучшают защиту вашего сайта."
|
55 |
-
|
56 |
-
#: pages/more-features.php:72
|
57 |
-
msgid "Disable comments"
|
58 |
-
msgstr "Отключает комментарии"
|
59 |
-
|
60 |
-
#: pages/more-features.php:74
|
61 |
-
msgid "Disables comments on the entire site or on specific pages."
|
62 |
-
msgstr "Отключает комментарии на всем сайте или у определенных страниц."
|
63 |
-
|
64 |
-
#: pages/more-features.php:81
|
65 |
-
msgid "Manage updates"
|
66 |
-
msgstr "Менеджер обновлений"
|
67 |
-
|
68 |
-
#: pages/more-features.php:83
|
69 |
-
msgid ""
|
70 |
-
"Enables or disables automatically updates for plugins, themes and core. It "
|
71 |
-
"is also possible\n"
|
72 |
-
"\t\t\t\t\t\t\tto disable all updates."
|
73 |
-
msgstr ""
|
74 |
-
"Включает или отключает автоматические обновление плагинов, тем и ядра. Также "
|
75 |
-
"возможно\n"
|
76 |
-
"отключение всех обновлений."
|
77 |
-
|
78 |
-
#: pages/more-features.php:91
|
79 |
-
msgid "Manage widgets"
|
80 |
-
msgstr "Управление виджетами"
|
81 |
-
|
82 |
-
#: pages/more-features.php:93
|
83 |
-
msgid "Allows you to remove unused widgets."
|
84 |
-
msgstr "Позволяет удалить неиспользуемые виджеты."
|
85 |
-
|
86 |
-
#: pages/more-features.php:100
|
87 |
-
msgid "Speed Optimization"
|
88 |
-
msgstr "Оптимизация производительности"
|
89 |
-
|
90 |
-
#: pages/more-features.php:102
|
91 |
-
msgid ""
|
92 |
-
"Increases performance by disabling unused functions and reducing the number "
|
93 |
-
"of requests."
|
94 |
-
msgstr ""
|
95 |
-
"Повышает производительность, отключая неиспользуемые функции и уменьшая "
|
96 |
-
"количество запросов."
|
97 |
-
|
98 |
-
#: pages/more-features.php:109
|
99 |
-
msgid "Site privacy"
|
100 |
-
msgstr "Конфиденциальность сайта"
|
101 |
-
|
102 |
-
#: pages/more-features.php:111
|
103 |
-
msgid ""
|
104 |
-
"Allows you to hide the version of the site and plugins. Allows you to hide "
|
105 |
-
"your\n"
|
106 |
-
"\t\t\t\t\t\t\tWordPress."
|
107 |
-
msgstr ""
|
108 |
-
"Позволяет скрыть версию сайта и плагинов. Позволяет скрыть ваш\n"
|
109 |
-
"WordPress."
|
110 |
-
|
111 |
-
#: pages/more-features.php:119
|
112 |
-
msgid "Easy setup"
|
113 |
-
msgstr "Простая настройка"
|
114 |
-
|
115 |
-
#: pages/more-features.php:121
|
116 |
-
msgid ""
|
117 |
-
"In quick mode, you can easily configure the plugin according to your needs."
|
118 |
-
msgstr ""
|
119 |
-
"В быстром режиме вы можете легко настроить плагин в соответствии с вашими "
|
120 |
-
"потребностями."
|
121 |
-
|
122 |
-
#: pages/more-features.php:128
|
123 |
-
msgid "Get the ultimate plugin 100% FREE"
|
124 |
-
msgstr "Получить полную версию бесплатно на 100%"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/langs/wbcr_factory_clearfy_206-ru_RU.mo
ADDED
Binary file
|
libs/factory/clearfy/langs/wbcr_factory_clearfy_206-ru_RU.po
ADDED
@@ -0,0 +1,307 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: clearfy\n"
|
4 |
+
"POT-Creation-Date: 2018-10-16 22:37+0300\n"
|
5 |
+
"PO-Revision-Date: 2018-10-16 22:41+0300\n"
|
6 |
+
"Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
|
7 |
+
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
+
"Language: ru_RU\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 2.1.1\n"
|
13 |
+
"X-Poedit-Basepath: ..\n"
|
14 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
+
"X-Poedit-SearchPath-0: .\n"
|
19 |
+
|
20 |
+
#: includes/check-clearfy-compatibility.php:265
|
21 |
+
msgid "Clearfy warning"
|
22 |
+
msgstr "Clearfy предупреждение"
|
23 |
+
|
24 |
+
#: includes/check-clearfy-compatibility.php:266
|
25 |
+
#, php-format
|
26 |
+
msgid "The %s component"
|
27 |
+
msgstr "Работа компонента %s"
|
28 |
+
|
29 |
+
#: includes/check-clearfy-compatibility.php:268
|
30 |
+
msgid "warning"
|
31 |
+
msgstr "предупреждение"
|
32 |
+
|
33 |
+
#: includes/check-clearfy-compatibility.php:269
|
34 |
+
#, php-format
|
35 |
+
msgid "The %s plugin"
|
36 |
+
msgstr "Работа плагина %s"
|
37 |
+
|
38 |
+
#: includes/check-clearfy-compatibility.php:272
|
39 |
+
msgid "has stopped."
|
40 |
+
msgstr "была остановлена."
|
41 |
+
|
42 |
+
#: includes/check-clearfy-compatibility.php:273
|
43 |
+
msgid "Possible reasons:"
|
44 |
+
msgstr "Возможные причины:"
|
45 |
+
|
46 |
+
#: includes/check-clearfy-compatibility.php:279
|
47 |
+
#, php-format
|
48 |
+
msgid "You need to update the PHP version to %s or higher!"
|
49 |
+
msgstr "Вам нужно обновить версию PHP до %s или выше!"
|
50 |
+
|
51 |
+
#: includes/check-clearfy-compatibility.php:284
|
52 |
+
#, php-format
|
53 |
+
msgid "You need to update WordPress to %s or higher!"
|
54 |
+
msgstr "Вам нужно обновить WordPress до %s или выше!"
|
55 |
+
|
56 |
+
#: includes/check-clearfy-compatibility.php:289
|
57 |
+
#, php-format
|
58 |
+
msgid "You need to update the Clearfy plugin version to %s or higher!"
|
59 |
+
msgstr "Вам нужно обновить версию плагина Clearfy до %s или выше!"
|
60 |
+
|
61 |
+
#: includes/check-clearfy-compatibility.php:294
|
62 |
+
msgid "This plugin is already activated, you are trying to activate it again."
|
63 |
+
msgstr "Этот плагин уже активирован, вы пытаетесь активировать его снова."
|
64 |
+
|
65 |
+
#: includes/check-clearfy-compatibility.php:299
|
66 |
+
#, php-format
|
67 |
+
msgid ""
|
68 |
+
"Clearfy has the features of the %s plugin. Please, deactivate %s to avoid "
|
69 |
+
"conflicts of plugins!"
|
70 |
+
msgstr ""
|
71 |
+
"Плагин Clearfy уже включает в себя функции плагина %s. Пожалуйста, "
|
72 |
+
"деактивируйте плагин %s, чтобы не создавать конфликтов!"
|
73 |
+
|
74 |
+
#: pages/class.pages.php:212
|
75 |
+
msgid "Upgrade to Clearfy Business"
|
76 |
+
msgstr "Перейти на Clearfy Бизнес"
|
77 |
+
|
78 |
+
#: pages/class.pages.php:213
|
79 |
+
msgid "Oops... Sorry for the inconvenience caused!"
|
80 |
+
msgstr "Упс... Мы приносим свои извинения за неудобства!"
|
81 |
+
|
82 |
+
#: pages/class.pages.php:214
|
83 |
+
msgid ""
|
84 |
+
"Complete multisite support is available in Clearfy Business and Clearfy "
|
85 |
+
"Business Revolution packages only!"
|
86 |
+
msgstr ""
|
87 |
+
"Полная поддержка мультисайтов доступна только в пакете Clearfy Бизнес и "
|
88 |
+
"Clearfy Бизнес Революция!"
|
89 |
+
|
90 |
+
#: pages/class.pages.php:215
|
91 |
+
msgid ""
|
92 |
+
"You can activate the plugin on each website and use it with zero "
|
93 |
+
"limitations. But you can’t save the plugin’s settings under the Super "
|
94 |
+
"Administrator role!"
|
95 |
+
msgstr ""
|
96 |
+
"Вы можете активировать плагин отдельно для каждого сайта и использовать его "
|
97 |
+
"без ограничений, но в режиме суперадминистратора, вы не можете сохранять "
|
98 |
+
"настройки плагина!"
|
99 |
+
|
100 |
+
#: pages/class.pages.php:217
|
101 |
+
msgid "Activate license "
|
102 |
+
msgstr "Активировать лицензию "
|
103 |
+
|
104 |
+
#: pages/class.pages.php:218
|
105 |
+
#, php-format
|
106 |
+
msgid "Upgrade to Clearfy Business for $%d"
|
107 |
+
msgstr "Обновить до Clearfy Бизнес за $%d"
|
108 |
+
|
109 |
+
#: pages/class.pages.php:273
|
110 |
+
msgid "MORE IN CLEARFY <span>BUSINESS</span>"
|
111 |
+
msgstr "ЛУЧШЕЕ В CLEARFY <span>БИЗНЕС</span>"
|
112 |
+
|
113 |
+
#: pages/class.pages.php:275
|
114 |
+
msgid "4 premium components now;"
|
115 |
+
msgstr "4 премиум компонента сейчас;"
|
116 |
+
|
117 |
+
#: pages/class.pages.php:276
|
118 |
+
msgid "40 new premium components within a year for the single price;"
|
119 |
+
msgstr "40 новых премиум компонентов в год по одной цене;"
|
120 |
+
|
121 |
+
#: pages/class.pages.php:277
|
122 |
+
msgid "Multisite support;"
|
123 |
+
msgstr "Поддержка мультисайтов;"
|
124 |
+
|
125 |
+
#: pages/class.pages.php:278
|
126 |
+
msgid "Advanced settings;"
|
127 |
+
msgstr "Дополнительные настройки;"
|
128 |
+
|
129 |
+
#: pages/class.pages.php:279
|
130 |
+
msgid "No ads;"
|
131 |
+
msgstr "Нет рекламы;"
|
132 |
+
|
133 |
+
#: pages/class.pages.php:280
|
134 |
+
msgid "Perfect support."
|
135 |
+
msgstr "Лучшая поддержка."
|
136 |
+
|
137 |
+
#: pages/class.pages.php:283
|
138 |
+
#, php-format
|
139 |
+
msgid "Upgrade for $%s"
|
140 |
+
msgstr "Обновиться за $%s"
|
141 |
+
|
142 |
+
#: pages/class.pages.php:299
|
143 |
+
msgid ""
|
144 |
+
"A neutral setting that can not harm your site, but you must be sure that you "
|
145 |
+
"need to use it."
|
146 |
+
msgstr ""
|
147 |
+
"Нейтральная настройка, которая не может нанести вред вашему сайту, но вы "
|
148 |
+
"должны быть уверены, что вам нужно ее использовать."
|
149 |
+
|
150 |
+
#: pages/class.pages.php:305
|
151 |
+
msgid ""
|
152 |
+
"When set this option, you must be careful. Plugins and themes may depend on "
|
153 |
+
"this function. You must be sure that you can disable this feature for the "
|
154 |
+
"site."
|
155 |
+
msgstr ""
|
156 |
+
"При включении этой настройки, вы должны быть осторожны. Некоторые плагины и "
|
157 |
+
"темы могут зависеть от этой функции. Вы должны быть уверены, что эту функцию "
|
158 |
+
"можно отключить для сайта."
|
159 |
+
|
160 |
+
#: pages/class.pages.php:311
|
161 |
+
msgid "Absolutely safe setting, We recommend to use."
|
162 |
+
msgstr "Абсолютно безопасная настройка, рекомендуем использовать."
|
163 |
+
|
164 |
+
#: pages/class.pages.php:316
|
165 |
+
msgid "Hover to the icon to get help for the feature you selected."
|
166 |
+
msgstr ""
|
167 |
+
"Наведите указатель мыши на значок, чтобы получить справку по выбранной "
|
168 |
+
"функции."
|
169 |
+
|
170 |
+
#: pages/class.pages.php:334
|
171 |
+
msgid "Do you want the plugin to improved and update?"
|
172 |
+
msgstr "Вы хотите, чтобы плагин улучшался и обновлялся?"
|
173 |
+
|
174 |
+
#: pages/class.pages.php:337
|
175 |
+
msgid ""
|
176 |
+
"Help the author, leave a review on wordpress.org. Thanks to feedback, I will "
|
177 |
+
"know that the plugin is really useful to you and is needed."
|
178 |
+
msgstr ""
|
179 |
+
"Помогите автору, оставьте отзыв на wordpress.org. Благодаря отзывам, я буду "
|
180 |
+
"знать, что плагин действительно полезен для вас и необходим."
|
181 |
+
|
182 |
+
#: pages/class.pages.php:339
|
183 |
+
msgid "And also write your ideas on how to extend or improve the plugin."
|
184 |
+
msgstr "А также напишите свои идеи о том, как расширить или улучшить плагин."
|
185 |
+
|
186 |
+
#: pages/class.pages.php:344
|
187 |
+
msgid "Go rate us and push ideas"
|
188 |
+
msgstr "Оставить отзыв или поделиться идеей"
|
189 |
+
|
190 |
+
#: pages/class.pages.php:356
|
191 |
+
msgid "Donation for plugin development"
|
192 |
+
msgstr "Пожертвования на развитие плагина"
|
193 |
+
|
194 |
+
#: pages/more-features.php:31
|
195 |
+
msgid "More features (<b>free</b>)"
|
196 |
+
msgstr "Дополнительно"
|
197 |
+
|
198 |
+
#: pages/more-features.php:40
|
199 |
+
msgid "install the ultimate version of the plugin for free!"
|
200 |
+
msgstr "установите полную версию плагина бесплатно!"
|
201 |
+
|
202 |
+
#: pages/more-features.php:51
|
203 |
+
msgid "Code cleaning"
|
204 |
+
msgstr "Очищает код"
|
205 |
+
|
206 |
+
#: pages/more-features.php:53
|
207 |
+
msgid "Clears the source code of the page from unused code."
|
208 |
+
msgstr "Очищает исходный код страницы от неиспользуемого кода."
|
209 |
+
|
210 |
+
#: pages/more-features.php:60
|
211 |
+
msgid "Improve SEO"
|
212 |
+
msgstr "Улучшает SEO"
|
213 |
+
|
214 |
+
#: pages/more-features.php:62
|
215 |
+
msgid ""
|
216 |
+
"Removes duplicate pages, closes external links, changes the headers of the "
|
217 |
+
"server."
|
218 |
+
msgstr ""
|
219 |
+
"Удаляет дубликаты страниц, закрывает внешние ссылки, изменяет заголовки "
|
220 |
+
"сервера."
|
221 |
+
|
222 |
+
#: pages/more-features.php:69
|
223 |
+
msgid "Site protection"
|
224 |
+
msgstr "Защита сайта"
|
225 |
+
|
226 |
+
#: pages/more-features.php:71
|
227 |
+
msgid "Enables and disables features that improve the protection of your site."
|
228 |
+
msgstr "Включает и отключает функции, которые улучшают защиту вашего сайта."
|
229 |
+
|
230 |
+
#: pages/more-features.php:78
|
231 |
+
msgid "Disable comments"
|
232 |
+
msgstr "Отключает комментарии"
|
233 |
+
|
234 |
+
#: pages/more-features.php:80
|
235 |
+
msgid "Disables comments on the entire site or on specific pages."
|
236 |
+
msgstr "Отключает комментарии на всем сайте или у определенных страниц."
|
237 |
+
|
238 |
+
#: pages/more-features.php:87
|
239 |
+
msgid "Manage updates"
|
240 |
+
msgstr "Менеджер обновлений"
|
241 |
+
|
242 |
+
#: pages/more-features.php:89
|
243 |
+
msgid ""
|
244 |
+
"Enables or disables automatically updates for plugins, themes and core. It "
|
245 |
+
"is also possible\n"
|
246 |
+
"\t\t\t\t\t\t\tto disable all updates."
|
247 |
+
msgstr ""
|
248 |
+
"Включает или отключает автоматические обновление плагинов, тем и ядра. Также "
|
249 |
+
"возможно\n"
|
250 |
+
"отключение всех обновлений."
|
251 |
+
|
252 |
+
#: pages/more-features.php:97
|
253 |
+
msgid "Manage widgets"
|
254 |
+
msgstr "Управление виджетами"
|
255 |
+
|
256 |
+
#: pages/more-features.php:99
|
257 |
+
msgid "Allows you to remove unused widgets."
|
258 |
+
msgstr "Позволяет удалить неиспользуемые виджеты."
|
259 |
+
|
260 |
+
#: pages/more-features.php:106
|
261 |
+
msgid "Speed Optimization"
|
262 |
+
msgstr "Оптимизация производительности"
|
263 |
+
|
264 |
+
#: pages/more-features.php:108
|
265 |
+
msgid ""
|
266 |
+
"Increases performance by disabling unused functions and reducing the number "
|
267 |
+
"of requests."
|
268 |
+
msgstr ""
|
269 |
+
"Повышает производительность, отключая неиспользуемые функции и уменьшая "
|
270 |
+
"количество запросов."
|
271 |
+
|
272 |
+
#: pages/more-features.php:115
|
273 |
+
msgid "Site privacy"
|
274 |
+
msgstr "Конфиденциальность сайта"
|
275 |
+
|
276 |
+
#: pages/more-features.php:117
|
277 |
+
msgid ""
|
278 |
+
"Allows you to hide the version of the site and plugins. Allows you to hide "
|
279 |
+
"your\n"
|
280 |
+
"\t\t\t\t\t\t\tWordPress."
|
281 |
+
msgstr ""
|
282 |
+
"Позволяет скрыть версию сайта и плагинов. Позволяет скрыть ваш\n"
|
283 |
+
"WordPress."
|
284 |
+
|
285 |
+
#: pages/more-features.php:125
|
286 |
+
msgid "Easy setup"
|
287 |
+
msgstr "Простая настройка"
|
288 |
+
|
289 |
+
#: pages/more-features.php:127
|
290 |
+
msgid ""
|
291 |
+
"In quick mode, you can easily configure the plugin according to your needs."
|
292 |
+
msgstr ""
|
293 |
+
"В быстром режиме вы можете легко настроить плагин в соответствии с вашими "
|
294 |
+
"потребностями."
|
295 |
+
|
296 |
+
#: pages/more-features.php:142
|
297 |
+
msgid "Get the ultimate plugin 100% FREE"
|
298 |
+
msgstr "Получить полную версию бесплатно на 100%."
|
299 |
+
|
300 |
+
#~ msgid "component"
|
301 |
+
#~ msgstr "компонент"
|
302 |
+
|
303 |
+
#~ msgid "plugin"
|
304 |
+
#~ msgstr "плагин"
|
305 |
+
|
306 |
+
#~ msgid "Site ptotection"
|
307 |
+
#~ msgstr "Защищает ваш сайт"
|
libs/factory/clearfy/pages/class.pages.php
ADDED
@@ -0,0 +1,376 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Общий класс прослойка для страниц Clearfy и его компоннетов.
|
5 |
+
* В этом классе добавляются общие ресурсы и элементы, необходимые для всех связанных плагинов.
|
6 |
+
*
|
7 |
+
* Author: Webcraftic <wordpress.webraftic@gmail.com>
|
8 |
+
* Version: 1.1.0
|
9 |
+
* @since 2.0.5
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if( !defined('ABSPATH') ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Class Wbcr_FactoryPages410_ImpressiveThemplate
|
19 |
+
*
|
20 |
+
* @method string getInfoWidget() - get widget content information
|
21 |
+
* @method string getRatingWidget(array $args = array()) - get widget content rating
|
22 |
+
* @method string getDonateWidget() - get widget content donate
|
23 |
+
* @method string getBusinessSuggetionWidget()
|
24 |
+
*/
|
25 |
+
|
26 |
+
if( !class_exists('Wbcr_FactoryClearfy206_PageBase') && class_exists('Wbcr_FactoryPages410_ImpressiveThemplate') ) {
|
27 |
+
|
28 |
+
class Wbcr_FactoryClearfy206_PageBase extends Wbcr_FactoryPages410_ImpressiveThemplate {
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Показывать правый сайдбар?
|
32 |
+
* Сайдбар будет показан на внутренних страницах шаблона.
|
33 |
+
*
|
34 |
+
* @var bool
|
35 |
+
*/
|
36 |
+
public $show_right_sidebar_in_options = true;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Страница доступна в меню суперадмнистратора (режим мультисайтов)
|
40 |
+
*
|
41 |
+
* @var bool
|
42 |
+
*/
|
43 |
+
public $available_for_multisite = true;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Показывать нижний сайдбар?
|
47 |
+
* Сайдбар будет показан на внутренних страницах шаблона.
|
48 |
+
*
|
49 |
+
* @var bool
|
50 |
+
*/
|
51 |
+
//public $show_bottom_sidebar = false;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
55 |
+
*/
|
56 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
57 |
+
{
|
58 |
+
parent::__construct($plugin);
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* @param $name
|
63 |
+
* @param $arguments
|
64 |
+
* @return null|string
|
65 |
+
*/
|
66 |
+
public function __call($name, $arguments)
|
67 |
+
{
|
68 |
+
if( substr($name, 0, 3) == 'get' ) {
|
69 |
+
$called_method_name = 'show' . substr($name, 3);
|
70 |
+
if( method_exists($this, $called_method_name) ) {
|
71 |
+
ob_start();
|
72 |
+
|
73 |
+
$this->$called_method_name($arguments);
|
74 |
+
$content = ob_get_contents();
|
75 |
+
ob_end_clean();
|
76 |
+
|
77 |
+
return $content;
|
78 |
+
}
|
79 |
+
}
|
80 |
+
|
81 |
+
return null;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Requests assets (js and css) for the page.
|
86 |
+
*
|
87 |
+
* @see Wbcr_FactoryPages410_AdminPage
|
88 |
+
*
|
89 |
+
* @param Wbcr_Factory409_ScriptList $scripts
|
90 |
+
* @param Wbcr_Factory409_StyleList $styles
|
91 |
+
* @return void
|
92 |
+
*/
|
93 |
+
public function assets($scripts, $styles)
|
94 |
+
{
|
95 |
+
parent::assets($scripts, $styles);
|
96 |
+
|
97 |
+
$this->styles->add(FACTORY_CLEARFY_206_URL . '/assets/css/clearfy-base.css');
|
98 |
+
|
99 |
+
// todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
|
100 |
+
if( defined('WCL_PLUGIN_URL') ) {
|
101 |
+
$this->styles->add(WCL_PLUGIN_URL . '/admin/assets/css/general.css');
|
102 |
+
}
|
103 |
+
|
104 |
+
wbcr_factory_409_do_action_deprecated('wbcr_clearfy_page_enqueue_scripts', array(
|
105 |
+
$this->getResultId(),
|
106 |
+
$scripts,
|
107 |
+
$styles
|
108 |
+
), '1.4.0', 'wbcr/clearfy/page_assets');
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Allows you to enqueue scripts to the internal pages of the plugin.
|
112 |
+
* $this->getResultId() - page id + plugin name = quick_start-wbcr_clearfy
|
113 |
+
* @since 2.0.5
|
114 |
+
*/
|
115 |
+
do_action('wbcr/clearfy/page_assets', $this->getResultId(), $scripts, $styles);
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* @return Wbcr_Factory409_Request
|
120 |
+
*/
|
121 |
+
public function request()
|
122 |
+
{
|
123 |
+
return $this->plugin->request;
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* @since 2.0.5
|
128 |
+
* @param $option_name
|
129 |
+
* @param bool $default *
|
130 |
+
* @return mixed|void
|
131 |
+
*/
|
132 |
+
public function getPopulateOption($option_name, $default = false)
|
133 |
+
{
|
134 |
+
return $this->plugin->getPopulateOption($option_name, $default);
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* @param $option_name
|
139 |
+
* @param bool $default
|
140 |
+
* @return mixed|void
|
141 |
+
*/
|
142 |
+
public function getOption($option_name, $default = false)
|
143 |
+
{
|
144 |
+
return $this->plugin->getOption($option_name, $default);
|
145 |
+
}
|
146 |
+
|
147 |
+
/**
|
148 |
+
* @param $option_name
|
149 |
+
* @param $value
|
150 |
+
* @return void
|
151 |
+
*/
|
152 |
+
public function updatePopulateOption($option_name, $value)
|
153 |
+
{
|
154 |
+
$this->plugin->updatePopulateOption($option_name, $value);
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* @param $option_name
|
159 |
+
* @param $value
|
160 |
+
* @return void
|
161 |
+
*/
|
162 |
+
public function updateOption($option_name, $value)
|
163 |
+
{
|
164 |
+
$this->plugin->updateOption($option_name, $value);
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* @param $option_name
|
169 |
+
* @return void
|
170 |
+
*/
|
171 |
+
public function deletePopulateOption($option_name)
|
172 |
+
{
|
173 |
+
$this->plugin->deletePopulateOption($option_name);
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* @param $option_name
|
178 |
+
* @return void
|
179 |
+
*/
|
180 |
+
public function deleteOption($option_name)
|
181 |
+
{
|
182 |
+
$this->plugin->deleteOption($option_name);
|
183 |
+
}
|
184 |
+
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Действие выполняется для всех страниц Clearfy и его компонентах.
|
188 |
+
* Это простое предложение перейти на PRO версию.
|
189 |
+
*/
|
190 |
+
public function multisiteProAction()
|
191 |
+
{
|
192 |
+
if( is_multisite() && $this->plugin->isNetworkActive() ) {
|
193 |
+
|
194 |
+
$license_page_url = $this->getBaseUrl('license');
|
195 |
+
$upgrade_url = WbcrFactoryClearfy206_Helpers::getWebcrafticSitePageUrl($this->plugin->getPluginName(), 'pricing', 'multisite_save_settings');
|
196 |
+
$upgrade_price = WbcrFactoryClearfy206_Helpers::getClearfyBusinessPrice();
|
197 |
+
|
198 |
+
$html = '<div class="wbcr-factory-clearfy-206-multisite-suggetion">';
|
199 |
+
$html .= '<div class="wbcr-factory-inner-contanier">';
|
200 |
+
$html .= '<h3>' . __('Upgrade to Clearfy Business', 'wbcr_factory_clearfy_206') . '</h3>';
|
201 |
+
$html .= '<p>' . __('Oops... Sorry for the inconvenience caused!', 'wbcr_factory_clearfy_206') . '</p>';
|
202 |
+
$html .= '<p>' . __('Complete multisite support is available in Clearfy Business and Clearfy Business Revolution packages only!', 'wbcr_factory_clearfy_206') . '</p>';
|
203 |
+
$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_206') . '</p>';
|
204 |
+
$html .= '<p style="margin-top:20px">';
|
205 |
+
$html .= '<a href="' . $license_page_url . '" class="wbcr-factory-activate-premium" rel="noopener">' . __('Activate license ', 'wbcr_factory_clearfy_206') . '</a> ';
|
206 |
+
$html .= '<a href="' . $upgrade_url . '" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">' . sprintf(__('Upgrade to Clearfy Business for $%d', 'wbcr_factory_clearfy_206'), $upgrade_price) . '</a>';
|
207 |
+
$html .= '</p>';
|
208 |
+
$html .= '</div>';
|
209 |
+
$html .= '</div>';
|
210 |
+
|
211 |
+
$this->showPage($html);
|
212 |
+
|
213 |
+
return;
|
214 |
+
}
|
215 |
+
|
216 |
+
$this->redirectToAction('index');
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* @param string $position
|
221 |
+
* @return mixed|void
|
222 |
+
*/
|
223 |
+
protected function getPageWidgets($position = 'bottom')
|
224 |
+
{
|
225 |
+
$widgets = array();
|
226 |
+
|
227 |
+
if( $position == 'bottom' ) {
|
228 |
+
$widgets['info_widget'] = $this->getInfoWidget();
|
229 |
+
$widgets['rating_widget'] = $this->getRatingWidget();
|
230 |
+
$widgets['donate_widget'] = $this->getDonateWidget();
|
231 |
+
} else if( $position == 'right' ) {
|
232 |
+
$widgets['businnes_suggetion'] = $this->getBusinessSuggetionWidget();
|
233 |
+
$widgets['info_widget'] = $this->getInfoWidget();
|
234 |
+
$widgets['rating_widget'] = $this->getRatingWidget();
|
235 |
+
}
|
236 |
+
|
237 |
+
/**
|
238 |
+
* @since 4.0.9 - является устаревшим
|
239 |
+
*/
|
240 |
+
$widgets = wbcr_factory_409_apply_filters_deprecated('wbcr_factory_pages_410_imppage_get_widgets', array(
|
241 |
+
$widgets,
|
242 |
+
$position,
|
243 |
+
$this->plugin,
|
244 |
+
$this
|
245 |
+
), '4.0.9', 'wbcr/factory/pages/impressive/widgets');
|
246 |
+
|
247 |
+
/**
|
248 |
+
* @since 4.0.1 - добавлен
|
249 |
+
* @since 4.0.9 - изменено имя
|
250 |
+
*/
|
251 |
+
$widgets = apply_filters('wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this);
|
252 |
+
|
253 |
+
return $widgets;
|
254 |
+
}
|
255 |
+
|
256 |
+
public function showBusinessSuggetionWidget()
|
257 |
+
{
|
258 |
+
$upgrade_price = WbcrFactoryClearfy206_Helpers::getClearfyBusinessPrice();
|
259 |
+
|
260 |
+
$features = array(
|
261 |
+
'4_premium' => __('4 premium components now;', 'wbcr_factory_clearfy_206'),
|
262 |
+
'40_premium' => __('40 new premium components within a year for the single price;', 'wbcr_factory_clearfy_206'),
|
263 |
+
'multisite_support' => __('Multisite support;', 'wbcr_factory_clearfy_206'),
|
264 |
+
'advance_settings' => __('Advanced settings;', 'wbcr_factory_clearfy_206'),
|
265 |
+
'no_ads' => __('No ads;', 'wbcr_factory_clearfy_206'),
|
266 |
+
'perfect_support' => __('Perfect support.', 'wbcr_factory_clearfy_206')
|
267 |
+
);
|
268 |
+
|
269 |
+
/**
|
270 |
+
* @since 2.0.6
|
271 |
+
*/
|
272 |
+
$features = apply_filters('wbcr/clearfy/page_bussines_suggetion_features', $features, $this->plugin->getPluginName(), $this->id);
|
273 |
+
|
274 |
+
?>
|
275 |
+
<div class="wbcr-factory-sidebar-widget wbcr-factory-clearfy-206-pro-suggettion">
|
276 |
+
<h3><?php _e('MORE IN CLEARFY <span>BUSINESS</span>', 'wbcr_factory_clearfy_206')?></h3>
|
277 |
+
<ul>
|
278 |
+
<?php if( !empty($features) ): ?>
|
279 |
+
<?php foreach($features as $feature): ?>
|
280 |
+
<li><?= $feature ?></li>
|
281 |
+
<?php endforeach; ?>
|
282 |
+
<?php endif; ?>
|
283 |
+
</ul>
|
284 |
+
<a href="<?= WbcrFactoryClearfy206_Helpers::getWebcrafticSitePageUrl($this->plugin->getPluginName(), 'pricing', 'right_sidebar_ads') ?>" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">
|
285 |
+
<?php printf(__('Upgrade for $%s', 'wbcr_factory_clearfy_206'), $upgrade_price) ?>
|
286 |
+
</a>
|
287 |
+
</div>
|
288 |
+
<?php
|
289 |
+
}
|
290 |
+
|
291 |
+
public function showInfoWidget()
|
292 |
+
{
|
293 |
+
?>
|
294 |
+
<div class="wbcr-factory-sidebar-widget">
|
295 |
+
<ul>
|
296 |
+
<li>
|
297 |
+
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
|
298 |
+
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
299 |
+
</span>
|
300 |
+
- <?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_206'); ?>
|
301 |
+
</li>
|
302 |
+
<li>
|
303 |
+
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
|
304 |
+
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
305 |
+
</span>
|
306 |
+
- <?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_206'); ?>
|
307 |
+
</li>
|
308 |
+
<li>
|
309 |
+
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
|
310 |
+
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
311 |
+
</span>
|
312 |
+
- <?php _e('Absolutely safe setting, We recommend to use.', 'wbcr_factory_clearfy_206'); ?>
|
313 |
+
</li>
|
314 |
+
</ul>
|
315 |
+
----------<br>
|
316 |
+
|
317 |
+
<p><?php _e('Hover to the icon to get help for the feature you selected.', 'wbcr_factory_clearfy_206'); ?></p>
|
318 |
+
</div>
|
319 |
+
<?php
|
320 |
+
}
|
321 |
+
|
322 |
+
public function showRatingWidget(array $args)
|
323 |
+
{
|
324 |
+
if( !isset($args[0]) || empty($args[0]) ) {
|
325 |
+
$page_url = "https://goo.gl/tETE2X";
|
326 |
+
} else {
|
327 |
+
$page_url = $args[0];
|
328 |
+
}
|
329 |
+
|
330 |
+
$page_url = apply_filters('wbcr_factory_pages_410_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId());
|
331 |
+
|
332 |
+
?>
|
333 |
+
<div class="wbcr-factory-sidebar-widget">
|
334 |
+
<p>
|
335 |
+
<strong><?php _e('Do you want the plugin to improved and update?', 'wbcr_factory_clearfy_206'); ?></strong>
|
336 |
+
</p>
|
337 |
+
|
338 |
+
<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_206'); ?></p>
|
339 |
+
|
340 |
+
<p><?php _e('And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_clearfy_206'); ?></p>
|
341 |
+
|
342 |
+
<p>
|
343 |
+
<i class="wbcr-factory-icon-5stars"></i>
|
344 |
+
<a href="<?= $page_url ?>" title="Go rate us" target="_blank">
|
345 |
+
<strong><?php _e('Go rate us and push ideas', 'wbcr_factory_clearfy_206'); ?></strong>
|
346 |
+
</a>
|
347 |
+
</p>
|
348 |
+
</div>
|
349 |
+
<?php
|
350 |
+
}
|
351 |
+
|
352 |
+
public function showDonateWidget()
|
353 |
+
{
|
354 |
+
?>
|
355 |
+
<div class="wbcr-factory-sidebar-widget">
|
356 |
+
<p>
|
357 |
+
<strong><?php _e('Donation for plugin development', 'wbcr_factory_clearfy_206'); ?></strong>
|
358 |
+
</p>
|
359 |
+
|
360 |
+
<?php if( get_locale() !== 'ru_RU' ): ?>
|
361 |
+
<form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
|
362 |
+
<input type="hidden" name="cmd" value="_s-xclick">
|
363 |
+
<input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
|
364 |
+
|
365 |
+
<div class="wbcr-factory-donation-price">5$</div>
|
366 |
+
<input type="image" src="<?= FACTORY_PAGES_410_URL ?>/templates/assets/img/paypal-donate.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
|
367 |
+
</form>
|
368 |
+
<?php else: ?>
|
369 |
+
<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>
|
370 |
+
<?php endif; ?>
|
371 |
+
</div>
|
372 |
+
<?php
|
373 |
+
}
|
374 |
+
}
|
375 |
+
}
|
376 |
+
|
libs/factory/clearfy/pages/index.php
ADDED
File without changes
|
libs/factory/clearfy/pages/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 __('
|
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_FactoryClearfy206_MoreFeaturesPage') && class_exists('Wbcr_FactoryPages410_ImpressiveThemplate') ) {
|
18 |
|
19 |
+
class Wbcr_FactoryClearfy206_MoreFeaturesPage extends Wbcr_FactoryPages410_ImpressiveThemplate {
|
20 |
|
21 |
public $id = "more_features";
|
22 |
|
26 |
|
27 |
public $type = 'page';
|
28 |
|
29 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
30 |
{
|
31 |
+
$this->menu_title = __('More features (<b>free</b>)', 'wbcr_factory_clearfy_206');
|
32 |
|
33 |
parent::__construct($plugin);
|
34 |
|
37 |
|
38 |
public function getPageTitle()
|
39 |
{
|
40 |
+
return __('More features', 'wbcr_factory_clearfy_206');
|
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_206')?></h3>
|
52 |
|
53 |
+
<p><?php _e('Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_206')?></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_206')?></h3>
|
61 |
|
62 |
+
<p><?php _e('Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_206')?></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_206')?></h3>
|
70 |
|
71 |
+
<p><?php _e('Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_206')?></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_206')?></h3>
|
79 |
|
80 |
+
<p><?php _e('Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_206')?></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_206')?></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_206')?></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_206')?></h3>
|
98 |
|
99 |
+
<p><?php _e('Allows you to remove unused widgets.', 'wbcr_factory_clearfy_206')?></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_206')?></h3>
|
107 |
|
108 |
+
<p><?php _e('Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_206')?></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_206')?></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_206')?></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_206')?></h3>
|
126 |
|
127 |
+
<p><?php _e('In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_206')?></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_206')?>
|
143 |
</a>
|
144 |
</div>
|
145 |
<?php
|
libs/factory/core/boot.php
CHANGED
@@ -14,27 +14,29 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( defined('
|
18 |
return;
|
19 |
}
|
20 |
-
define('
|
21 |
|
22 |
-
define('
|
23 |
|
24 |
-
define('
|
25 |
-
define('
|
|
|
|
|
26 |
|
27 |
#comp merge
|
28 |
-
require_once(
|
29 |
-
require_once(
|
30 |
-
require_once(
|
31 |
|
32 |
-
require_once(
|
33 |
-
require_once(
|
34 |
-
require_once(
|
35 |
|
36 |
-
require_once(
|
37 |
|
38 |
-
require_once(
|
39 |
-
require_once(
|
40 |
#endcomp
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( defined('FACTORY_409_LOADED') ) {
|
18 |
return;
|
19 |
}
|
20 |
+
define('FACTORY_409_LOADED', true);
|
21 |
|
22 |
+
define('FACTORY_409_VERSION', '4.0.9');
|
23 |
|
24 |
+
define('FACTORY_409_DIR', dirname(__FILE__));
|
25 |
+
define('FACTORY_409_URL', plugins_url(null, __FILE__));
|
26 |
+
|
27 |
+
load_plugin_textdomain('wbcr_factory_409', false, dirname(plugin_basename(__FILE__)) . '/langs');
|
28 |
|
29 |
#comp merge
|
30 |
+
require_once(FACTORY_409_DIR . '/includes/functions.php');
|
31 |
+
require_once(FACTORY_409_DIR . '/includes/request.class.php');
|
32 |
+
require_once(FACTORY_409_DIR . '/includes/base.class.php');
|
33 |
|
34 |
+
require_once(FACTORY_409_DIR . '/includes/assets-managment/assets-list.class.php');
|
35 |
+
require_once(FACTORY_409_DIR . '/includes/assets-managment/script-list.class.php');
|
36 |
+
require_once(FACTORY_409_DIR . '/includes/assets-managment/style-list.class.php');
|
37 |
|
38 |
+
require_once(FACTORY_409_DIR . '/includes/plugin.class.php');
|
39 |
|
40 |
+
require_once(FACTORY_409_DIR . '/includes/activation/activator.class.php');
|
41 |
+
require_once(FACTORY_409_DIR . '/includes/activation/update.class.php');
|
42 |
#endcomp
|
libs/factory/core/includes/activation/activator.class.php
CHANGED
@@ -13,23 +13,24 @@
|
|
13 |
exit;
|
14 |
}
|
15 |
|
16 |
-
if( !class_exists('
|
17 |
/**
|
18 |
* Plugin Activator
|
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 |
{
|
32 |
$this->plugin = $plugin;
|
|
|
33 |
}
|
34 |
|
35 |
public function activate()
|
@@ -43,145 +44,5 @@
|
|
43 |
public function update()
|
44 |
{
|
45 |
}
|
46 |
-
|
47 |
-
// --------------------------------------------------------------------------------
|
48 |
-
// Posts and pages
|
49 |
-
// --------------------------------------------------------------------------------
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Adds post on activation.
|
53 |
-
* @return array Post info.
|
54 |
-
*/
|
55 |
-
public function addPost()
|
56 |
-
{
|
57 |
-
|
58 |
-
$args_count = func_num_args();
|
59 |
-
|
60 |
-
$post_info_base = array();
|
61 |
-
$meta_info_base = array();
|
62 |
-
|
63 |
-
if( $args_count == 4 ) {
|
64 |
-
|
65 |
-
$base = func_get_arg(0);
|
66 |
-
|
67 |
-
$post_info_base = $base['post'];
|
68 |
-
$meta_info_base = $base['meta'];
|
69 |
-
}
|
70 |
-
|
71 |
-
$option_name = ($args_count == 4)
|
72 |
-
? func_get_arg(1)
|
73 |
-
: func_get_arg(0);
|
74 |
-
$post_info = ($args_count == 4)
|
75 |
-
? func_get_arg(2)
|
76 |
-
: func_get_arg(1);
|
77 |
-
$meta_info = ($args_count == 4)
|
78 |
-
? func_get_arg(3)
|
79 |
-
: func_get_arg(2);
|
80 |
-
|
81 |
-
if( $post_info == null ) {
|
82 |
-
$post_info = array();
|
83 |
-
}
|
84 |
-
if( $meta_info == null ) {
|
85 |
-
$meta_info = array();
|
86 |
-
}
|
87 |
-
|
88 |
-
$post_info = array_merge($post_info_base, $post_info);
|
89 |
-
$meta_info = array_merge($meta_info_base, $meta_info);
|
90 |
-
|
91 |
-
$insert_id = $this->createPost($post_info, $meta_info, $option_name);
|
92 |
-
|
93 |
-
return array(
|
94 |
-
'post_id' => $insert_id,
|
95 |
-
'post' => $post_info,
|
96 |
-
'meta' => $meta_info
|
97 |
-
);
|
98 |
-
}
|
99 |
-
|
100 |
-
/**
|
101 |
-
* * Adds a page on activation.
|
102 |
-
*
|
103 |
-
* @return int|null|string|WP_Error
|
104 |
-
*/
|
105 |
-
public function addPage()
|
106 |
-
{
|
107 |
-
$option_name = func_get_arg(0);
|
108 |
-
$post_info = func_get_arg(1);
|
109 |
-
$meta_info = func_get_arg(2);
|
110 |
-
|
111 |
-
if( $post_info == null ) {
|
112 |
-
$post_info = array();
|
113 |
-
}
|
114 |
-
if( $meta_info == null ) {
|
115 |
-
$meta_info = array();
|
116 |
-
}
|
117 |
-
|
118 |
-
$post_info['post_type'] = 'page';
|
119 |
-
|
120 |
-
return $this->createPost($post_info, $meta_info, $option_name);
|
121 |
-
}
|
122 |
-
|
123 |
-
/**
|
124 |
-
* Creates post by using the specified info.
|
125 |
-
*
|
126 |
-
* @param array $post_info
|
127 |
-
* @param array $meta_info
|
128 |
-
* @param string $option_name
|
129 |
-
* @return int|null|string|WP_Error
|
130 |
-
*/
|
131 |
-
public function createPost($post_info, $meta_info, $option_name)
|
132 |
-
{
|
133 |
-
global $wpdb;
|
134 |
-
|
135 |
-
$slug = $post_info['post_name'];
|
136 |
-
$post_type = $post_info['post_type'];
|
137 |
-
|
138 |
-
$postId = $wpdb->get_var($wpdb->prepare("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '%s' AND
|
139 |
-
post_type = '%s' LIMIT 1", $slug, $post_type));
|
140 |
-
|
141 |
-
$option_value = $this->plugin->getOption($option_name);
|
142 |
-
|
143 |
-
if( !$postId ) {
|
144 |
-
$create = true;
|
145 |
-
|
146 |
-
if( !empty($option_value) ) {
|
147 |
-
$post_id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM " . $wpdb->posts . " WHERE ID = '%d' AND
|
148 |
-
post_type = '%s' LIMIT 1", $option_value, $post_type));
|
149 |
-
if( $post_id ) {
|
150 |
-
$create = false;
|
151 |
-
}
|
152 |
-
};
|
153 |
-
|
154 |
-
if( $create ) :
|
155 |
-
if( !isset($post_info['post_status']) ) {
|
156 |
-
$post_info['post_status'] = 'publish';
|
157 |
-
}
|
158 |
-
|
159 |
-
// '@' here is to hide unexpected output while plugin activation
|
160 |
-
$option_value = @wp_insert_post($post_info);
|
161 |
-
$postId = $option_value;
|
162 |
-
$this->plugin->updateOption($option_name, $option_value);
|
163 |
-
endif;
|
164 |
-
} else {
|
165 |
-
if( empty ($option_value) ) {
|
166 |
-
$this->plugin->updateOption($option_name, $postId);
|
167 |
-
}
|
168 |
-
}
|
169 |
-
|
170 |
-
$this->plugin->updateOption($option_name, $postId);
|
171 |
-
|
172 |
-
// adds meta
|
173 |
-
foreach($meta_info as $key => $value) {
|
174 |
-
if( $value === true ) {
|
175 |
-
$value = 'true';
|
176 |
-
}
|
177 |
-
if( $value === false ) {
|
178 |
-
$value = 'false';
|
179 |
-
}
|
180 |
-
|
181 |
-
add_post_meta($postId, $key, $value);
|
182 |
-
}
|
183 |
-
|
184 |
-
return $postId;
|
185 |
-
}
|
186 |
}
|
187 |
}
|
13 |
exit;
|
14 |
}
|
15 |
|
16 |
+
if( !class_exists('Wbcr_Factory409_Activator') ) {
|
17 |
/**
|
18 |
* Plugin Activator
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
+
abstract class Wbcr_Factory409_Activator {
|
23 |
|
24 |
/**
|
25 |
* Curent plugin.
|
26 |
+
* @var Wbcr_Factory409_Plugin
|
27 |
*/
|
28 |
public $plugin;
|
29 |
|
30 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
31 |
{
|
32 |
$this->plugin = $plugin;
|
33 |
+
|
34 |
}
|
35 |
|
36 |
public function activate()
|
44 |
public function update()
|
45 |
{
|
46 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
}
|
48 |
}
|
libs/factory/core/includes/activation/index.php
ADDED
File without changes
|
libs/factory/core/includes/activation/update.class.php
CHANGED
@@ -14,21 +14,21 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( !class_exists('
|
18 |
/**
|
19 |
* Plugin Activator
|
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 |
{
|
33 |
$this->plugin = $plugin;
|
34 |
}
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_Factory409_Update') ) {
|
18 |
/**
|
19 |
* Plugin Activator
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
abstract class Wbcr_Factory409_Update {
|
24 |
|
25 |
/**
|
26 |
* Current plugin
|
27 |
+
* @var Wbcr_Factory409_Plugin
|
28 |
*/
|
29 |
var $plugin;
|
30 |
|
31 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
32 |
{
|
33 |
$this->plugin = $plugin;
|
34 |
}
|
libs/factory/core/includes/assets-managment/assets-list.class.php
CHANGED
@@ -13,13 +13,13 @@
|
|
13 |
if( !defined('ABSPATH') ) {
|
14 |
exit;
|
15 |
}
|
16 |
-
if( !class_exists('
|
17 |
/**
|
18 |
* Assets List
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
-
class
|
23 |
|
24 |
protected $all = array();
|
25 |
public $header_place = array();
|
@@ -29,15 +29,15 @@
|
|
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 |
{
|
42 |
$this->plugin = $plugin;
|
43 |
|
@@ -49,20 +49,6 @@
|
|
49 |
}
|
50 |
}
|
51 |
|
52 |
-
/**
|
53 |
-
* Adds new items to the collection (default place).
|
54 |
-
* @param mixed
|
55 |
-
*/
|
56 |
-
public function add()
|
57 |
-
{
|
58 |
-
foreach(func_get_args() as $item) {
|
59 |
-
$this->all[] = $item;
|
60 |
-
$this->default_place[] = $item;
|
61 |
-
}
|
62 |
-
|
63 |
-
return $this;
|
64 |
-
}
|
65 |
-
|
66 |
/**
|
67 |
* Remove items from the collection
|
68 |
* @return $this
|
@@ -97,36 +83,6 @@
|
|
97 |
return $this;
|
98 |
}
|
99 |
|
100 |
-
/**
|
101 |
-
* Adds new items to the collection (header).
|
102 |
-
* @param mixed
|
103 |
-
*/
|
104 |
-
public function addToHeader()
|
105 |
-
{
|
106 |
-
|
107 |
-
foreach(func_get_args() as $item) {
|
108 |
-
$this->all[] = $item;
|
109 |
-
$this->header_place[] = $item;
|
110 |
-
}
|
111 |
-
|
112 |
-
return $this;
|
113 |
-
}
|
114 |
-
|
115 |
-
/**
|
116 |
-
* Adds new items to the collection (footer).
|
117 |
-
* @param mixed
|
118 |
-
*/
|
119 |
-
public function addToFooter()
|
120 |
-
{
|
121 |
-
|
122 |
-
foreach(func_get_args() as $item) {
|
123 |
-
$this->all[] = $item;
|
124 |
-
$this->footer_place[] = $item;
|
125 |
-
}
|
126 |
-
|
127 |
-
return $this;
|
128 |
-
}
|
129 |
-
|
130 |
/**
|
131 |
* Checks whether the collection is empty.
|
132 |
*
|
13 |
if( !defined('ABSPATH') ) {
|
14 |
exit;
|
15 |
}
|
16 |
+
if( !class_exists('Wbcr_Factory409_AssetsList') ) {
|
17 |
/**
|
18 |
* Assets List
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
+
class Wbcr_Factory409_AssetsList {
|
23 |
|
24 |
protected $all = array();
|
25 |
public $header_place = array();
|
29 |
protected $default_place;
|
30 |
|
31 |
/**
|
32 |
+
* @var Wbcr_Factory409_Plugin
|
33 |
*/
|
34 |
protected $plugin;
|
35 |
|
36 |
/**
|
37 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
38 |
* @param bool $defaultIsFooter
|
39 |
*/
|
40 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin, $defaultIsFooter = true)
|
41 |
{
|
42 |
$this->plugin = $plugin;
|
43 |
|
49 |
}
|
50 |
}
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
/**
|
53 |
* Remove items from the collection
|
54 |
* @return $this
|
83 |
return $this;
|
84 |
}
|
85 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
/**
|
87 |
* Checks whether the collection is empty.
|
88 |
*
|
libs/factory/core/includes/assets-managment/index.php
ADDED
File without changes
|
libs/factory/core/includes/assets-managment/script-list.class.php
CHANGED
@@ -14,19 +14,75 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( !class_exists('
|
18 |
|
19 |
/**
|
20 |
* Script List
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
class
|
25 |
|
26 |
public $localize_data = array();
|
27 |
public $use_ajax = false;
|
28 |
|
29 |
/**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
* @param string $source
|
31 |
*/
|
32 |
public function connect($source = 'wordpress')
|
@@ -51,21 +107,28 @@
|
|
51 |
$is_footer = false;
|
52 |
|
53 |
// register all other scripts
|
54 |
-
foreach(array($this->header_place, $this->footer_place) as $
|
55 |
-
foreach($
|
|
|
|
|
|
|
|
|
56 |
|
57 |
-
|
|
|
|
|
|
|
|
|
58 |
|
59 |
if( $is_first_script && $this->use_ajax ) {
|
60 |
-
wp_localize_script($
|
61 |
}
|
62 |
|
63 |
-
if( !empty($this->localize_data[$
|
64 |
-
|
65 |
-
wp_localize_script($script, $this->localize_data[$script][0], $this->localize_data[$script][1]);
|
66 |
}
|
67 |
|
68 |
-
wp_enqueue_script($
|
69 |
|
70 |
$is_first_script = false;
|
71 |
}
|
@@ -74,19 +137,28 @@
|
|
74 |
}
|
75 |
}
|
76 |
|
|
|
|
|
|
|
|
|
77 |
public function useAjax()
|
78 |
{
|
79 |
$this->use_ajax = true;
|
80 |
}
|
81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
public function localize($varname, $data)
|
83 |
{
|
84 |
-
$bindTo = count($this->all) == 0
|
85 |
-
? null
|
86 |
-
: end($this->all);
|
87 |
|
88 |
if( !$bindTo ) {
|
89 |
-
return;
|
90 |
}
|
91 |
|
92 |
$this->localize_data[$bindTo] = array($varname, $data);
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_Factory409_ScriptList') ) {
|
18 |
|
19 |
/**
|
20 |
* Script List
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
class Wbcr_Factory409_ScriptList extends Wbcr_Factory409_AssetsList {
|
25 |
|
26 |
public $localize_data = array();
|
27 |
public $use_ajax = false;
|
28 |
|
29 |
/**
|
30 |
+
* Adds new items to the collection (default place).
|
31 |
+
*
|
32 |
+
* @param mixed
|
33 |
+
* @version 2.0
|
34 |
+
*/
|
35 |
+
public function add($file_url, $deps = array('jquery'), $handle = null, $version = false, $place = 'default')
|
36 |
+
{
|
37 |
+
|
38 |
+
if( empty($file_url) ) {
|
39 |
+
return $this;
|
40 |
+
}
|
41 |
+
|
42 |
+
$resource = array();
|
43 |
+
$resource['file_url'] = $file_url;
|
44 |
+
$resource['deps'] = $deps;
|
45 |
+
$resource['handle'] = $handle;
|
46 |
+
$resource['version'] = $version;
|
47 |
+
|
48 |
+
$this->all[] = $resource;
|
49 |
+
|
50 |
+
switch( $place ) {
|
51 |
+
case 'header':
|
52 |
+
$this->header_place[] = $resource;
|
53 |
+
break;
|
54 |
+
case 'footer':
|
55 |
+
$this->footer_place[] = $resource;
|
56 |
+
break;
|
57 |
+
default:
|
58 |
+
$this->default_place[] = $resource;
|
59 |
+
break;
|
60 |
+
}
|
61 |
+
|
62 |
+
return $this;
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Adds new items to the collection (header).
|
67 |
+
* @param mixed
|
68 |
+
*/
|
69 |
+
public function addToHeader($file_url, $deps = array('jquery'), $handle = null)
|
70 |
+
{
|
71 |
+
return $this->add($file_url, $deps, $handle, 'header');
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Adds new items to the collection (footer).
|
76 |
+
* @param mixed
|
77 |
+
*/
|
78 |
+
public function addToFooter($file_url, $deps = array('jquery'), $handle = null)
|
79 |
+
{
|
80 |
+
return $this->add($file_url, $deps, $handle, 'footer');
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Осуществляет подключение всех зарегистрированных скриптов
|
85 |
+
*
|
86 |
* @param string $source
|
87 |
*/
|
88 |
public function connect($source = 'wordpress')
|
107 |
$is_footer = false;
|
108 |
|
109 |
// register all other scripts
|
110 |
+
foreach(array($this->header_place, $this->footer_place) as $script_place) {
|
111 |
+
foreach($script_place as $script) {
|
112 |
+
|
113 |
+
if( empty($script['file_url']) ) {
|
114 |
+
continue;
|
115 |
+
}
|
116 |
|
117 |
+
$handle = !empty($script['handle']) ? $script['handle'] : $script['file_url'];
|
118 |
+
$deps = !is_array($script['deps']) ? array() : $script['deps'];
|
119 |
+
$version = !empty($script['version']) ? $script['version'] : $this->plugin->getPluginVersion();
|
120 |
+
|
121 |
+
wp_register_script($handle, $script['file_url'], $deps, $version, $is_footer);
|
122 |
|
123 |
if( $is_first_script && $this->use_ajax ) {
|
124 |
+
wp_localize_script($handle, 'factory', array('ajaxurl' => admin_url('admin-ajax.php')));
|
125 |
}
|
126 |
|
127 |
+
if( !empty($this->localize_data[$handle]) ) {
|
128 |
+
wp_localize_script($handle, $this->localize_data[$handle][0], $this->localize_data[$handle][1]);
|
|
|
129 |
}
|
130 |
|
131 |
+
wp_enqueue_script($handle);
|
132 |
|
133 |
$is_first_script = false;
|
134 |
}
|
137 |
}
|
138 |
}
|
139 |
|
140 |
+
/**
|
141 |
+
* Если вызвать этот метод, на странице будет обязательно добавлена
|
142 |
+
* глобальная JS переменная с ссылкой на ajax обработчик
|
143 |
+
*/
|
144 |
public function useAjax()
|
145 |
{
|
146 |
$this->use_ajax = true;
|
147 |
}
|
148 |
|
149 |
+
/**
|
150 |
+
* Регистрирует глобальную JS переменную с пользовательскими данными
|
151 |
+
*
|
152 |
+
* @param string $varname
|
153 |
+
* @param string $data
|
154 |
+
* @return Wbcr_Factory409_ScriptList $this
|
155 |
+
*/
|
156 |
public function localize($varname, $data)
|
157 |
{
|
158 |
+
$bindTo = count($this->all) == 0 ? null : end($this->all);
|
|
|
|
|
159 |
|
160 |
if( !$bindTo ) {
|
161 |
+
return $this;
|
162 |
}
|
163 |
|
164 |
$this->localize_data[$bindTo] = array($varname, $data);
|
libs/factory/core/includes/assets-managment/style-list.class.php
CHANGED
@@ -14,18 +14,42 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( !class_exists('
|
18 |
|
19 |
/**
|
20 |
* Style List
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
-
class
|
25 |
|
26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
{
|
28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
// register all global required scripts
|
30 |
if( !empty($this->required[$source]) ) {
|
31 |
|
@@ -42,9 +66,22 @@
|
|
42 |
return;
|
43 |
}
|
44 |
|
|
|
|
|
|
|
|
|
45 |
// register all other styles
|
46 |
foreach($this->all as $style) {
|
47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
}
|
49 |
}
|
50 |
}
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_Factory409_StyleList') ) {
|
18 |
|
19 |
/**
|
20 |
* Style List
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
class Wbcr_Factory409_StyleList extends Wbcr_Factory409_AssetsList {
|
25 |
|
26 |
+
/**
|
27 |
+
* Adds new items to the collection (default place).
|
28 |
+
*
|
29 |
+
* @param mixed
|
30 |
+
* @version 2.0
|
31 |
+
*/
|
32 |
+
public function add($file_url, $deps = array(), $handle = null, $version = false, $media = 'all')
|
33 |
{
|
34 |
|
35 |
+
if( empty($file_url) ) {
|
36 |
+
return $this;
|
37 |
+
}
|
38 |
+
|
39 |
+
$resource = array();
|
40 |
+
$resource['file_url'] = $file_url;
|
41 |
+
$resource['deps'] = $deps;
|
42 |
+
$resource['handle'] = $handle;
|
43 |
+
$resource['version'] = $version;
|
44 |
+
$resource['media'] = $media;
|
45 |
+
|
46 |
+
$this->all[] = $resource;
|
47 |
+
|
48 |
+
return $this;
|
49 |
+
}
|
50 |
+
|
51 |
+
public function connect($source = 'wordpress')
|
52 |
+
{
|
53 |
// register all global required scripts
|
54 |
if( !empty($this->required[$source]) ) {
|
55 |
|
66 |
return;
|
67 |
}
|
68 |
|
69 |
+
if( empty($this->all) ) {
|
70 |
+
return;
|
71 |
+
}
|
72 |
+
|
73 |
// register all other styles
|
74 |
foreach($this->all as $style) {
|
75 |
+
|
76 |
+
if( empty($style['file_url']) ) {
|
77 |
+
continue;
|
78 |
+
}
|
79 |
+
|
80 |
+
$handle = !empty($style['handle']) ? $style['handle'] : md5($style['file_url']);
|
81 |
+
$deps = !is_array($style['deps']) ? array() : $style['deps'];
|
82 |
+
$version = !empty($style['version']) ? $style['version'] : $this->plugin->getPluginVersion();
|
83 |
+
|
84 |
+
wp_enqueue_style($handle, $style['file_url'], $deps, $version);
|
85 |
}
|
86 |
}
|
87 |
}
|
libs/factory/core/includes/base.class.php
CHANGED
@@ -4,15 +4,23 @@
|
|
4 |
exit;
|
5 |
}
|
6 |
|
7 |
-
if( !class_exists('
|
8 |
-
class
|
9 |
|
10 |
/**
|
11 |
-
*
|
12 |
*
|
13 |
-
* @
|
|
|
14 |
*/
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
/**
|
18 |
* Префикс для пространства имен среди опций Wordpress
|
@@ -22,357 +30,495 @@
|
|
22 |
protected $prefix;
|
23 |
|
24 |
/**
|
25 |
-
*
|
26 |
*
|
27 |
-
* @var
|
28 |
*/
|
29 |
-
|
30 |
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
if( empty($this->prefix) || !is_string($this->prefix) ) {
|
38 |
-
throw new Exception('Не передан один из обязательных атрибутов (prefix) или атрибует не соотвествует типу данных string.');
|
39 |
-
}
|
40 |
-
|
41 |
-
$this->request = new Wbcr_Factory406_Request();
|
42 |
-
|
43 |
-
if( !isset(self::$_opt_buffer[$this->prefix]) ) {
|
44 |
-
$cache_options = get_option($this->prefix . 'cache_options', array());
|
45 |
-
|
46 |
-
if( empty($cache_options) || !is_array($cache_options) ) {
|
47 |
-
$cache_options = array();
|
48 |
-
delete_option($this->prefix . 'cache_options');
|
49 |
-
}
|
50 |
-
|
51 |
-
self::$_opt_buffer[$this->prefix] = $cache_options;
|
52 |
-
}
|
53 |
-
}
|
54 |
|
55 |
/**
|
56 |
-
*
|
57 |
-
* то опция тянется только из базы данных. Не кешируемые опции это массивы,
|
58 |
-
* сериализованные массивы, строки больше 150 символов
|
59 |
*
|
60 |
-
* @
|
61 |
-
* @param bool $default
|
62 |
-
* @return mixed|void
|
63 |
*/
|
64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
{
|
66 |
-
|
67 |
-
return $default;
|
68 |
-
}
|
69 |
|
70 |
-
$
|
|
|
|
|
|
|
|
|
71 |
|
72 |
-
if(
|
73 |
-
|
74 |
-
? $default
|
75 |
-
: $get_cache_option;
|
76 |
}
|
77 |
|
78 |
-
|
|
|
|
|
|
|
|
|
79 |
|
80 |
-
|
81 |
-
|
82 |
-
}
|
83 |
|
84 |
-
|
85 |
-
|
86 |
-
|
|
|
87 |
}
|
88 |
|
89 |
/**
|
90 |
-
*
|
91 |
-
*
|
92 |
-
*
|
93 |
-
* @param string $option_name
|
94 |
-
* @param string $value
|
95 |
-
* @return void
|
96 |
*/
|
97 |
-
public function
|
98 |
{
|
99 |
-
|
100 |
-
$this->setCacheOption($option_name, $this->normalizeValue($value));
|
101 |
-
} else {
|
102 |
-
if( isset(self::$_opt_buffer[$this->prefix][$option_name]) ) {
|
103 |
-
unset(self::$_opt_buffer[$this->prefix][$option_name]);
|
104 |
-
|
105 |
-
$this->updateOption('cache_options', self::$_opt_buffer[$this->prefix]);
|
106 |
-
}
|
107 |
-
}
|
108 |
-
|
109 |
-
update_option($this->prefix . $option_name, $value);
|
110 |
}
|
111 |
|
112 |
/**
|
113 |
-
*
|
114 |
-
* и в буфере опций, кеш обновляется только кешируемых опций. Не кешируемые опции это массивы,
|
115 |
-
* сериализованные массивы, строки больше 150 символов
|
116 |
*
|
117 |
-
* @
|
118 |
* @return bool
|
119 |
*/
|
120 |
-
public function
|
121 |
{
|
122 |
-
|
123 |
-
return false;
|
124 |
-
}
|
125 |
|
126 |
-
|
127 |
-
$
|
|
|
|
|
|
|
|
|
128 |
}
|
129 |
|
130 |
-
$
|
131 |
-
|
132 |
-
return true;
|
133 |
}
|
134 |
|
135 |
/**
|
136 |
-
*
|
137 |
-
* индивидуально удаляет опцию из кеша.
|
138 |
*
|
139 |
-
* @
|
140 |
-
* @return
|
141 |
*/
|
142 |
-
public function
|
143 |
{
|
144 |
-
|
145 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
|
147 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
|
150 |
-
|
151 |
-
|
|
|
|
|
|
|
|
|
152 |
}
|
153 |
|
154 |
/**
|
155 |
-
*
|
156 |
*
|
157 |
-
* @
|
158 |
* @return void
|
159 |
*/
|
160 |
-
public function
|
161 |
{
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
}
|
167 |
|
168 |
-
|
169 |
-
|
|
|
|
|
170 |
}
|
171 |
-
|
172 |
-
$this->updateOption('cache_options', self::$_opt_buffer[$this->prefix]);
|
173 |
}
|
174 |
}
|
175 |
|
176 |
/**
|
177 |
-
*
|
|
|
178 |
*
|
179 |
-
* @
|
|
|
|
|
|
|
180 |
*/
|
181 |
-
public function
|
182 |
{
|
183 |
-
if(
|
184 |
-
|
185 |
-
|
|
|
186 |
}
|
187 |
|
188 |
-
$
|
189 |
}
|
190 |
|
191 |
/**
|
192 |
-
* Получает
|
193 |
*
|
194 |
-
* @param
|
195 |
-
*
|
196 |
-
* @return
|
197 |
*/
|
198 |
-
|
199 |
{
|
200 |
-
|
201 |
-
|
|
|
202 |
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
}
|
216 |
}
|
217 |
|
218 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
219 |
}
|
220 |
|
221 |
-
|
222 |
/**
|
223 |
-
*
|
224 |
*
|
|
|
|
|
225 |
* @param string $option_name
|
226 |
-
* @param
|
227 |
-
* @return void
|
228 |
-
* @throws Exception
|
229 |
*/
|
230 |
-
|
231 |
{
|
232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
|
234 |
-
if(
|
235 |
-
$
|
236 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
}
|
238 |
|
239 |
/**
|
240 |
-
*
|
241 |
-
*
|
242 |
-
*
|
243 |
-
* @param array $options
|
244 |
* @return bool
|
245 |
-
* @throws Exception
|
246 |
*/
|
247 |
-
|
248 |
{
|
249 |
-
|
250 |
-
$
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
if( !empty(self::$_opt_buffer[$this->prefix]) ) {
|
255 |
-
$this->updateOption('cache_options', self::$_opt_buffer[$this->prefix]);
|
256 |
}
|
257 |
-
|
258 |
-
return false;
|
259 |
}
|
260 |
|
261 |
/**
|
262 |
-
*
|
263 |
-
* то заполняет буфер кеширумыми опциями, которые уже записаны в базу данных.
|
264 |
*
|
|
|
265 |
* @param string $option_name
|
266 |
-
* @
|
267 |
-
* @
|
268 |
*/
|
269 |
-
|
270 |
{
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
if( !empty($all_options) ) {
|
275 |
-
$this->updateCacheOptions($all_options);
|
276 |
-
}
|
277 |
-
}
|
278 |
|
279 |
-
$
|
280 |
|
281 |
-
|
282 |
-
|
283 |
-
|
|
|
|
|
|
|
284 |
|
285 |
-
return
|
286 |
}
|
287 |
|
288 |
/**
|
289 |
-
*
|
290 |
*
|
|
|
|
|
291 |
* @param string $option_name
|
292 |
-
* @
|
|
|
293 |
*/
|
294 |
-
|
295 |
{
|
296 |
-
|
297 |
-
|
298 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
299 |
|
300 |
-
return
|
301 |
}
|
302 |
|
303 |
/**
|
304 |
-
*
|
305 |
-
*
|
306 |
*
|
307 |
* @param string $option_name
|
308 |
-
* @
|
309 |
*/
|
310 |
-
|
311 |
{
|
312 |
-
if(
|
313 |
-
|
314 |
} else {
|
315 |
-
|
316 |
-
self::$_opt_buffer[$this->prefix][$option_name] = $option_value;
|
317 |
-
}
|
318 |
}
|
319 |
}
|
320 |
|
321 |
/**
|
322 |
-
*
|
|
|
323 |
*
|
324 |
* @param string $option_name
|
325 |
-
* @return
|
326 |
*/
|
327 |
-
public function
|
328 |
{
|
329 |
-
$
|
330 |
-
|
331 |
-
|
332 |
-
}
|
333 |
|
334 |
-
|
|
|
|
|
335 |
}
|
336 |
|
337 |
/**
|
338 |
-
*
|
339 |
-
*
|
340 |
*
|
341 |
-
* @param string $
|
342 |
* @return bool
|
343 |
*/
|
344 |
-
public function
|
345 |
{
|
346 |
-
|
347 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
348 |
}
|
349 |
|
350 |
-
return
|
351 |
}
|
352 |
|
353 |
/**
|
354 |
* Приведение значений опций к строгому типу данных
|
355 |
*
|
356 |
-
* @param $string
|
357 |
* @return bool|int
|
358 |
*/
|
359 |
-
public function normalizeValue($
|
360 |
{
|
361 |
-
if(
|
362 |
-
$
|
363 |
|
364 |
-
if(
|
365 |
-
|
|
|
|
|
|
|
|
|
366 |
}
|
367 |
-
|
368 |
-
return $number;
|
369 |
-
} else if( $string === 'false' ) {
|
370 |
-
return false;
|
371 |
-
} else if( $string === 'true' ) {
|
372 |
-
return true;
|
373 |
}
|
374 |
|
375 |
-
return $
|
376 |
}
|
377 |
}
|
378 |
}
|
4 |
exit;
|
5 |
}
|
6 |
|
7 |
+
if( !class_exists('Wbcr_Factory409_Base') ) {
|
8 |
+
class Wbcr_Factory409_Base {
|
9 |
|
10 |
/**
|
11 |
+
* Is a current page one of the admin pages?
|
12 |
*
|
13 |
+
* @since 1.0.0
|
14 |
+
* @var bool
|
15 |
*/
|
16 |
+
public $is_admin;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Экзамеляр класса Wbcr_Factory409_Request, необходим управляет http запросами
|
20 |
+
*
|
21 |
+
* @var Wbcr_Factory409_Request
|
22 |
+
*/
|
23 |
+
public $request;
|
24 |
|
25 |
/**
|
26 |
* Префикс для пространства имен среди опций Wordpress
|
30 |
protected $prefix;
|
31 |
|
32 |
/**
|
33 |
+
* Заголовок плагина
|
34 |
*
|
35 |
+
* @var string
|
36 |
*/
|
37 |
+
protected $plugin_title;
|
38 |
|
39 |
+
/**
|
40 |
+
* Название плагина
|
41 |
+
*
|
42 |
+
* @var string
|
43 |
+
*/
|
44 |
+
protected $plugin_name;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
|
46 |
/**
|
47 |
+
* Версия плагина
|
|
|
|
|
48 |
*
|
49 |
+
* @var string
|
|
|
|
|
50 |
*/
|
51 |
+
protected $plugin_version;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Тип сборки плагина. Возможнные варианты: free, premium, trial
|
55 |
+
*
|
56 |
+
* @var string
|
57 |
+
*/
|
58 |
+
protected $plugin_build;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* @var string
|
62 |
+
*/
|
63 |
+
protected $plugin_assembly;
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Абсолютный путь к основному файлу плагина.
|
67 |
+
*
|
68 |
+
* @var string
|
69 |
+
*/
|
70 |
+
protected $main_file;
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Абсолютный путь к директории плагина
|
74 |
+
*
|
75 |
+
* @var string
|
76 |
+
*/
|
77 |
+
protected $plugin_root;
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Относительный путь к директории плагина
|
81 |
+
*
|
82 |
+
* @var string
|
83 |
+
*/
|
84 |
+
protected $relative_path;
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Ссылка на директорию плагина
|
88 |
+
*
|
89 |
+
* @var string
|
90 |
+
*/
|
91 |
+
protected $plugin_url;
|
92 |
+
|
93 |
+
/**
|
94 |
+
* @since 4.0.8 - добавлена дополнительная логика
|
95 |
+
*
|
96 |
+
* @param string $plugin_path
|
97 |
+
* @param array $data
|
98 |
+
* @throws Exception
|
99 |
+
*/
|
100 |
+
public function __construct($plugin_path, $data)
|
101 |
{
|
102 |
+
$this->request = new Wbcr_Factory409_Request();
|
|
|
|
|
103 |
|
104 |
+
foreach((array)$data as $option_name => $option_value) {
|
105 |
+
if( property_exists($this, $option_name) ) {
|
106 |
+
$this->$option_name = $option_value;
|
107 |
+
}
|
108 |
+
}
|
109 |
|
110 |
+
if( empty($this->prefix) || empty($this->plugin_title) || empty($this->plugin_version) || empty($this->plugin_build) ) {
|
111 |
+
throw new Exception('One of the required attributes has not been passed (prefix,plugin_title,plugin_name,plugin_version,plugin_build).');
|
|
|
|
|
112 |
}
|
113 |
|
114 |
+
// saves plugin basic paramaters
|
115 |
+
$this->main_file = $plugin_path;
|
116 |
+
$this->plugin_root = dirname($plugin_path);
|
117 |
+
$this->relative_path = plugin_basename($plugin_path);
|
118 |
+
$this->plugin_url = plugins_url(null, $plugin_path);
|
119 |
|
120 |
+
// used only in the module 'updates'
|
121 |
+
$this->plugin_slug = !empty($this->plugin_name) ? $this->plugin_name : basename($plugin_path);
|
|
|
122 |
|
123 |
+
// Makes sure the plugin is defined before trying to use it
|
124 |
+
if( !function_exists('is_plugin_active_for_network') ) {
|
125 |
+
require_once(ABSPATH . '/wp-admin/includes/plugin.php');
|
126 |
+
}
|
127 |
}
|
128 |
|
129 |
/**
|
130 |
+
* Активирован ли сайт в режиме мультисайтов и мы находимся в области суперадминистратора
|
131 |
+
* @return bool
|
|
|
|
|
|
|
|
|
132 |
*/
|
133 |
+
public function isNetworkAdmin()
|
134 |
{
|
135 |
+
return is_multisite() && is_network_admin();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
}
|
137 |
|
138 |
/**
|
139 |
+
* Активирован ли плагин для сети
|
|
|
|
|
140 |
*
|
141 |
+
* @since 4.0.8
|
142 |
* @return bool
|
143 |
*/
|
144 |
+
public function isNetworkActive()
|
145 |
{
|
146 |
+
$activate = is_plugin_active_for_network($this->relative_path);
|
|
|
|
|
147 |
|
148 |
+
if( !$activate && $this->isNetworkAdmin() && isset($_GET['action']) && $_GET['action'] == 'activate' ) {
|
149 |
+
$is_activate_for_network = isset($_GET['plugin_status']) && $_GET['plugin_status'] == 'all';
|
150 |
+
|
151 |
+
if( $is_activate_for_network ) {
|
152 |
+
return true;
|
153 |
+
}
|
154 |
}
|
155 |
|
156 |
+
return $activate;
|
|
|
|
|
157 |
}
|
158 |
|
159 |
/**
|
160 |
+
* Получает список активных сайтов сети
|
|
|
161 |
*
|
162 |
+
* @since 4.0.8
|
163 |
+
* @return array|int
|
164 |
*/
|
165 |
+
public function getActiveSites($args = array('archived' => 0, 'mature' => 0, 'spam' => 0, 'deleted' => 0))
|
166 |
{
|
167 |
+
global $wp_version;
|
168 |
+
|
169 |
+
if( version_compare($wp_version, '4.6', '>=') ) {
|
170 |
+
return get_sites($args);
|
171 |
+
} else {
|
172 |
+
$converted_array = array();
|
173 |
+
|
174 |
+
$sites = wp_get_sites($args);
|
175 |
+
|
176 |
+
if( empty($sites) ) {
|
177 |
+
return $converted_array;
|
178 |
+
}
|
179 |
|
180 |
+
foreach((array)$sites as $key => $site) {
|
181 |
+
$obj = new stdClass();
|
182 |
+
foreach($site as $attr => $value) {
|
183 |
+
$obj->$attr = $value;
|
184 |
+
}
|
185 |
+
$converted_array[$key] = $obj;
|
186 |
+
}
|
187 |
+
|
188 |
+
return $converted_array;
|
189 |
}
|
190 |
+
}
|
191 |
+
|
192 |
+
/**
|
193 |
+
* Получает все опции плагина
|
194 |
+
*
|
195 |
+
* @since 4.0.8
|
196 |
+
* @return array
|
197 |
+
*/
|
198 |
+
public function loadAllOptions()
|
199 |
+
{
|
200 |
+
global $wpdb;
|
201 |
+
|
202 |
+
$is_option_loaded = wp_cache_get($this->prefix . 'all_options_loaded', $this->prefix . 'options');
|
203 |
+
|
204 |
+
if( false === $is_option_loaded ) {
|
205 |
+
$result = $wpdb->get_results("SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE '{$this->prefix}%'");
|
206 |
+
|
207 |
+
$options = array();
|
208 |
+
|
209 |
+
if( !empty($result) ) {
|
210 |
+
wp_cache_add($this->prefix . 'all_options_loaded', 1, $this->prefix . 'options');
|
211 |
+
|
212 |
+
foreach($result as $option) {
|
213 |
+
$value = maybe_unserialize($option->option_value);
|
214 |
+
$value = $this->normalizeValue($value);
|
215 |
+
|
216 |
+
wp_cache_add($option->option_name, $value, $this->prefix . 'options');
|
217 |
+
$options[$option->option_name] = $value;
|
218 |
+
}
|
219 |
|
220 |
+
/**
|
221 |
+
* @since 4.0.9
|
222 |
+
*/
|
223 |
+
do_action('wbcr/factory/all_options_loaded', $options, $this->plugin_name);
|
224 |
+
}
|
225 |
+
}
|
226 |
}
|
227 |
|
228 |
/**
|
229 |
+
* Получает все опции плагина
|
230 |
*
|
231 |
+
* @since 4.0.8
|
232 |
* @return void
|
233 |
*/
|
234 |
+
public function loadAllNetworkOptions()
|
235 |
{
|
236 |
+
global $wpdb;
|
237 |
+
|
238 |
+
$network_id = (int)get_current_network_id();
|
239 |
+
|
240 |
+
$is_option_loaded = wp_cache_get($network_id . ":" . $this->prefix . 'all_options_loaded', $this->prefix . 'network_options');
|
241 |
+
|
242 |
+
if( false === $is_option_loaded ) {
|
243 |
+
wp_cache_add_global_groups(array($this->prefix . 'network_options'));
|
244 |
+
|
245 |
+
$result = $wpdb->get_results("SELECT meta_key, meta_value FROM {$wpdb->sitemeta} WHERE site_id='{$network_id}' AND meta_key LIKE '{$this->prefix}%'");
|
246 |
+
|
247 |
+
$options = array();
|
248 |
+
if( !empty($result) ) {
|
249 |
+
wp_cache_add($network_id . ":" . $this->prefix . 'all_options_loaded', 1, $this->prefix . 'network_options');
|
250 |
+
|
251 |
+
foreach($result as $option) {
|
252 |
+
$value = maybe_unserialize($option->meta_value);
|
253 |
+
$value = $this->normalizeValue($value);
|
254 |
+
|
255 |
+
$cache_key = $network_id . ":" . $option->meta_key;
|
256 |
+
wp_cache_add($cache_key, $value, $this->prefix . 'network_options');
|
257 |
+
$options[$option->meta_key] = $value;
|
258 |
}
|
259 |
|
260 |
+
/**
|
261 |
+
* @since 4.0.9
|
262 |
+
*/
|
263 |
+
do_action('wbcr/factory/all_network_options_loaded', $options, $this->plugin_name);
|
264 |
}
|
|
|
|
|
265 |
}
|
266 |
}
|
267 |
|
268 |
/**
|
269 |
+
* Если плагин установлен для сети, то метод возвращает опции только для сети,
|
270 |
+
* иначе метод возвращает опцию для текущего сайта.
|
271 |
*
|
272 |
+
* @since 4.0.8
|
273 |
+
* @param string $option_name
|
274 |
+
* @param string $default
|
275 |
+
* @return bool|mixed|void
|
276 |
*/
|
277 |
+
public function getPopulateOption($option_name, $default = false)
|
278 |
{
|
279 |
+
if( $this->isNetworkActive() ) {
|
280 |
+
$option_value = $this->getNetworkOption($option_name, $default);
|
281 |
+
} else {
|
282 |
+
$option_value = $this->getOption($option_name, $default);
|
283 |
}
|
284 |
|
285 |
+
return apply_filters("wbcr/factory/populate_option_{$option_name}", $option_value, $option_name, $default);
|
286 |
}
|
287 |
|
288 |
/**
|
289 |
+
* Получает опцию для сети, используется в режиме мультисайтов
|
290 |
*
|
291 |
+
* @param $option_name
|
292 |
+
* @param bool $default
|
293 |
+
* @return bool|mixed|void
|
294 |
*/
|
295 |
+
public function getNetworkOption($option_name, $default = false)
|
296 |
{
|
297 |
+
if( empty($option_name) || !is_string($option_name) ) {
|
298 |
+
throw new Exception('Option name must be a string and must not be empty.');
|
299 |
+
}
|
300 |
|
301 |
+
if( !is_multisite() ) {
|
302 |
+
return $this->getOption($option_name, $default);
|
303 |
+
}
|
304 |
+
|
305 |
+
$this->loadAllNetworkOptions();
|
306 |
|
307 |
+
$network_id = (int)get_current_network_id();
|
308 |
+
$cache_key = $network_id . ':' . $this->prefix . $option_name;
|
309 |
+
$option_value = wp_cache_get($cache_key, $this->prefix . 'network_options');
|
310 |
+
|
311 |
+
if( false === $option_value ) {
|
312 |
+
$option_value = $default;
|
|
|
313 |
}
|
314 |
|
315 |
+
/**
|
316 |
+
* @param mixed $option_value
|
317 |
+
* @param string $option_name
|
318 |
+
* @param mixed $default
|
319 |
+
* @param int $network_id
|
320 |
+
* @since 4.0.8
|
321 |
+
*/
|
322 |
+
|
323 |
+
return apply_filters("wbcr/factory/network_option_{$option_name}", $option_value, $option_name, $default, $network_id);
|
324 |
}
|
325 |
|
|
|
326 |
/**
|
327 |
+
* Получает опцию из кеша или из базы данныеs
|
328 |
*
|
329 |
+
* @since 4.0.0
|
330 |
+
* @since 4.0.8 - полностью переделан
|
331 |
* @param string $option_name
|
332 |
+
* @param bool $default
|
333 |
+
* @return mixed|void
|
|
|
334 |
*/
|
335 |
+
public function getOption($option_name, $default = false)
|
336 |
{
|
337 |
+
if( empty($option_name) || !is_string($option_name) ) {
|
338 |
+
throw new Exception('Option name must be a string and must not be empty.');
|
339 |
+
}
|
340 |
+
|
341 |
+
$this->loadAllOptions();
|
342 |
+
|
343 |
+
$option_value = wp_cache_get($this->prefix . $option_name, $this->prefix . 'options');
|
344 |
|
345 |
+
if( false === $option_value ) {
|
346 |
+
$option_value = $default;
|
347 |
}
|
348 |
+
|
349 |
+
/**
|
350 |
+
* @param mixed $option_value
|
351 |
+
* @param string $option_name
|
352 |
+
* @param mixed $default
|
353 |
+
* @since 4.0.8
|
354 |
+
*/
|
355 |
+
|
356 |
+
return apply_filters("wbcr/factory/option_{$option_name}", $option_value, $option_name, $default);
|
357 |
}
|
358 |
|
359 |
/**
|
360 |
+
* @param $option_name
|
361 |
+
* @param $option_value
|
|
|
|
|
362 |
* @return bool
|
|
|
363 |
*/
|
364 |
+
public function updatePopulateOption($option_name, $option_value)
|
365 |
{
|
366 |
+
if( $this->isNetworkActive() ) {
|
367 |
+
$this->updateNetworkOption($option_name, $option_value);
|
368 |
+
} else {
|
369 |
+
$this->updateOption($option_name, $option_value);
|
|
|
|
|
|
|
370 |
}
|
|
|
|
|
371 |
}
|
372 |
|
373 |
/**
|
374 |
+
* Обновляет опцию для сети в базе данных и в кеше
|
|
|
375 |
*
|
376 |
+
* @since 4.0.8
|
377 |
* @param string $option_name
|
378 |
+
* @param mixed $value
|
379 |
+
* @return bool
|
380 |
*/
|
381 |
+
public function updateNetworkOption($option_name, $option_value)
|
382 |
{
|
383 |
+
$network_id = (int)get_current_network_id();
|
384 |
+
$cache_key = $network_id . ':' . $this->prefix . $option_name;
|
385 |
+
wp_cache_set($cache_key, $option_value, $this->prefix . 'network_options');
|
|
|
|
|
|
|
|
|
386 |
|
387 |
+
$result = update_site_option($this->prefix . $option_name, $option_value);
|
388 |
|
389 |
+
/**
|
390 |
+
* @param mixed $option_value
|
391 |
+
* @param string $option_name
|
392 |
+
* @since 4.0.8
|
393 |
+
*/
|
394 |
+
do_action("wbcr/factory/update_network_option", $option_name, $option_value);
|
395 |
|
396 |
+
return $result;
|
397 |
}
|
398 |
|
399 |
/**
|
400 |
+
* Обновляет опцию в базе данных и в кеше
|
401 |
*
|
402 |
+
* @since 4.0.0
|
403 |
+
* @since 4.0.8 - полностью переделан
|
404 |
* @param string $option_name
|
405 |
+
* @param mixed $value
|
406 |
+
* @return bool
|
407 |
*/
|
408 |
+
public function updateOption($option_name, $option_value)
|
409 |
{
|
410 |
+
wp_cache_set($this->prefix . $option_name, $option_value, $this->prefix . 'options');
|
411 |
+
$result = update_option($this->prefix . $option_name, $option_value);
|
412 |
+
|
413 |
+
/**
|
414 |
+
* @param mixed $option_value
|
415 |
+
* @param string $option_name
|
416 |
+
* @since 4.0.8
|
417 |
+
*/
|
418 |
+
do_action("wbcr/factory/update_option", $option_name, $option_value);
|
419 |
|
420 |
+
return $result;
|
421 |
}
|
422 |
|
423 |
/**
|
424 |
+
* Удаляет опцию из базы данных, если опция есть в кеше,
|
425 |
+
* индивидуально удаляет опцию из кеша.
|
426 |
*
|
427 |
* @param string $option_name
|
428 |
+
* @return void
|
429 |
*/
|
430 |
+
public function deletePopulateOption($option_name)
|
431 |
{
|
432 |
+
if( $this->isNetworkActive() ) {
|
433 |
+
$this->deleteNetworkOption($option_name);
|
434 |
} else {
|
435 |
+
$this->deleteOption($option_name);
|
|
|
|
|
436 |
}
|
437 |
}
|
438 |
|
439 |
/**
|
440 |
+
* Удаляет опцию из базы данных, если опция есть в кеше,
|
441 |
+
* индивидуально удаляет опцию из кеша.
|
442 |
*
|
443 |
* @param string $option_name
|
444 |
+
* @return bool
|
445 |
*/
|
446 |
+
public function deleteNetworkOption($option_name)
|
447 |
{
|
448 |
+
$network_id = (int)get_current_network_id();
|
449 |
+
$cache_key = $network_id . ':' . $this->prefix . $option_name;
|
450 |
+
$delete_cache = wp_cache_delete($cache_key, $this->prefix . 'network_options');
|
|
|
451 |
|
452 |
+
$delete_opt1 = delete_site_option($this->prefix . $option_name);
|
453 |
+
|
454 |
+
return $delete_cache && $delete_opt1;
|
455 |
}
|
456 |
|
457 |
/**
|
458 |
+
* Удаляет опцию из базы данных, если опция есть в кеше,
|
459 |
+
* индивидуально удаляет опцию из кеша.
|
460 |
*
|
461 |
+
* @param string $option_name
|
462 |
* @return bool
|
463 |
*/
|
464 |
+
public function deleteOption($option_name)
|
465 |
{
|
466 |
+
$delete_cache = wp_cache_delete($this->prefix . $option_name, $this->prefix . 'options');
|
467 |
+
|
468 |
+
// todo: удалить, когда большая часть пользователей обновятся до современных релизов
|
469 |
+
$delete_opt1 = delete_option($this->prefix . $option_name . '_is_active');
|
470 |
+
$delete_opt2 = delete_option($this->prefix . $option_name);
|
471 |
+
|
472 |
+
return $delete_cache && $delete_opt1 && $delete_opt2;
|
473 |
+
}
|
474 |
+
|
475 |
+
/**
|
476 |
+
* Сбрасывает объектный кеш опций
|
477 |
+
*
|
478 |
+
* @return bool
|
479 |
+
*/
|
480 |
+
public function flushOptionsCache()
|
481 |
+
{
|
482 |
+
return wp_cache_flush();
|
483 |
+
}
|
484 |
+
|
485 |
+
/**
|
486 |
+
* Возвращает название опции в пространстве имен плагина
|
487 |
+
*
|
488 |
+
* @param string $option_name
|
489 |
+
* @return null|string
|
490 |
+
*/
|
491 |
+
public function getOptionName($option_name)
|
492 |
+
{
|
493 |
+
$option_name = trim(rtrim($option_name));
|
494 |
+
if( empty($option_name) || !is_string($option_name) ) {
|
495 |
+
return null;
|
496 |
}
|
497 |
|
498 |
+
return $this->prefix . $option_name;
|
499 |
}
|
500 |
|
501 |
/**
|
502 |
* Приведение значений опций к строгому типу данных
|
503 |
*
|
504 |
+
* @param mixed $string
|
505 |
* @return bool|int
|
506 |
*/
|
507 |
+
public function normalizeValue($data)
|
508 |
{
|
509 |
+
if( is_string($data) ) {
|
510 |
+
$check_string = rtrim(trim($data));
|
511 |
|
512 |
+
if( $check_string == "1" || $check_string == "0" ) {
|
513 |
+
return intval($data);
|
514 |
+
} else if( $check_string === 'false' ) {
|
515 |
+
return false;
|
516 |
+
} else if( $check_string === 'true' ) {
|
517 |
+
return true;
|
518 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
519 |
}
|
520 |
|
521 |
+
return $data;
|
522 |
}
|
523 |
}
|
524 |
}
|
libs/factory/core/includes/check-compatibility.php
ADDED
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Проверяет совместимость с плагинами Webcraftic, с версиями php, с версиями Wordpress
|
5 |
+
*
|
6 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
7 |
+
* @copyright (c) 26.09.2018, Webcraftic
|
8 |
+
* @version 1.0.0
|
9 |
+
* @since 4.0.8
|
10 |
+
*/
|
11 |
+
|
12 |
+
if( !class_exists('Wbcr_Factory_Compatibility') ) {
|
13 |
+
class Wbcr_Factory_Compatibility {
|
14 |
+
|
15 |
+
protected $plugin_prefix;
|
16 |
+
protected $plugin_class_prefix;
|
17 |
+
protected $plugin_name;
|
18 |
+
protected $plugin_title = "(no title)";
|
19 |
+
protected $required_php_version = '5.3';
|
20 |
+
protected $required_wp_version = '4.2.0';
|
21 |
+
|
22 |
+
function __construct(array $plugin_info)
|
23 |
+
{
|
24 |
+
foreach((array)$plugin_info as $property => $value) {
|
25 |
+
$this->$property = $value;
|
26 |
+
}
|
27 |
+
|
28 |
+
add_action('admin_init', array($this, 'registerNotices'));
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Метод проверяет совместимость плагина с php и wordpress версией
|
33 |
+
*
|
34 |
+
* @return bool
|
35 |
+
*/
|
36 |
+
public function check()
|
37 |
+
{
|
38 |
+
if( !$this->isPhpCompatibility() ) {
|
39 |
+
return false;
|
40 |
+
}
|
41 |
+
|
42 |
+
if( !$this->isWpCompatibility() ) {
|
43 |
+
return false;
|
44 |
+
}
|
45 |
+
|
46 |
+
return true;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Метод проверяет совместимость плагина с php версией сервера
|
51 |
+
*
|
52 |
+
* @return mixed
|
53 |
+
*/
|
54 |
+
public function isPhpCompatibility()
|
55 |
+
{
|
56 |
+
return version_compare(PHP_VERSION, $this->required_php_version, '>=');
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Метод проверяет совместимость плагина с Wordpress версией сайта
|
61 |
+
*
|
62 |
+
* @return mixed
|
63 |
+
*/
|
64 |
+
public function isWpCompatibility()
|
65 |
+
{
|
66 |
+
// Get the WP Version global.
|
67 |
+
global $wp_version;
|
68 |
+
|
69 |
+
return version_compare($wp_version, $this->required_wp_version, '>=');
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Метод возвращает текст уведомления
|
74 |
+
*
|
75 |
+
* @return string
|
76 |
+
*/
|
77 |
+
public function getNoticeText()
|
78 |
+
{
|
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_206'), $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_409'), $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_409'), $this->required_wp_version) . '<br>';
|
95 |
+
}
|
96 |
+
|
97 |
+
if( $has_one ) {
|
98 |
+
$notice_text = $notice_default_text . $notice_text;
|
99 |
+
}
|
100 |
+
|
101 |
+
return $notice_text;
|
102 |
+
}
|
103 |
+
|
104 |
+
public function registerNotices()
|
105 |
+
{
|
106 |
+
if( current_user_can('activate_plugins') && current_user_can('edit_plugins') && current_user_can('install_plugins') ) {
|
107 |
+
if( is_multisite() ) {
|
108 |
+
add_action('network_admin_notices', array($this, 'showNotice'));
|
109 |
+
}
|
110 |
+
|
111 |
+
add_action('admin_notices', array($this, 'showNotice'));
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
public function showNotice()
|
116 |
+
{
|
117 |
+
$notice_text = $this->getNoticeText();
|
118 |
+
|
119 |
+
if( empty($notice_text) ) {
|
120 |
+
return;
|
121 |
+
}
|
122 |
+
|
123 |
+
$notice_text = '<p>' . $this->getNoticeText() . '</p>';
|
124 |
+
|
125 |
+
echo '<div class="notice notice-error">' . apply_filters('wbcr/factory/check_compatibility/notice_text', $notice_text, $this->plugin_name) . '</div>';
|
126 |
+
}
|
127 |
+
}
|
128 |
+
}
|
libs/factory/core/includes/functions.php
CHANGED
@@ -13,36 +13,29 @@
|
|
13 |
if( !defined('ABSPATH') ) {
|
14 |
exit;
|
15 |
}
|
16 |
-
|
17 |
-
if( function_exists('
|
18 |
-
|
19 |
-
* Sets a lazy redirect.
|
20 |
-
*
|
21 |
-
* @since 3.0.6
|
22 |
-
* @return void
|
23 |
-
*/
|
24 |
-
function wbcr_factory_406_set_lazy_redirect($url)
|
25 |
-
{
|
26 |
-
update_option('wbcr_factory_406_lazy_redirect', $url);
|
27 |
-
}
|
28 |
-
}
|
29 |
-
|
30 |
-
if( function_exists('wbcr_factory_406_do_lazy_redirect') ) {
|
31 |
-
function wbcr_factory_406_do_lazy_redirect()
|
32 |
{
|
33 |
-
$
|
34 |
-
|
35 |
-
|
36 |
-
|
|
|
|
|
|
|
37 |
}
|
38 |
-
|
39 |
-
|
40 |
-
|
|
|
|
|
|
|
|
|
|
|
41 |
}
|
42 |
-
|
43 |
-
add_action('admin_init', 'wbcr_factory_406_do_lazy_redirect');
|
44 |
}
|
45 |
-
|
46 |
/**
|
47 |
* Fires functions attached to a deprecated filter hook.
|
48 |
*
|
@@ -54,7 +47,7 @@
|
|
54 |
*
|
55 |
* @since 1.0.0
|
56 |
*
|
57 |
-
* @see
|
58 |
*
|
59 |
* @param string $tag The name of the filter hook.
|
60 |
* @param array $args Array of additional function arguments to be passed to apply_filters().
|
@@ -64,7 +57,7 @@
|
|
64 |
*
|
65 |
* @return mixed
|
66 |
*/
|
67 |
-
function
|
68 |
{
|
69 |
if( function_exists('apply_filters_deprecated') ) {
|
70 |
return apply_filters_deprecated($tag, $args, $version, $replacement, $message);
|
@@ -72,7 +65,7 @@
|
|
72 |
if( !has_filter($tag) ) {
|
73 |
return $args[0];
|
74 |
}
|
75 |
-
|
76 |
|
77 |
return apply_filters_ref_array($tag, $args);
|
78 |
}
|
@@ -98,7 +91,7 @@
|
|
98 |
*
|
99 |
* @return void
|
100 |
*/
|
101 |
-
function
|
102 |
{
|
103 |
if( function_exists('do_action_deprecated') ) {
|
104 |
do_action_deprecated($tag, $args, $version, $replacement, $message);
|
@@ -108,14 +101,14 @@
|
|
108 |
if( !has_action($tag) ) {
|
109 |
return;
|
110 |
}
|
111 |
-
|
112 |
do_action_ref_array($tag, $args);
|
113 |
}
|
114 |
|
115 |
/**
|
116 |
* Marks a deprecated action or filter hook as deprecated and throws a notice.
|
117 |
*
|
118 |
-
* Use the '
|
119 |
* deprecated hook was called.
|
120 |
*
|
121 |
* Default behavior is to trigger a user error if WP_DEBUG is true.
|
@@ -133,7 +126,7 @@
|
|
133 |
* @param string $replacement Optional. The hook that should have been used.
|
134 |
* @param string $message Optional. A message regarding the change.
|
135 |
*/
|
136 |
-
function
|
137 |
{
|
138 |
/**
|
139 |
* Fires when a deprecated hook is called.
|
@@ -156,9 +149,7 @@
|
|
156 |
* `WP_DEBUG` to be defined true.
|
157 |
*/
|
158 |
if( WP_DEBUG && apply_filters('deprecated_hook_trigger_error', true) ) {
|
159 |
-
$message = empty($message)
|
160 |
-
? ''
|
161 |
-
: ' ' . $message;
|
162 |
if( !is_null($replacement) ) {
|
163 |
trigger_error(sprintf(__('%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.'), $hook, $version, $replacement) . $message);
|
164 |
} else {
|
@@ -167,3 +158,54 @@
|
|
167 |
}
|
168 |
}
|
169 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
if( !defined('ABSPATH') ) {
|
14 |
exit;
|
15 |
}
|
16 |
+
|
17 |
+
if( !function_exists('get_user_locale') ) {
|
18 |
+
function get_user_locale($user_id = 0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
{
|
20 |
+
$user = false;
|
21 |
+
if( 0 === $user_id && function_exists('wp_get_current_user') ) {
|
22 |
+
$user = wp_get_current_user();
|
23 |
+
} elseif( $user_id instanceof WP_User ) {
|
24 |
+
$user = $user_id;
|
25 |
+
} elseif( $user_id && is_numeric($user_id) ) {
|
26 |
+
$user = get_user_by('id', $user_id);
|
27 |
}
|
28 |
+
|
29 |
+
if( !$user ) {
|
30 |
+
return get_locale();
|
31 |
+
}
|
32 |
+
|
33 |
+
$locale = $user->locale;
|
34 |
+
|
35 |
+
return $locale ? $locale : get_locale();
|
36 |
}
|
|
|
|
|
37 |
}
|
38 |
+
|
39 |
/**
|
40 |
* Fires functions attached to a deprecated filter hook.
|
41 |
*
|
47 |
*
|
48 |
* @since 1.0.0
|
49 |
*
|
50 |
+
* @see wbcr_factory_409_deprecated_hook()
|
51 |
*
|
52 |
* @param string $tag The name of the filter hook.
|
53 |
* @param array $args Array of additional function arguments to be passed to apply_filters().
|
57 |
*
|
58 |
* @return mixed
|
59 |
*/
|
60 |
+
function wbcr_factory_409_apply_filters_deprecated($tag, $args, $version, $replacement = false, $message = null)
|
61 |
{
|
62 |
if( function_exists('apply_filters_deprecated') ) {
|
63 |
return apply_filters_deprecated($tag, $args, $version, $replacement, $message);
|
65 |
if( !has_filter($tag) ) {
|
66 |
return $args[0];
|
67 |
}
|
68 |
+
wbcr_factory_409_deprecated_hook($tag, $version, $replacement, $message);
|
69 |
|
70 |
return apply_filters_ref_array($tag, $args);
|
71 |
}
|
91 |
*
|
92 |
* @return void
|
93 |
*/
|
94 |
+
function wbcr_factory_409_do_action_deprecated($tag, $args, $version, $replacement = false, $message = null)
|
95 |
{
|
96 |
if( function_exists('do_action_deprecated') ) {
|
97 |
do_action_deprecated($tag, $args, $version, $replacement, $message);
|
101 |
if( !has_action($tag) ) {
|
102 |
return;
|
103 |
}
|
104 |
+
wbcr_factory_409_deprecated_hook($tag, $version, $replacement, $message);
|
105 |
do_action_ref_array($tag, $args);
|
106 |
}
|
107 |
|
108 |
/**
|
109 |
* Marks a deprecated action or filter hook as deprecated and throws a notice.
|
110 |
*
|
111 |
+
* Use the 'wbcr_factory_409_deprecated_hook_run' action to get the backtrace describing where the
|
112 |
* deprecated hook was called.
|
113 |
*
|
114 |
* Default behavior is to trigger a user error if WP_DEBUG is true.
|
126 |
* @param string $replacement Optional. The hook that should have been used.
|
127 |
* @param string $message Optional. A message regarding the change.
|
128 |
*/
|
129 |
+
function wbcr_factory_409_deprecated_hook($hook, $version, $replacement = null, $message = null)
|
130 |
{
|
131 |
/**
|
132 |
* Fires when a deprecated hook is called.
|
149 |
* `WP_DEBUG` to be defined true.
|
150 |
*/
|
151 |
if( WP_DEBUG && apply_filters('deprecated_hook_trigger_error', true) ) {
|
152 |
+
$message = empty($message) ? '' : ' ' . $message;
|
|
|
|
|
153 |
if( !is_null($replacement) ) {
|
154 |
trigger_error(sprintf(__('%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.'), $hook, $version, $replacement) . $message);
|
155 |
} else {
|
158 |
}
|
159 |
}
|
160 |
|
161 |
+
|
162 |
+
if(!function_exists('_sanitize_text_fields')){
|
163 |
+
function _sanitize_text_fields( $str, $keep_newlines = false ) {
|
164 |
+
$filtered = wp_check_invalid_utf8( $str );
|
165 |
+
|
166 |
+
if ( strpos($filtered, '<') !== false ) {
|
167 |
+
$filtered = wp_pre_kses_less_than( $filtered );
|
168 |
+
// This will strip extra whitespace for us.
|
169 |
+
$filtered = wp_strip_all_tags( $filtered, false );
|
170 |
+
|
171 |
+
// Use html entities in a special case to make sure no later
|
172 |
+
// newline stripping stage could lead to a functional tag
|
173 |
+
$filtered = str_replace("<\n", "<\n", $filtered);
|
174 |
+
}
|
175 |
+
|
176 |
+
if ( ! $keep_newlines ) {
|
177 |
+
$filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered );
|
178 |
+
}
|
179 |
+
$filtered = trim( $filtered );
|
180 |
+
|
181 |
+
$found = false;
|
182 |
+
while ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) {
|
183 |
+
$filtered = str_replace($match[0], '', $filtered);
|
184 |
+
$found = true;
|
185 |
+
}
|
186 |
+
|
187 |
+
if ( $found ) {
|
188 |
+
// Strip out the whitespace that may now exist after removing the octets.
|
189 |
+
$filtered = trim( preg_replace('/ +/', ' ', $filtered) );
|
190 |
+
}
|
191 |
+
|
192 |
+
return $filtered;
|
193 |
+
}
|
194 |
+
|
195 |
+
}
|
196 |
+
|
197 |
+
if(!function_exists('sanitize_textarea_field')){
|
198 |
+
function sanitize_textarea_field( $str ) {
|
199 |
+
$filtered = _sanitize_text_fields( $str, true );
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Filters a sanitized textarea field string.
|
203 |
+
*
|
204 |
+
* @since 4.7.0
|
205 |
+
*
|
206 |
+
* @param string $filtered The sanitized string.
|
207 |
+
* @param string $str The string prior to being sanitized.
|
208 |
+
*/
|
209 |
+
return apply_filters( 'sanitize_textarea_field', $filtered, $str );
|
210 |
+
}
|
211 |
+
}
|
libs/factory/core/includes/index.php
ADDED
File without changes
|
libs/factory/core/includes/plugin.class.php
CHANGED
@@ -14,93 +14,24 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( !class_exists('
|
18 |
|
19 |
-
abstract class
|
20 |
-
|
21 |
-
/**
|
22 |
-
* Is a current page one of the admin pages?
|
23 |
-
*
|
24 |
-
* @since 1.0.0
|
25 |
-
* @var bool
|
26 |
-
*/
|
27 |
-
public $is_admin;
|
28 |
|
29 |
/**
|
30 |
* The Bootstrap Manager class.n.
|
31 |
*
|
32 |
-
* @var
|
33 |
*/
|
34 |
public $bootstrap;
|
35 |
|
36 |
/**
|
37 |
* The Bootstrap Manager class.n.
|
38 |
*
|
39 |
-
* @var
|
40 |
*/
|
41 |
public $forms;
|
42 |
|
43 |
-
/**
|
44 |
-
* Заголовок плагина
|
45 |
-
*
|
46 |
-
* @var string
|
47 |
-
*/
|
48 |
-
protected $plugin_title;
|
49 |
-
|
50 |
-
/**
|
51 |
-
* Название плагина
|
52 |
-
*
|
53 |
-
* @var string
|
54 |
-
*/
|
55 |
-
protected $plugin_name;
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Версия плагина
|
59 |
-
*
|
60 |
-
* @var string
|
61 |
-
*/
|
62 |
-
protected $plugin_version;
|
63 |
-
|
64 |
-
/**
|
65 |
-
* Тип сборки плагина. Возможнные варианты: free, premium, trial
|
66 |
-
*
|
67 |
-
* @var string
|
68 |
-
*/
|
69 |
-
protected $plugin_build;
|
70 |
-
|
71 |
-
/**
|
72 |
-
* @var string
|
73 |
-
*/
|
74 |
-
protected $plugin_assembly;
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Абсолютный путь к основному файлу плагина.
|
78 |
-
*
|
79 |
-
* @var string
|
80 |
-
*/
|
81 |
-
protected $main_file;
|
82 |
-
|
83 |
-
/**
|
84 |
-
* Абсолютный путь к директории плагина
|
85 |
-
*
|
86 |
-
* @var string
|
87 |
-
*/
|
88 |
-
protected $plugin_root;
|
89 |
-
|
90 |
-
/**
|
91 |
-
* Относительный путь к директории плагина
|
92 |
-
*
|
93 |
-
* @var string
|
94 |
-
*/
|
95 |
-
protected $relative_path;
|
96 |
-
|
97 |
-
/**
|
98 |
-
* Ссылка на директорию плагина
|
99 |
-
*
|
100 |
-
* @var string
|
101 |
-
*/
|
102 |
-
protected $plugin_url;
|
103 |
-
|
104 |
/**
|
105 |
* A class name of an activator to activate the plugin.
|
106 |
*
|
@@ -118,7 +49,7 @@
|
|
118 |
/**
|
119 |
* Подключенные компоненнты плагина
|
120 |
*
|
121 |
-
* @var array[]
|
122 |
*/
|
123 |
private $plugin_addons;
|
124 |
|
@@ -141,29 +72,6 @@
|
|
141 |
|
142 |
parent::__construct($plugin_path, $data);
|
143 |
|
144 |
-
foreach((array)$data as $option_name => $option_value) {
|
145 |
-
if( property_exists($this, $option_name) ) {
|
146 |
-
$this->$option_name = $option_value;
|
147 |
-
}
|
148 |
-
}
|
149 |
-
|
150 |
-
$this->is_admin = is_admin();
|
151 |
-
|
152 |
-
if( empty($this->prefix) || empty($this->plugin_title) || empty($this->plugin_version) || empty($this->plugin_build) ) {
|
153 |
-
throw new Exception('One of the required attributes has not been passed (prefix,plugin_title,plugin_name,plugin_version,plugin_build).');
|
154 |
-
}
|
155 |
-
|
156 |
-
// saves plugin basic paramaters
|
157 |
-
$this->main_file = $plugin_path;
|
158 |
-
$this->plugin_root = dirname($plugin_path);
|
159 |
-
$this->relative_path = plugin_basename($plugin_path);
|
160 |
-
$this->plugin_url = plugins_url(null, $plugin_path);
|
161 |
-
|
162 |
-
// used only in the module 'updates'
|
163 |
-
$this->plugin_slug = !empty($this->plugin_name)
|
164 |
-
? $this->plugin_name
|
165 |
-
: basename($plugin_path);
|
166 |
-
|
167 |
if( empty($this->updates) && file_exists($this->plugin_root . '/updates') ) {
|
168 |
$this->updates = $this->plugin_root . '/updates';
|
169 |
}
|
@@ -264,27 +172,68 @@
|
|
264 |
}
|
265 |
|
266 |
/**
|
267 |
-
*
|
|
|
|
|
|
|
|
|
268 |
*/
|
269 |
-
public function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
{
|
271 |
$this->bootstrap = $bootstrap;
|
272 |
}
|
273 |
|
274 |
/**
|
275 |
-
* @param
|
276 |
*/
|
277 |
-
public function setForms(
|
278 |
{
|
279 |
$this->forms = $forms;
|
280 |
}
|
281 |
|
282 |
/**
|
283 |
-
*
|
284 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
285 |
*/
|
286 |
public function registerPage($class_name, $file_path)
|
287 |
{
|
|
|
|
|
|
|
288 |
|
289 |
if( !file_exists($file_path) ) {
|
290 |
throw new Exception('The page file was not found by the path {' . $file_path . '} you set.');
|
@@ -296,11 +245,11 @@
|
|
296 |
throw new Exception('A class with this name {' . $class_name . '} does not exist.');
|
297 |
}
|
298 |
|
299 |
-
if( !class_exists('
|
300 |
-
throw new Exception('The
|
301 |
}
|
302 |
|
303 |
-
|
304 |
}
|
305 |
|
306 |
/**
|
@@ -340,7 +289,7 @@
|
|
340 |
$this->loadModule($module);
|
341 |
}
|
342 |
|
343 |
-
do_action('
|
344 |
}
|
345 |
|
346 |
/**
|
@@ -395,7 +344,7 @@
|
|
395 |
*
|
396 |
* @since 3.2.0
|
397 |
* @param array $module - массив с информацией о загружаемом модуле,
|
398 |
-
* пример array('libs/factory/bootstrap', '
|
399 |
* $module[0] - относительный путь к директории модуля
|
400 |
* $module[1] - идентификатор модуля с префиксом 000
|
401 |
* $module[2] - область применения,
|
@@ -406,9 +355,7 @@
|
|
406 |
*/
|
407 |
protected function loadModule($module)
|
408 |
{
|
409 |
-
$scope = isset($module[2])
|
410 |
-
? $module[2]
|
411 |
-
: 'all';
|
412 |
|
413 |
if( $scope == 'all' || (is_admin() && $scope == 'admin') || (!is_admin() && $scope == 'public') ) {
|
414 |
|
@@ -442,12 +389,8 @@
|
|
442 |
{
|
443 |
add_action('init', array($this, 'checkPluginVersioninDatabase'));
|
444 |
|
445 |
-
if(
|
446 |
-
|
447 |
-
/*add_action('wbcr_factory_406_core_modules_loaded-' . $this->plugin_name, array(
|
448 |
-
$this,
|
449 |
-
'modulesLoaded'
|
450 |
-
));*/
|
451 |
}
|
452 |
}
|
453 |
|
@@ -464,7 +407,7 @@
|
|
464 |
{
|
465 |
|
466 |
// checks whether the plugin needs to run updates.
|
467 |
-
if(
|
468 |
$plugin_version = $this->getPluginVersionFromDatabase();
|
469 |
|
470 |
if( $plugin_version != $this->plugin_build . '-' . $this->plugin_version ) {
|
@@ -479,12 +422,16 @@
|
|
479 |
* @since 1.0.0
|
480 |
* @return string|null The plugin version registered in the database.
|
481 |
*/
|
|
|
482 |
public function getPluginVersionFromDatabase()
|
483 |
{
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
|
|
|
|
|
|
488 |
|
489 |
return $plugin_version;
|
490 |
}
|
@@ -495,27 +442,25 @@
|
|
495 |
* @since 1.0.0
|
496 |
* @return void
|
497 |
*/
|
|
|
|
|
498 |
public function updatePluginVersionInDatabase()
|
499 |
{
|
500 |
-
|
|
|
|
|
|
|
|
|
|
|
501 |
$plugin_versions[$this->plugin_name] = $this->plugin_build . '-' . $this->plugin_version;
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
* Calls on the hook "admin_init".
|
509 |
-
*
|
510 |
-
* @since 1.0.0
|
511 |
-
* @return void
|
512 |
-
*/
|
513 |
-
public function customizePluginRow()
|
514 |
-
{
|
515 |
-
remove_action("after_plugin_row_" . $this->relative_path, 'wp_plugin_update_row');
|
516 |
-
add_action("after_plugin_row_" . $this->relative_path, array($this, 'showCustomPluginRow'), 10, 2);
|
517 |
}
|
518 |
-
|
519 |
public function activate()
|
520 |
{
|
521 |
$this->forceActivationHook();
|
@@ -548,7 +493,7 @@
|
|
548 |
{
|
549 |
|
550 |
$db_version = $this->getPluginVersionFromDatabase();
|
551 |
-
do_action('
|
552 |
|
553 |
// there are not any previous version of the plugin in the past
|
554 |
if( !$db_version ) {
|
@@ -597,7 +542,7 @@
|
|
597 |
*/
|
598 |
public function activationHook()
|
599 |
{
|
600 |
-
$cancelled = apply_filters('
|
601 |
|
602 |
if( $cancelled ) {
|
603 |
return;
|
@@ -610,14 +555,14 @@
|
|
610 |
}
|
611 |
}
|
612 |
|
613 |
-
do_action('
|
614 |
-
do_action('
|
615 |
-
|
616 |
// just time to know when the plugin was activated the first time
|
617 |
-
$activated = $this->
|
618 |
-
|
619 |
if( !$activated ) {
|
620 |
-
$this->
|
621 |
}
|
622 |
}
|
623 |
|
@@ -629,14 +574,14 @@
|
|
629 |
*/
|
630 |
public function deactivationHook()
|
631 |
{
|
632 |
-
$cancelled = apply_filters('
|
633 |
|
634 |
if( $cancelled ) {
|
635 |
return;
|
636 |
}
|
637 |
|
638 |
-
do_action('
|
639 |
-
do_action('
|
640 |
|
641 |
if( !empty($this->activator_class) ) {
|
642 |
foreach((array)$this->activator_class as $activator_class) {
|
@@ -679,7 +624,6 @@
|
|
679 |
*/
|
680 |
public function updateHook($old, $new)
|
681 |
{
|
682 |
-
|
683 |
// converts versions like 0.0.0 to 000000
|
684 |
$old_number = $this->getVersionNumber($old);
|
685 |
$new_number = $this->getVersionNumber($new);
|
@@ -698,8 +642,8 @@
|
|
698 |
}
|
699 |
|
700 |
$item_number = intval($item['name']);
|
|
|
701 |
if( $item_number > $old_number && $item_number <= $new_number ) {
|
702 |
-
|
703 |
$classes = $this->getClasses($item['path']);
|
704 |
if( count($classes) == 0 ) {
|
705 |
return;
|
@@ -714,13 +658,6 @@
|
|
714 |
}
|
715 |
}
|
716 |
}
|
717 |
-
|
718 |
-
// just time to know when the plugin was activated the first time
|
719 |
-
$activated = $this->getOption('factory_406_plugin_activated_' . $this->plugin_name, 0);
|
720 |
-
|
721 |
-
if( !$activated ) {
|
722 |
-
$this->updateOption('factory_406_plugin_activated_' . $this->plugin_name, time());
|
723 |
-
}
|
724 |
}
|
725 |
|
726 |
/**
|
@@ -738,65 +675,13 @@
|
|
738 |
}
|
739 |
|
740 |
$number = '';
|
741 |
-
$number .= (strlen($matches[1]) == 1)
|
742 |
-
|
743 |
-
|
744 |
-
$number .= (strlen($matches[2]) == 1)
|
745 |
-
? '0' . $matches[2]
|
746 |
-
: $matches[2];
|
747 |
-
$number .= (strlen($matches[3]) == 1)
|
748 |
-
? '0' . $matches[3]
|
749 |
-
: $matches[3];
|
750 |
|
751 |
return intval($number);
|
752 |
}
|
753 |
-
|
754 |
-
/**
|
755 |
-
* Forces modules.
|
756 |
-
*
|
757 |
-
* @since 1.0.0
|
758 |
-
* @return void
|
759 |
-
*/
|
760 |
-
//public function modulesLoaded()
|
761 |
-
//{
|
762 |
-
// factory_core_000_modules_loaded( $this );
|
763 |
-
//}
|
764 |
-
|
765 |
-
// ----------------------------------------------------------------------
|
766 |
-
// Plugin row on plugins.php page
|
767 |
-
// ----------------------------------------------------------------------
|
768 |
-
|
769 |
-
public function showCustomPluginRow($file, $plugin_data)
|
770 |
-
{
|
771 |
-
if( !is_network_admin() && is_multisite() ) {
|
772 |
-
return;
|
773 |
-
}
|
774 |
-
|
775 |
-
$messages = apply_filters('wbcr_factory_406_plugin_row_' . $this->plugin_name, array(), $file, $plugin_data);
|
776 |
-
|
777 |
-
// if nothign to show then, use default handle
|
778 |
-
/*if( count($messages) == 0 ) {
|
779 |
-
wp_plugin_update_row($file, $plugin_data);
|
780 |
|
781 |
-
return;
|
782 |
-
}*/
|
783 |
-
|
784 |
-
if( empty($messages) ) {
|
785 |
-
return;
|
786 |
-
}
|
787 |
-
|
788 |
-
$wp_list_table = _get_list_table('WP_Plugins_List_Table');
|
789 |
-
|
790 |
-
foreach($messages as $message) {
|
791 |
-
echo '<tr class="plugin-update-tr active">';
|
792 |
-
echo '<td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange">';
|
793 |
-
echo '<div class="update-message notice inline notice-error notice-alt">';
|
794 |
-
echo '<p>' . $message . '</p>';
|
795 |
-
echo '</div>';
|
796 |
-
echo '</td></tr>';
|
797 |
-
}
|
798 |
-
}
|
799 |
-
|
800 |
// ----------------------------------------------------------------------
|
801 |
// Finding files
|
802 |
// ----------------------------------------------------------------------
|
@@ -845,9 +730,7 @@
|
|
845 |
if( ($areFiles && is_file($filename)) || (!$areFiles && is_dir($filename)) ) {
|
846 |
$files[] = array(
|
847 |
'path' => str_replace("\\", "/", $filename),
|
848 |
-
'name' => $areFiles
|
849 |
-
? str_replace('.php', '', $entryName)
|
850 |
-
: $entryName
|
851 |
);
|
852 |
}
|
853 |
}
|
@@ -902,12 +785,12 @@
|
|
902 |
|
903 |
public function newScriptList()
|
904 |
{
|
905 |
-
return new
|
906 |
}
|
907 |
|
908 |
public function newStyleList()
|
909 |
{
|
910 |
-
return new
|
911 |
}
|
912 |
}
|
913 |
}
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_Factory409_Plugin') ) {
|
18 |
|
19 |
+
abstract class Wbcr_Factory409_Plugin extends Wbcr_Factory409_Base {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
21 |
/**
|
22 |
* The Bootstrap Manager class.n.
|
23 |
*
|
24 |
+
* @var Wbcr_FactoryBootstrap409_Manager
|
25 |
*/
|
26 |
public $bootstrap;
|
27 |
|
28 |
/**
|
29 |
* The Bootstrap Manager class.n.
|
30 |
*
|
31 |
+
* @var Wbcr_FactoryForms410_Manager
|
32 |
*/
|
33 |
public $forms;
|
34 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
/**
|
36 |
* A class name of an activator to activate the plugin.
|
37 |
*
|
49 |
/**
|
50 |
* Подключенные компоненнты плагина
|
51 |
*
|
52 |
+
* @var array[] Wbcr_Factory409_Plugin
|
53 |
*/
|
54 |
private $plugin_addons;
|
55 |
|
72 |
|
73 |
parent::__construct($plugin_path, $data);
|
74 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
if( empty($this->updates) && file_exists($this->plugin_root . '/updates') ) {
|
76 |
$this->updates = $this->plugin_root . '/updates';
|
77 |
}
|
172 |
}
|
173 |
|
174 |
/**
|
175 |
+
* Возвращает ссылку на внутреннюю страницу плагина
|
176 |
+
*
|
177 |
+
* @param string $page_id
|
178 |
+
* @sicne: 4.0.8
|
179 |
+
* @return string|void
|
180 |
*/
|
181 |
+
public function getPluginPageUrl($page_id, $args = array())
|
182 |
+
{
|
183 |
+
if( !class_exists('Wbcr_FactoryPages410') ) {
|
184 |
+
throw new Exception('The factory_pages_410 module is not included.');
|
185 |
+
}
|
186 |
+
|
187 |
+
if( !is_admin() ) {
|
188 |
+
_doing_it_wrong(__METHOD__, __('You cannot use this feature on the frontend.'), '4.0.8');
|
189 |
+
|
190 |
+
return null;
|
191 |
+
}
|
192 |
+
|
193 |
+
return Wbcr_FactoryPages410::getPageUrl($this, $page_id, $args);
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* @param Wbcr_FactoryBootstrap409_Manager $bootstrap
|
198 |
+
*/
|
199 |
+
public function setBootstap(Wbcr_FactoryBootstrap409_Manager $bootstrap)
|
200 |
{
|
201 |
$this->bootstrap = $bootstrap;
|
202 |
}
|
203 |
|
204 |
/**
|
205 |
+
* @param Wbcr_FactoryForms410_Manager $forms
|
206 |
*/
|
207 |
+
public function setForms(Wbcr_FactoryForms410_Manager $forms)
|
208 |
{
|
209 |
$this->forms = $forms;
|
210 |
}
|
211 |
|
212 |
/**
|
213 |
+
* Устанавливает текстовый домен для плагина
|
214 |
+
*/
|
215 |
+
public function setTextDomain($domain, $plugin_dir)
|
216 |
+
{
|
217 |
+
$locale = apply_filters('plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain);
|
218 |
+
|
219 |
+
$mofile = $domain . '-' . $locale . '.mo';
|
220 |
+
|
221 |
+
if( !load_textdomain($domain, $plugin_dir . '/languages/' . $mofile) ) {
|
222 |
+
load_muplugin_textdomain($domain);
|
223 |
+
}
|
224 |
+
}
|
225 |
+
|
226 |
+
/**
|
227 |
+
* @param $class_name
|
228 |
+
* @param $file_path
|
229 |
+
*
|
230 |
+
* @throws Exception
|
231 |
*/
|
232 |
public function registerPage($class_name, $file_path)
|
233 |
{
|
234 |
+
if( $this->isNetworkActive() && !is_network_admin() ) {
|
235 |
+
return;
|
236 |
+
}
|
237 |
|
238 |
if( !file_exists($file_path) ) {
|
239 |
throw new Exception('The page file was not found by the path {' . $file_path . '} you set.');
|
245 |
throw new Exception('A class with this name {' . $class_name . '} does not exist.');
|
246 |
}
|
247 |
|
248 |
+
if( !class_exists('Wbcr_FactoryPages410') ) {
|
249 |
+
throw new Exception('The factory_pages_410 module is not included.');
|
250 |
}
|
251 |
|
252 |
+
Wbcr_FactoryPages410::register($this, $class_name);
|
253 |
}
|
254 |
|
255 |
/**
|
289 |
$this->loadModule($module);
|
290 |
}
|
291 |
|
292 |
+
do_action('wbcr_factory_409_core_modules_loaded-' . $this->plugin_name);
|
293 |
}
|
294 |
|
295 |
/**
|
344 |
*
|
345 |
* @since 3.2.0
|
346 |
* @param array $module - массив с информацией о загружаемом модуле,
|
347 |
+
* пример array('libs/factory/bootstrap', 'factory_bootstrap_409', 'admin'),
|
348 |
* $module[0] - относительный путь к директории модуля
|
349 |
* $module[1] - идентификатор модуля с префиксом 000
|
350 |
* $module[2] - область применения,
|
355 |
*/
|
356 |
protected function loadModule($module)
|
357 |
{
|
358 |
+
$scope = isset($module[2]) ? $module[2] : 'all';
|
|
|
|
|
359 |
|
360 |
if( $scope == 'all' || (is_admin() && $scope == 'admin') || (!is_admin() && $scope == 'public') ) {
|
361 |
|
389 |
{
|
390 |
add_action('init', array($this, 'checkPluginVersioninDatabase'));
|
391 |
|
392 |
+
if( is_admin() ) {
|
393 |
+
add_filter('wbcr_factory_409_core_admin_allow_multisite', '__return_true');
|
|
|
|
|
|
|
|
|
394 |
}
|
395 |
}
|
396 |
|
407 |
{
|
408 |
|
409 |
// checks whether the plugin needs to run updates.
|
410 |
+
if( is_admin() ) {
|
411 |
$plugin_version = $this->getPluginVersionFromDatabase();
|
412 |
|
413 |
if( $plugin_version != $this->plugin_build . '-' . $this->plugin_version ) {
|
422 |
* @since 1.0.0
|
423 |
* @return string|null The plugin version registered in the database.
|
424 |
*/
|
425 |
+
//todo: изменить название опции, проверять версию плагинов для компонентов
|
426 |
public function getPluginVersionFromDatabase()
|
427 |
{
|
428 |
+
if( $this->isNetworkActive() ) {
|
429 |
+
$plugin_versions = get_site_option('factory_plugin_versions', array());
|
430 |
+
} else {
|
431 |
+
$plugin_versions = get_option('factory_plugin_versions', array());
|
432 |
+
}
|
433 |
+
|
434 |
+
$plugin_version = isset($plugin_versions[$this->plugin_name]) ? $plugin_versions[$this->plugin_name] : null;
|
435 |
|
436 |
return $plugin_version;
|
437 |
}
|
442 |
* @since 1.0.0
|
443 |
* @return void
|
444 |
*/
|
445 |
+
|
446 |
+
//todo: изменить название опции, проверять версию плагинов для компонентов
|
447 |
public function updatePluginVersionInDatabase()
|
448 |
{
|
449 |
+
if( $this->isNetworkActive() ) {
|
450 |
+
$plugin_versions = get_site_option('factory_plugin_versions', array());
|
451 |
+
} else {
|
452 |
+
$plugin_versions = get_option('factory_plugin_versions', array());
|
453 |
+
}
|
454 |
+
|
455 |
$plugin_versions[$this->plugin_name] = $this->plugin_build . '-' . $this->plugin_version;
|
456 |
+
|
457 |
+
if( $this->isNetworkActive() ) {
|
458 |
+
update_site_option('factory_plugin_versions', $plugin_versions);
|
459 |
+
} else {
|
460 |
+
update_option('factory_plugin_versions', $plugin_versions);
|
461 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
462 |
}
|
463 |
+
|
464 |
public function activate()
|
465 |
{
|
466 |
$this->forceActivationHook();
|
493 |
{
|
494 |
|
495 |
$db_version = $this->getPluginVersionFromDatabase();
|
496 |
+
do_action('wbcr_factory_409_plugin_activation_or_update_' . $this->plugin_name, $force_activation, $db_version, $this);
|
497 |
|
498 |
// there are not any previous version of the plugin in the past
|
499 |
if( !$db_version ) {
|
542 |
*/
|
543 |
public function activationHook()
|
544 |
{
|
545 |
+
$cancelled = apply_filters('wbcr_factory_409_cancel_plugin_activation_' . $this->plugin_name, false);
|
546 |
|
547 |
if( $cancelled ) {
|
548 |
return;
|
555 |
}
|
556 |
}
|
557 |
|
558 |
+
do_action('wbcr_factory_409_plugin_activation', $this);
|
559 |
+
do_action('wbcr_factory_409_plugin_activation_' . $this->plugin_name, $this);
|
560 |
+
|
561 |
// just time to know when the plugin was activated the first time
|
562 |
+
$activated = $this->getPopulateOption('plugin_activated', 0);
|
563 |
+
|
564 |
if( !$activated ) {
|
565 |
+
$this->updatePopulateOption('plugin_activated', time());
|
566 |
}
|
567 |
}
|
568 |
|
574 |
*/
|
575 |
public function deactivationHook()
|
576 |
{
|
577 |
+
$cancelled = apply_filters('wbcr_factory_409_cancel_plugin_deactivation_' . $this->plugin_name, false);
|
578 |
|
579 |
if( $cancelled ) {
|
580 |
return;
|
581 |
}
|
582 |
|
583 |
+
do_action('wbcr_factory_409_plugin_deactivation', $this);
|
584 |
+
do_action('wbcr_factory_409_plugin_deactivation_' . $this->plugin_name, $this);
|
585 |
|
586 |
if( !empty($this->activator_class) ) {
|
587 |
foreach((array)$this->activator_class as $activator_class) {
|
624 |
*/
|
625 |
public function updateHook($old, $new)
|
626 |
{
|
|
|
627 |
// converts versions like 0.0.0 to 000000
|
628 |
$old_number = $this->getVersionNumber($old);
|
629 |
$new_number = $this->getVersionNumber($new);
|
642 |
}
|
643 |
|
644 |
$item_number = intval($item['name']);
|
645 |
+
|
646 |
if( $item_number > $old_number && $item_number <= $new_number ) {
|
|
|
647 |
$classes = $this->getClasses($item['path']);
|
648 |
if( count($classes) == 0 ) {
|
649 |
return;
|
658 |
}
|
659 |
}
|
660 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
661 |
}
|
662 |
|
663 |
/**
|
675 |
}
|
676 |
|
677 |
$number = '';
|
678 |
+
$number .= (strlen($matches[1]) == 1) ? '0' . $matches[1] : $matches[1];
|
679 |
+
$number .= (strlen($matches[2]) == 1) ? '0' . $matches[2] : $matches[2];
|
680 |
+
$number .= (strlen($matches[3]) == 1) ? '0' . $matches[3] : $matches[3];
|
|
|
|
|
|
|
|
|
|
|
|
|
681 |
|
682 |
return intval($number);
|
683 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
684 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
685 |
// ----------------------------------------------------------------------
|
686 |
// Finding files
|
687 |
// ----------------------------------------------------------------------
|
730 |
if( ($areFiles && is_file($filename)) || (!$areFiles && is_dir($filename)) ) {
|
731 |
$files[] = array(
|
732 |
'path' => str_replace("\\", "/", $filename),
|
733 |
+
'name' => $areFiles ? str_replace('.php', '', $entryName) : $entryName
|
|
|
|
|
734 |
);
|
735 |
}
|
736 |
}
|
785 |
|
786 |
public function newScriptList()
|
787 |
{
|
788 |
+
return new Wbcr_Factory409_ScriptList($this);
|
789 |
}
|
790 |
|
791 |
public function newStyleList()
|
792 |
{
|
793 |
+
return new Wbcr_Factory409_StyleList($this);
|
794 |
}
|
795 |
}
|
796 |
}
|
libs/factory/core/includes/request.class.php
CHANGED
@@ -4,8 +4,8 @@
|
|
4 |
exit;
|
5 |
}
|
6 |
|
7 |
-
if( !class_exists('
|
8 |
-
class
|
9 |
|
10 |
/**
|
11 |
* @param null $param
|
@@ -42,22 +42,40 @@
|
|
42 |
if( !empty($param) ) {
|
43 |
if( isset($method[$param]) && !empty($method[$param]) ) {
|
44 |
if( is_array($method[$param]) ) {
|
45 |
-
return !empty($sanitize)
|
46 |
-
? array_map($sanitize_function_name, $method[$param])
|
47 |
-
: $method[$param];
|
48 |
} else {
|
49 |
-
return !empty($sanitize)
|
50 |
-
? call_user_func($sanitize_function_name, $method[$param])
|
51 |
-
: $method[$param];
|
52 |
}
|
53 |
}
|
54 |
|
55 |
return $default;
|
56 |
}
|
57 |
|
58 |
-
return !empty($sanitize)
|
59 |
-
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
}
|
62 |
|
63 |
/**
|
4 |
exit;
|
5 |
}
|
6 |
|
7 |
+
if( !class_exists('Wbcr_Factory409_Request') ) {
|
8 |
+
class Wbcr_Factory409_Request {
|
9 |
|
10 |
/**
|
11 |
* @param null $param
|
42 |
if( !empty($param) ) {
|
43 |
if( isset($method[$param]) && !empty($method[$param]) ) {
|
44 |
if( is_array($method[$param]) ) {
|
45 |
+
return !empty($sanitize) ? $this->recursiveArrayMap($sanitize_function_name, $method[$param]) : $method[$param];
|
|
|
|
|
46 |
} else {
|
47 |
+
return !empty($sanitize) ? call_user_func($sanitize_function_name, $method[$param]) : $method[$param];
|
|
|
|
|
48 |
}
|
49 |
}
|
50 |
|
51 |
return $default;
|
52 |
}
|
53 |
|
54 |
+
return !empty($sanitize) ? array_map($sanitize_function_name, $method) : $method;
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Recursive sanitation for an array
|
59 |
+
*
|
60 |
+
* @param string $function_name
|
61 |
+
* @param $array
|
62 |
+
* @return mixed
|
63 |
+
*/
|
64 |
+
public function recursiveArrayMap($function_name, $array)
|
65 |
+
{
|
66 |
+
foreach($array as $key => &$value) {
|
67 |
+
if( is_array($value) ) {
|
68 |
+
$value = $this->recursiveArrayMap($function_name, $value);
|
69 |
+
} else {
|
70 |
+
if( !function_exists($function_name) ) {
|
71 |
+
throw new Exception('Function ' . $function_name . 'is undefined.');
|
72 |
+
}
|
73 |
+
|
74 |
+
$value = $function_name($value);
|
75 |
+
}
|
76 |
+
}
|
77 |
+
|
78 |
+
return $array;
|
79 |
}
|
80 |
|
81 |
/**
|
libs/factory/core/index.php
ADDED
File without changes
|
libs/factory/core/langs/index.php
ADDED
File without changes
|
libs/factory/core/langs/wbcr_factory_409-ru_RU.mo
ADDED
Binary file
|
libs/factory/core/langs/wbcr_factory_409-ru_RU.po
ADDED
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: factory_forms\n"
|
4 |
+
"POT-Creation-Date: 2018-10-16 22:44+0300\n"
|
5 |
+
"PO-Revision-Date: 2018-10-16 22:45+0300\n"
|
6 |
+
"Last-Translator: \n"
|
7 |
+
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
+
"Language: ru_RU\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 2.1.1\n"
|
13 |
+
"X-Poedit-Basepath: ..\n"
|
14 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
+
"X-Poedit-SearchPath-0: .\n"
|
19 |
+
|
20 |
+
#: includes/check-compatibility.php:80
|
21 |
+
msgid "warning"
|
22 |
+
msgstr "предупреждение"
|
23 |
+
|
24 |
+
#: includes/check-compatibility.php:82
|
25 |
+
#, php-format
|
26 |
+
msgid "The %s plugin has stopped."
|
27 |
+
msgstr "Работа плагина %s была остановлена."
|
28 |
+
|
29 |
+
#: includes/check-compatibility.php:83
|
30 |
+
msgid "Possible reasons:"
|
31 |
+
msgstr "Возможные причины:"
|
32 |
+
|
33 |
+
#: includes/check-compatibility.php:89
|
34 |
+
#, php-format
|
35 |
+
msgid "You need to update the PHP version to %s or higher!"
|
36 |
+
msgstr "Вам нужно обновить версию PHP до %s или выше!"
|
37 |
+
|
38 |
+
#: includes/check-compatibility.php:94
|
39 |
+
#, php-format
|
40 |
+
msgid "You need to update WordPress to %s or higher!"
|
41 |
+
msgstr "Вам нужно обновить WordPress до %s или выше!"
|
42 |
+
|
43 |
+
#: includes/functions.php:132
|
44 |
+
#, php-format
|
45 |
+
msgid ""
|
46 |
+
"%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead."
|
47 |
+
msgstr ""
|
48 |
+
"%1$s является <strong>устаревшим,</strong> начиная с версии %2$s в "
|
49 |
+
"Wordpress! Используйте %3$s."
|
50 |
+
|
51 |
+
#: includes/functions.php:134
|
52 |
+
#, php-format
|
53 |
+
msgid ""
|
54 |
+
"%1$s is <strong>deprecated</strong> since version %2$s with no alternative "
|
55 |
+
"available."
|
56 |
+
msgstr ""
|
57 |
+
"%1$s был вызван с параметром, который является <strong>устаревшими</strong> "
|
58 |
+
"начиная с версии %2$s , в настоящее время доступных альтернатив нет."
|
59 |
+
|
60 |
+
#: includes/plugin.class.php:202 includes/plugin.class.php:237
|
61 |
+
msgid ""
|
62 |
+
"You are trying to call this earlier than the plugin menu will be registered."
|
63 |
+
msgstr ""
|
64 |
+
"Вы пытаетесь вызвать это раньше, чем будет зарегистрировано меню плагина."
|
65 |
+
|
66 |
+
#: includes/plugin.class.php:220
|
67 |
+
msgid ""
|
68 |
+
"You are trying to get a link to a page that does not have multisite mode. "
|
69 |
+
"Clicking this link will lead the user to a non-existent page."
|
70 |
+
msgstr ""
|
71 |
+
"Вы пытаетесь получить ссылку на страницу, которая не имеет "
|
72 |
+
"многопользовательского режима. Щелчок по этой ссылке приведет пользователя "
|
73 |
+
"к несуществующей странице."
|
74 |
+
|
75 |
+
#: includes/plugin.class.php:222
|
76 |
+
msgid ""
|
77 |
+
"Trying to get a link to an unregistered page. You are trying to call this "
|
78 |
+
"earlier than the plugin menu will be registered."
|
79 |
+
msgstr ""
|
80 |
+
"Попытка получить ссылку на незарегистрированную страницу. Вы пытаетесь "
|
81 |
+
"вызвать это раньше, чем будет зарегистрировано меню плагина."
|
82 |
+
|
83 |
+
#~ msgid "On"
|
84 |
+
#~ msgstr "Вкл"
|
85 |
+
|
86 |
+
#~ msgid "Off"
|
87 |
+
#~ msgstr "Выкл"
|
88 |
+
|
89 |
+
#~ msgid "(use default website font)"
|
90 |
+
#~ msgstr "(шрифт сайта по умолчанию)"
|
91 |
+
|
92 |
+
#~ msgid "Sans Serif:"
|
93 |
+
#~ msgstr "Группа Sans Serif:"
|
94 |
+
|
95 |
+
#~ msgid "Serif:"
|
96 |
+
#~ msgstr "Группа Serif:"
|
97 |
+
|
98 |
+
#~ msgid "Monospaced:"
|
99 |
+
#~ msgstr "Группа Monospaced:"
|
100 |
+
|
101 |
+
#~ msgid "vertical"
|
102 |
+
#~ msgstr "вертикальный"
|
103 |
+
|
104 |
+
#~ msgid "horizontal"
|
105 |
+
#~ msgstr "горизонтальный"
|
106 |
+
|
107 |
+
#~ msgid "hide extra options"
|
108 |
+
#~ msgstr "скрыть дополнительные настроки"
|
109 |
+
|
110 |
+
#~ msgid "Select a side and move the slider to set up:"
|
111 |
+
#~ msgstr "Выберите сторону и переместите ползунок:"
|
112 |
+
|
113 |
+
#~ msgid "Change color"
|
114 |
+
#~ msgstr "Выбрать цвет"
|
115 |
+
|
116 |
+
#~ msgid "re-color"
|
117 |
+
#~ msgstr "Перекрасить"
|
118 |
+
|
119 |
+
#~ msgid "Select color:"
|
120 |
+
#~ msgstr "Выберите цвет:"
|
121 |
+
|
122 |
+
#~ msgid "Changing the color may takes a minute or more. Please be patient."
|
123 |
+
#~ msgstr ""
|
124 |
+
#~ "В некоторых случаях изменение цвета может занять около минуты. "
|
125 |
+
#~ "Пожалуйста, будьте терпеливы."
|
126 |
+
|
127 |
+
#~ msgid "Upload Pattern"
|
128 |
+
#~ msgstr "Добавить шаблон"
|
libs/factory/forms/assets/css/index.php
ADDED
File without changes
|
libs/factory/forms/assets/index.php
ADDED
File without changes
|
libs/factory/forms/boot.php
CHANGED
@@ -22,172 +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 |
// absolute path and URL to the files and resources of the module.
|
32 |
-
define('
|
33 |
-
define('
|
34 |
|
35 |
#comp merge
|
36 |
-
require_once(
|
37 |
-
require_once(
|
38 |
-
require_once(
|
39 |
|
40 |
-
require_once(
|
41 |
#endcomp
|
42 |
|
43 |
-
load_plugin_textdomain('
|
44 |
|
45 |
/**
|
46 |
* We add this code into the hook because all these controls quite heavy. So in order to get better perfomance,
|
47 |
* we load the form controls only on pages where the forms are created.
|
48 |
*
|
49 |
-
* @see the '
|
50 |
*
|
51 |
* @since 3.0.7
|
52 |
*/
|
53 |
-
if( !function_exists('
|
54 |
|
55 |
/**
|
56 |
-
* @param
|
57 |
* @throws Exception
|
58 |
*/
|
59 |
-
function
|
60 |
{
|
61 |
|
62 |
if( $plugin && !isset($plugin->forms) ) {
|
63 |
throw new Exception("The module Factory Forms is not loaded for the plugin '{$plugin->getPluginName()}'.");
|
64 |
}
|
65 |
|
66 |
-
require_once(
|
67 |
-
require_once(
|
68 |
-
require_once(
|
69 |
-
require_once(
|
70 |
-
require_once(
|
71 |
-
require_once(
|
72 |
-
require_once(
|
73 |
-
require_once(
|
74 |
|
75 |
// registration of controls
|
76 |
$plugin->forms->registerControls(array(
|
77 |
array(
|
78 |
'type' => 'checkbox',
|
79 |
-
'class' => '
|
80 |
-
'include' =>
|
81 |
),
|
82 |
array(
|
83 |
'type' => 'list',
|
84 |
-
'class' => '
|
85 |
-
'include' =>
|
86 |
),
|
87 |
array(
|
88 |
'type' => 'dropdown',
|
89 |
-
'class' => '
|
90 |
-
'include' =>
|
91 |
),
|
92 |
array(
|
93 |
'type' => 'dropdown-and-colors',
|
94 |
-
'class' => '
|
95 |
-
'include' =>
|
96 |
),
|
97 |
array(
|
98 |
'type' => 'hidden',
|
99 |
-
'class' => '
|
100 |
-
'include' =>
|
101 |
),
|
102 |
array(
|
103 |
'type' => 'hidden',
|
104 |
-
'class' => '
|
105 |
-
'include' =>
|
106 |
),
|
107 |
array(
|
108 |
'type' => 'radio',
|
109 |
-
'class' => '
|
110 |
-
'include' =>
|
111 |
),
|
112 |
array(
|
113 |
'type' => 'radio-colors',
|
114 |
-
'class' => '
|
115 |
-
'include' =>
|
116 |
),
|
117 |
array(
|
118 |
'type' => 'textarea',
|
119 |
-
'class' => '
|
120 |
-
'include' =>
|
121 |
),
|
122 |
array(
|
123 |
'type' => 'textbox',
|
124 |
-
'class' => '
|
125 |
-
'include' =>
|
126 |
),
|
127 |
array(
|
128 |
'type' => 'multiple-textbox',
|
129 |
-
'class' => '
|
130 |
-
'include' =>
|
131 |
),
|
132 |
array(
|
133 |
'type' => 'datetimepicker-range',
|
134 |
-
'class' => '
|
135 |
-
'include' =>
|
136 |
),
|
137 |
array(
|
138 |
'type' => 'url',
|
139 |
-
'class' => '
|
140 |
-
'include' =>
|
141 |
),
|
142 |
array(
|
143 |
'type' => 'wp-editor',
|
144 |
-
'class' => '
|
145 |
-
'include' =>
|
146 |
),
|
147 |
array(
|
148 |
'type' => 'color',
|
149 |
-
'class' => '
|
150 |
-
'include' =>
|
151 |
),
|
152 |
array(
|
153 |
'type' => 'color-and-opacity',
|
154 |
-
'class' => '
|
155 |
-
'include' =>
|
156 |
),
|
157 |
array(
|
158 |
'type' => 'gradient',
|
159 |
-
'class' => '
|
160 |
-
'include' =>
|
161 |
),
|
162 |
array(
|
163 |
'type' => 'font',
|
164 |
-
'class' => '
|
165 |
-
'include' =>
|
166 |
),
|
167 |
array(
|
168 |
'type' => 'google-font',
|
169 |
-
'class' => '
|
170 |
-
'include' =>
|
171 |
),
|
172 |
array(
|
173 |
'type' => 'pattern',
|
174 |
-
'class' => '
|
175 |
-
'include' =>
|
176 |
),
|
177 |
array(
|
178 |
'type' => 'integer',
|
179 |
-
'class' => '
|
180 |
-
'include' =>
|
181 |
),
|
182 |
array(
|
183 |
'type' => 'control-group',
|
184 |
-
'class' => '
|
185 |
-
'include' =>
|
186 |
),
|
187 |
array(
|
188 |
'type' => 'paddings-editor',
|
189 |
-
'class' => '
|
190 |
-
'include' =>
|
191 |
),
|
192 |
));
|
193 |
|
@@ -195,53 +197,53 @@
|
|
195 |
$plugin->forms->registerHolders(array(
|
196 |
array(
|
197 |
'type' => 'tab',
|
198 |
-
'class' => '
|
199 |
-
'include' =>
|
200 |
),
|
201 |
array(
|
202 |
'type' => 'tab-item',
|
203 |
-
'class' => '
|
204 |
-
'include' =>
|
205 |
),
|
206 |
array(
|
207 |
'type' => 'accordion',
|
208 |
-
'class' => '
|
209 |
-
'include' =>
|
210 |
),
|
211 |
array(
|
212 |
'type' => 'accordion-item',
|
213 |
-
'class' => '
|
214 |
-
'include' =>
|
215 |
),
|
216 |
array(
|
217 |
'type' => 'control-group',
|
218 |
-
'class' => '
|
219 |
-
'include' =>
|
220 |
),
|
221 |
array(
|
222 |
'type' => 'control-group-item',
|
223 |
-
'class' => '
|
224 |
-
'include' =>
|
225 |
),
|
226 |
array(
|
227 |
'type' => 'form-group',
|
228 |
-
'class' => '
|
229 |
-
'include' =>
|
230 |
),
|
231 |
array(
|
232 |
'type' => 'more-link',
|
233 |
-
'class' => '
|
234 |
-
'include' =>
|
235 |
),
|
236 |
array(
|
237 |
'type' => 'div',
|
238 |
-
'class' => '
|
239 |
-
'include' =>
|
240 |
),
|
241 |
array(
|
242 |
'type' => 'columns',
|
243 |
-
'class' => '
|
244 |
-
'include' =>
|
245 |
)
|
246 |
));
|
247 |
|
@@ -249,23 +251,23 @@
|
|
249 |
$plugin->forms->registerCustomElements(array(
|
250 |
array(
|
251 |
'type' => 'html',
|
252 |
-
'class' => '
|
253 |
-
'include' =>
|
254 |
),
|
255 |
array(
|
256 |
'type' => 'separator',
|
257 |
-
'class' => '
|
258 |
-
'include' =>
|
259 |
),
|
260 |
));
|
261 |
|
262 |
// registration of form layouts
|
263 |
$plugin->forms->registerFormLayout(array(
|
264 |
'name' => 'bootstrap-3',
|
265 |
-
'class' => '
|
266 |
-
'include' =>
|
267 |
));
|
268 |
}
|
269 |
|
270 |
-
add_action('
|
271 |
}
|
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_410_LOADED') ) {
|
26 |
return;
|
27 |
}
|
28 |
|
29 |
+
define('FACTORY_FORMS_410_LOADED', true);
|
30 |
+
|
31 |
+
define('FACTORY_FORMS_410_VERSION', '4.1.0');
|
32 |
|
33 |
// absolute path and URL to the files and resources of the module.
|
34 |
+
define('FACTORY_FORMS_410_DIR', dirname(__FILE__));
|
35 |
+
define('FACTORY_FORMS_410_URL', plugins_url(null, __FILE__));
|
36 |
|
37 |
#comp merge
|
38 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/providers/value-provider.interface.php');
|
39 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/providers/meta-value-provider.class.php');
|
40 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/providers/options-value-provider.class.php');
|
41 |
|
42 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/form.class.php');
|
43 |
#endcomp
|
44 |
|
45 |
+
load_plugin_textdomain('wbcr_factory_forms_410', 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_410_register_controls' hook
|
52 |
*
|
53 |
* @since 3.0.7
|
54 |
*/
|
55 |
+
if( !function_exists('wbcr_factory_forms_410_register_default_controls') ) {
|
56 |
|
57 |
/**
|
58 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
59 |
* @throws Exception
|
60 |
*/
|
61 |
+
function wbcr_factory_forms_410_register_default_controls(Wbcr_Factory409_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_410_DIR . '/includes/html-builder.class.php');
|
69 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/form-element.class.php');
|
70 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/control.class.php');
|
71 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/complex-control.class.php');
|
72 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/holder.class.php');
|
73 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/control-holder.class.php');
|
74 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/custom-element.class.php');
|
75 |
+
require_once(FACTORY_FORMS_410_DIR . '/includes/form-layout.class.php');
|
76 |
|
77 |
// registration of controls
|
78 |
$plugin->forms->registerControls(array(
|
79 |
array(
|
80 |
'type' => 'checkbox',
|
81 |
+
'class' => 'Wbcr_FactoryForms410_CheckboxControl',
|
82 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/checkbox.php'
|
83 |
),
|
84 |
array(
|
85 |
'type' => 'list',
|
86 |
+
'class' => 'Wbcr_FactoryForms410_ListControl',
|
87 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/list.php'
|
88 |
),
|
89 |
array(
|
90 |
'type' => 'dropdown',
|
91 |
+
'class' => 'Wbcr_FactoryForms410_DropdownControl',
|
92 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/dropdown.php'
|
93 |
),
|
94 |
array(
|
95 |
'type' => 'dropdown-and-colors',
|
96 |
+
'class' => 'Wbcr_FactoryForms410_DropdownAndColorsControl',
|
97 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/dropdown-and-colors.php'
|
98 |
),
|
99 |
array(
|
100 |
'type' => 'hidden',
|
101 |
+
'class' => 'Wbcr_FactoryForms410_HiddenControl',
|
102 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/hidden.php'
|
103 |
),
|
104 |
array(
|
105 |
'type' => 'hidden',
|
106 |
+
'class' => 'Wbcr_FactoryForms410_HiddenControl',
|
107 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/hidden.php'
|
108 |
),
|
109 |
array(
|
110 |
'type' => 'radio',
|
111 |
+
'class' => 'Wbcr_FactoryForms410_RadioControl',
|
112 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/radio.php'
|
113 |
),
|
114 |
array(
|
115 |
'type' => 'radio-colors',
|
116 |
+
'class' => 'Wbcr_FactoryForms410_RadioColorsControl',
|
117 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/radio-colors.php'
|
118 |
),
|
119 |
array(
|
120 |
'type' => 'textarea',
|
121 |
+
'class' => 'Wbcr_FactoryForms410_TextareaControl',
|
122 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/textarea.php'
|
123 |
),
|
124 |
array(
|
125 |
'type' => 'textbox',
|
126 |
+
'class' => 'Wbcr_FactoryForms410_TextboxControl',
|
127 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/textbox.php'
|
128 |
),
|
129 |
array(
|
130 |
'type' => 'multiple-textbox',
|
131 |
+
'class' => 'Wbcr_FactoryForms410_MultipleTextboxControl',
|
132 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/multiple-textbox.php'
|
133 |
),
|
134 |
array(
|
135 |
'type' => 'datetimepicker-range',
|
136 |
+
'class' => 'Wbcr_FactoryForms410_DatepickerRangeControl',
|
137 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/datepicker-range.php'
|
138 |
),
|
139 |
array(
|
140 |
'type' => 'url',
|
141 |
+
'class' => 'Wbcr_FactoryForms410_UrlControl',
|
142 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/url.php'
|
143 |
),
|
144 |
array(
|
145 |
'type' => 'wp-editor',
|
146 |
+
'class' => 'Wbcr_FactoryForms410_WpEditorControl',
|
147 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/wp-editor.php'
|
148 |
),
|
149 |
array(
|
150 |
'type' => 'color',
|
151 |
+
'class' => 'Wbcr_FactoryForms410_ColorControl',
|
152 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/color.php'
|
153 |
),
|
154 |
array(
|
155 |
'type' => 'color-and-opacity',
|
156 |
+
'class' => 'Wbcr_FactoryForms410_ColorAndOpacityControl',
|
157 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/color-and-opacity.php'
|
158 |
),
|
159 |
array(
|
160 |
'type' => 'gradient',
|
161 |
+
'class' => 'Wbcr_FactoryForms410_GradientControl',
|
162 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/gradient.php'
|
163 |
),
|
164 |
array(
|
165 |
'type' => 'font',
|
166 |
+
'class' => 'Wbcr_FactoryForms410_FontControl',
|
167 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/font.php'
|
168 |
),
|
169 |
array(
|
170 |
'type' => 'google-font',
|
171 |
+
'class' => 'Wbcr_FactoryForms410_GoogleFontControl',
|
172 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/google-font.php'
|
173 |
),
|
174 |
array(
|
175 |
'type' => 'pattern',
|
176 |
+
'class' => 'Wbcr_FactoryForms410_PatternControl',
|
177 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/pattern.php'
|
178 |
),
|
179 |
array(
|
180 |
'type' => 'integer',
|
181 |
+
'class' => 'Wbcr_FactoryForms410_IntegerControl',
|
182 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/integer.php'
|
183 |
),
|
184 |
array(
|
185 |
'type' => 'control-group',
|
186 |
+
'class' => 'Wbcr_FactoryForms410_ControlGroupHolder',
|
187 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/control-group.php'
|
188 |
),
|
189 |
array(
|
190 |
'type' => 'paddings-editor',
|
191 |
+
'class' => 'Wbcr_FactoryForms410_PaddingsEditorControl',
|
192 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/paddings-editor.php'
|
193 |
),
|
194 |
));
|
195 |
|
197 |
$plugin->forms->registerHolders(array(
|
198 |
array(
|
199 |
'type' => 'tab',
|
200 |
+
'class' => 'Wbcr_FactoryForms410_TabHolder',
|
201 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/tab.php'
|
202 |
),
|
203 |
array(
|
204 |
'type' => 'tab-item',
|
205 |
+
'class' => 'Wbcr_FactoryForms410_TabItemHolder',
|
206 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/tab-item.php'
|
207 |
),
|
208 |
array(
|
209 |
'type' => 'accordion',
|
210 |
+
'class' => 'Wbcr_FactoryForms410_AccordionHolder',
|
211 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/accordion.php'
|
212 |
),
|
213 |
array(
|
214 |
'type' => 'accordion-item',
|
215 |
+
'class' => 'Wbcr_FactoryForms410_AccordionItemHolder',
|
216 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/accordion-item.php'
|
217 |
),
|
218 |
array(
|
219 |
'type' => 'control-group',
|
220 |
+
'class' => 'Wbcr_FactoryForms410_ControlGroupHolder',
|
221 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/control-group.php'
|
222 |
),
|
223 |
array(
|
224 |
'type' => 'control-group-item',
|
225 |
+
'class' => 'Wbcr_FactoryForms410_ControlGroupItem',
|
226 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/control-group-item.php'
|
227 |
),
|
228 |
array(
|
229 |
'type' => 'form-group',
|
230 |
+
'class' => 'Wbcr_FactoryForms410_FormGroupHolder',
|
231 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/form-group.php'
|
232 |
),
|
233 |
array(
|
234 |
'type' => 'more-link',
|
235 |
+
'class' => 'Wbcr_FactoryForms410_MoreLinkHolder',
|
236 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/more-link.php'
|
237 |
),
|
238 |
array(
|
239 |
'type' => 'div',
|
240 |
+
'class' => 'Wbcr_FactoryForms410_DivHolder',
|
241 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/div.php'
|
242 |
),
|
243 |
array(
|
244 |
'type' => 'columns',
|
245 |
+
'class' => 'Wbcr_FactoryForms410_ColumnsHolder',
|
246 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/holders/columns.php'
|
247 |
)
|
248 |
));
|
249 |
|
251 |
$plugin->forms->registerCustomElements(array(
|
252 |
array(
|
253 |
'type' => 'html',
|
254 |
+
'class' => 'Wbcr_FactoryForms410_Html',
|
255 |
+
'include' => FACTORY_FORMS_410_DIR . '/controls/customs/html.php',
|
256 |
),
|
257 |
array(
|
258 |
'type' => 'separator',
|
259 |
+
'class' => 'Wbcr_FactoryForms410_Separator',
|
260 |
+
'include' => FACTORY_FORMS_410_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_FactoryForms410_Bootstrap3FormLayout',
|
268 |
+
'include' => FACTORY_FORMS_410_DIR . '/layouts/bootstrap-3/bootstrap-3.php'
|
269 |
));
|
270 |
}
|
271 |
|
272 |
+
add_action('wbcr_factory_forms_410_register_controls', 'wbcr_factory_forms_410_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_FactoryForms410_CheckboxControl') ) {
|
24 |
|
25 |
+
class Wbcr_FactoryForms410_CheckboxControl extends Wbcr_FactoryForms410_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_410') ?></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_410') ?></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_FactoryForms410_ColorAndOpacityControl') ) {
|
24 |
}
|
25 |
|
26 |
+
class Wbcr_FactoryForms410_ColorAndOpacityControl extends Wbcr_FactoryForms410_ComplexControl {
|
27 |
|
28 |
public $type = 'color-and-opacity';
|
29 |
|
57 |
'way' => 'slider'
|
58 |
));
|
59 |
|
60 |
+
$this->color = new Wbcr_FactoryForms410_ColorControl($options['color'], $form, $provider);
|
61 |
+
$this->opacity = new Wbcr_FactoryForms410_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_FactoryForms410_ColorControl') ) {
|
24 |
|
25 |
+
class Wbcr_FactoryForms410_ColorControl extends Wbcr_FactoryForms410_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_FactoryForms410_Html') ) {
|
18 |
|
19 |
+
class Wbcr_FactoryForms410_Html extends Wbcr_FactoryForms410_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_FactoryForms410_Separator') ) {
|
18 |
+
class Wbcr_FactoryForms410_Separator extends Wbcr_FactoryForms410_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_FactoryForms410_DatepickerRangeControl') ) {
|
33 |
|
34 |
+
class Wbcr_FactoryForms410_DatepickerRangeControl extends Wbcr_FactoryForms410_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_FactoryForms410_TextboxControl($options['range_1'], $form, $provider);
|
69 |
+
$this->range_2 = new Wbcr_FactoryForms410_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 FactoryForms410_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 FactoryForms410_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_FactoryForms410_DropdownAndColorsControl') ) {
|
41 |
|
42 |
+
class Wbcr_FactoryForms410_DropdownAndColorsControl extends Wbcr_FactoryForms410_ComplexControl {
|
43 |
|
44 |
public $type = 'dropdown-and-colors';
|
45 |
|
69 |
'name' => $this->options['name'] . '__colors',
|
70 |
));
|
71 |
|
72 |
+
$this->dropdown = new Wbcr_FactoryForms410_DropdownControl($options['dropdown'], $form, $provider);
|
73 |
+
$this->colors = new Wbcr_FactoryForms410_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 |
|
@@ -127,7 +127,7 @@
|
|
127 |
'url': '<?php echo $data['url'] ?>',
|
128 |
'data': <?php echo json_encode( $data['data'] ) ?>,
|
129 |
'selected': '<?php echo $value ?>',
|
130 |
-
'emptyList': '<?php echo $this->getOption('empty', __('The list is empty.', '
|
131 |
};
|
132 |
</script>
|
133 |
<?php
|
@@ -259,7 +259,7 @@
|
|
259 |
}
|
260 |
|
261 |
$isEmpty = $this->isAjax() || empty($items);
|
262 |
-
$emptyList = $this->getOption('empty', __('- empty -', '
|
263 |
|
264 |
?>
|
265 |
|
@@ -334,7 +334,7 @@
|
|
334 |
: '';
|
335 |
$title = isset($item['title'])
|
336 |
? $item['title']
|
337 |
-
: __('- empty -', '
|
338 |
|
339 |
$data = isset($item['data'])
|
340 |
? $item['data']
|
21 |
exit;
|
22 |
}
|
23 |
|
24 |
+
if( !class_exists('Wbcr_FactoryForms410_DropdownControl') ) {
|
25 |
|
26 |
+
class Wbcr_FactoryForms410_DropdownControl extends Wbcr_FactoryForms410_Control {
|
27 |
|
28 |
public $type = 'dropdown';
|
29 |
|
127 |
'url': '<?php echo $data['url'] ?>',
|
128 |
'data': <?php echo json_encode( $data['data'] ) ?>,
|
129 |
'selected': '<?php echo $value ?>',
|
130 |
+
'emptyList': '<?php echo $this->getOption('empty', __('The list is empty.', 'wbcr_factory_forms_410') ) ?>'
|
131 |
};
|
132 |
</script>
|
133 |
<?php
|
259 |
}
|
260 |
|
261 |
$isEmpty = $this->isAjax() || empty($items);
|
262 |
+
$emptyList = $this->getOption('empty', __('- empty -', 'wbcr_factory_forms_410'));
|
263 |
|
264 |
?>
|
265 |
|
334 |
: '';
|
335 |
$title = isset($item['title'])
|
336 |
? $item['title']
|
337 |
+
: __('- empty -', 'wbcr_factory_forms_410');
|
338 |
|
339 |
$data = isset($item['data'])
|
340 |
? $item['data']
|
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_FactoryForms410_FontControl') ) {
|
24 |
|
25 |
+
class Wbcr_FactoryForms410_FontControl extends Wbcr_FactoryForms410_ComplexControl {
|
26 |
|
27 |
public $type = 'font';
|
28 |
|
54 |
'pickerTarget' => '.factory-control-' . $this->options['name'] . ' .factory-picker-target'
|
55 |
);
|
56 |
|
57 |
+
$this->size = new Wbcr_FactoryForms410_IntegerControl($option_font_size, $form, $provider);
|
58 |
+
$this->family = new Wbcr_FactoryForms410_DropdownControl($option_font_family, $form, $provider);
|
59 |
+
$this->color = new Wbcr_FactoryForms410_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_410_fonts', $fonts);
|
70 |
+
$fonts = apply_filters('wbcr_factory_forms_410_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_410')),
|
81 |
array(
|
82 |
'group',
|
83 |
+
__('Sans Serif:', 'wbcr_factory_forms_410'),
|
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_410'),
|
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_410'),
|
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_FactoryForms410_GoogleFontControl extends Wbcr_FactoryForms410_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_FactoryForms410_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_410'))
|
53 |
);
|
54 |
|
55 |
$fontsCommon = array(
|
56 |
'group',
|
57 |
+
__('Standard:', 'wbcr_factory_forms_410'),
|
58 |
array(
|
59 |
|
60 |
array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
|
65 |
)
|
66 |
);
|
67 |
|
68 |
+
$fontsGoogleFonts = array('group', __('Google Fonts:', 'wbcr_factory_forms_410'), 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_410');
|
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_410');
|
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_410');
|
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_FactoryForms410_GradientControl') ) {
|
29 |
+
class Wbcr_FactoryForms410_GradientControl extends Wbcr_FactoryForms410_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_410' ) ?>';
|
70 |
+
factory.res.resHorizontal = '<?php _e( 'horizontal', 'wbcr_factory_forms_410' ) ?>';
|
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_FactoryForms410_HiddenControl') ) {
|
24 |
|
25 |
+
class Wbcr_FactoryForms410_HiddenControl extends Wbcr_FactoryForms410_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_FactoryForms410_AccordionItemHolder') ) {
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
class Wbcr_FactoryForms410_AccordionItemHolder extends Wbcr_FactoryForms410_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_FactoryForms410_AccordionHolder') ) {
|
17 |
/**
|
18 |
* Tab Control Holder
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
+
class Wbcr_FactoryForms410_AccordionHolder extends Wbcr_FactoryForms410_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_FactoryForms410_ColumnsHolder') ) {
|
18 |
/**
|
19 |
* Columns Holder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
class Wbcr_FactoryForms410_ColumnsHolder extends Wbcr_FactoryForms410_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_FactoryForms410_ControlGroupItem') ) {
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
class Wbcr_FactoryForms410_ControlGroupItem extends Wbcr_FactoryForms410_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_FactoryForms410_ControlGroupHolder') ) {
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
class Wbcr_FactoryForms410_ControlGroupHolder extends Wbcr_FactoryForms410_ControlHolder {
|
25 |
|
26 |
/**
|
27 |
* A holder type.
|
61 |
continue;
|
62 |
}
|
63 |
|
64 |
+
$builder = new Wbcr_FactoryForms410_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_FactoryForms410_DivHolder') ) {
|
18 |
/**
|
19 |
* Div Control Holder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
class Wbcr_FactoryForms410_DivHolder extends Wbcr_FactoryForms410_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_FactoryForms410_FormGroupHolder') ) {
|
18 |
/**
|
19 |
* Group Holder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
class Wbcr_FactoryForms410_FormGroupHolder extends Wbcr_FactoryForms410_Holder {
|
24 |
|
25 |
/**
|
26 |
* A holder type.
|
libs/factory/forms/controls/holders/index.php
ADDED
File without changes
|
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_FactoryForms410_MoreLinkHolder') ) {
|
18 |
|
19 |
/**
|
20 |
* Collapsed Group Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
class Wbcr_FactoryForms410_MoreLinkHolder extends Wbcr_FactoryForms410_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_FactoryForms410_TabItemHolder') ) {
|
17 |
/**
|
18 |
* Tab Item Control Holder
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
+
class Wbcr_FactoryForms410_TabItemHolder extends Wbcr_FactoryForms410_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_FactoryForms410_TabHolder') ) {
|
18 |
|
19 |
/**
|
20 |
* Tab Control Holder
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
class Wbcr_FactoryForms410_TabHolder extends Wbcr_FactoryForms410_Holder {
|
25 |
|
26 |
/**
|
27 |
* A holder type.
|
44 |
*
|
45 |
* @since 1.0.0
|
46 |
* @param mixed[] $options A holder options.
|
47 |
+
* @param FactoryForms410_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_FactoryForms410_HtmlAttributeBuilder();
|
92 |
|
93 |
$builder->addCssClass('factory-tab-item-header');
|
94 |
$builder->addCssClass('factory-tab-item-header-' . $element->getName());
|
libs/factory/forms/controls/index.php
ADDED
File without changes
|
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_FactoryForms410_IntegerControl') ) {
|
36 |
|
37 |
+
class Wbcr_FactoryForms410_IntegerControl extends Wbcr_FactoryForms410_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_FactoryForms410_ListControl') ) {
|
25 |
|
26 |
+
class Wbcr_FactoryForms410_ListControl extends Wbcr_FactoryForms410_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_410') ) ?>'
|
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_410'));
|
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_FactoryForms410_MultipleTextboxControl') ) {
|
19 |
|
20 |
+
class Wbcr_FactoryForms410_MultipleTextboxControl extends Wbcr_FactoryForms410_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_410') ?>
|
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_FactoryForms410_PaddingsEditorControl') ) {
|
18 |
|
19 |
+
class Wbcr_FactoryForms410_PaddingsEditorControl extends Wbcr_FactoryForms410_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_410') ?>
|
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_FactoryForms410_PatternControl') ) {
|
19 |
|
20 |
+
class Wbcr_FactoryForms410_PatternControl extends Wbcr_FactoryForms410_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_410_patterns', array());
|
56 |
+
$this->patterns = apply_filters('wbcr_factory_forms_410_patterns-' . $name, $this->patterns);
|
57 |
|
58 |
$this->custom_patterns = $this->getOption('patterns', array());
|
59 |
|
60 |
+
$this->color = new Wbcr_FactoryForms410_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_410') ?>">
|
106 |
<i class="fa fa-flask"></i>
|
107 |
+
<span><?php _e('re-color', 'wbcr_factory_forms_410') ?></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_410') ?></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_410') ?></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_FactoryForms410_RadioColorsControl') ) {
|
31 |
|
32 |
+
class Wbcr_FactoryForms410_RadioColorsControl extends Wbcr_FactoryForms410_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_FactoryForms410_RadioControl') ) {
|
25 |
|
26 |
+
class Wbcr_FactoryForms410_RadioControl extends Wbcr_FactoryForms410_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_FactoryForms410_TextareaControl') ) {
|
24 |
|
25 |
+
class Wbcr_FactoryForms410_TextareaControl extends Wbcr_FactoryForms410_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_FactoryForms410_TextboxControl') ) {
|
33 |
|
34 |
+
class Wbcr_FactoryForms410_TextboxControl extends Wbcr_FactoryForms410_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 FactoryForms410_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_FactoryForms410_UrlControl') ) {
|
22 |
|
23 |
+
class Wbcr_FactoryForms410_UrlControl extends Wbcr_FactoryForms410_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_FactoryForms410_WpEditorControl') ) {
|
26 |
|
27 |
+
class Wbcr_FactoryForms410_WpEditorControl extends Wbcr_FactoryForms410_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_410_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_FactoryForms410_ComplexControl') ) {
|
17 |
/**
|
18 |
* The base class for all controls.
|
19 |
*
|
20 |
* @since 1.0.0
|
21 |
*/
|
22 |
+
abstract class Wbcr_FactoryForms410_ComplexControl extends Wbcr_FactoryForms410_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_FactoryForms410_Control[]
|
37 |
*/
|
38 |
public $inner_controls = array();
|
39 |
|
41 |
* Sets a provider for the control.
|
42 |
*
|
43 |
* @since 1.0.0
|
44 |
+
* @param Wbcr_IFactoryForms410_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_FactoryForms410_ControlHolder') ) {
|
18 |
/**
|
19 |
* The base class for control holders.
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
abstract class Wbcr_FactoryForms410_ControlHolder extends Wbcr_FactoryForms410_Control {
|
24 |
|
25 |
/**
|
26 |
* Holder Elements.
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
+
* @var Wbcr_FactoryForms410_Control[]
|
30 |
*/
|
31 |
protected $elements = array();
|
32 |
|
43 |
*
|
44 |
* @since 1.0.0
|
45 |
* @param mixed[] $options A holder options.
|
46 |
+
* @param Wbcr_FactoryForms410_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_FactoryForms410_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_FactoryForms410_Control') ) {
|
18 |
|
19 |
/**
|
20 |
* The base class for all controls.
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
abstract class Wbcr_FactoryForms410_Control extends Wbcr_FactoryForms410_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_IFactoryForms410_ValueProvider
|
47 |
*/
|
48 |
protected $provider = null;
|
49 |
|
51 |
* Create a new instance of the control.
|
52 |
*
|
53 |
* @param mixed[] $options
|
54 |
+
* @param FactoryForms410_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 IFactoryForms410_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_FactoryForms410_CustomElement') ) {
|
18 |
/**
|
19 |
* The base class for all controls.
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
abstract class Wbcr_FactoryForms410_CustomElement extends Wbcr_FactoryForms410_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_FactoryForms410_FormElement') ) {
|
18 |
|
19 |
/**
|
20 |
* The base class for all form element (controls, holders).
|
23 |
*
|
24 |
* @since 1.0.0
|
25 |
*/
|
26 |
+
abstract class Wbcr_FactoryForms410_FormElement {
|
27 |
|
28 |
/**
|
29 |
* A type of an elemnt.
|
37 |
* An html attribute builder.
|
38 |
*
|
39 |
* @since 1.0.0
|
40 |
+
* @var Wbcr_FactoryForms410_HtmlAttributeBuilder
|
41 |
*/
|
42 |
private $html_builder;
|
43 |
|
53 |
* A parent form.
|
54 |
*
|
55 |
* @since 1.0.0
|
56 |
+
* @var Wbcr_FactoryForms410_Form
|
57 |
*/
|
58 |
protected $form;
|
59 |
|
61 |
* A form layout.
|
62 |
*
|
63 |
* @since 1.0.0
|
64 |
+
* @var Wbcr_FactoryForms410_FormLayout
|
65 |
*/
|
66 |
protected $layout;
|
67 |
|
94 |
*
|
95 |
* @since 1.0.0
|
96 |
* @param mixed[] $options A holder options.
|
97 |
+
* @param Wbcr_FactoryForms410_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_FactoryForms410_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_FactoryForms410_FormLayout') ) {
|
18 |
|
19 |
/**
|
20 |
* The base class for all form layouts.
|
21 |
*/
|
22 |
+
abstract class Wbcr_FactoryForms410_FormLayout extends Wbcr_FactoryForms410_Holder {
|
23 |
|
24 |
/**
|
25 |
* A form layout name.
|
42 |
*
|
43 |
* @since 1.0.0
|
44 |
* @param mixed[] $options A holder options.
|
45 |
+
* @param Wbcr_FactoryForms410_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-410-' . $this->type);
|
56 |
+
$this->addCssClass('factory-forms-410-' . $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,11 +245,10 @@
|
|
245 |
* A current form layout used to render a form.
|
246 |
*
|
247 |
* @since 1.0.0
|
248 |
-
* @var
|
249 |
*/
|
250 |
public $layout;
|
251 |
|
252 |
-
|
253 |
/**
|
254 |
* Creates a new instance of a form.
|
255 |
*
|
@@ -262,28 +261,27 @@
|
|
262 |
*
|
263 |
* @since 1.0.0
|
264 |
* @param array $options
|
265 |
-
* @param
|
266 |
*/
|
267 |
-
public function __construct(array $options = array(),
|
268 |
{
|
269 |
// register controls once, when the first form is created
|
270 |
-
if( !
|
271 |
|
272 |
-
do_action('
|
273 |
|
274 |
//if( !empty($plugin) ) {
|
275 |
-
do_action('
|
276 |
//}
|
277 |
|
278 |
-
|
279 |
}
|
280 |
|
281 |
-
$this->scope = isset($options['scope'])
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
: $this->name;
|
287 |
|
288 |
if( isset($options['formLayout']) ) {
|
289 |
$this->form_layout = $options['formLayout'];
|
@@ -291,14 +289,14 @@
|
|
291 |
$this->form_layout = 'bootstrap-3';
|
292 |
}
|
293 |
|
294 |
-
|
295 |
}
|
296 |
|
297 |
/**
|
298 |
* Sets a provider for the control.
|
299 |
*
|
300 |
* @since 1.0.0
|
301 |
-
* @param
|
302 |
* @return void
|
303 |
*/
|
304 |
public function setProvider($provider)
|
@@ -334,14 +332,14 @@
|
|
334 |
*/
|
335 |
public function getItems()
|
336 |
{
|
337 |
-
return apply_filters('
|
338 |
}
|
339 |
|
340 |
/**
|
341 |
* Returns form controls (control objects).
|
342 |
*
|
343 |
* @since 1.0.0
|
344 |
-
* @return
|
345 |
*/
|
346 |
public function getControls()
|
347 |
{
|
@@ -357,14 +355,12 @@
|
|
357 |
* Builds a form items to the control objects ready to use.
|
358 |
*
|
359 |
* @param null $holder
|
360 |
-
* @return
|
361 |
*/
|
362 |
|
363 |
public function createControls($holder = null)
|
364 |
{
|
365 |
-
$items = ($holder == null)
|
366 |
-
? $this->getItems()
|
367 |
-
: $holder['items'];
|
368 |
|
369 |
foreach($items as $item) {
|
370 |
|
@@ -399,7 +395,7 @@
|
|
399 |
*
|
400 |
* @since 1.0.0
|
401 |
* @param array $item Item data.
|
402 |
-
* @return
|
403 |
*/
|
404 |
public function createElement($item)
|
405 |
{
|
@@ -421,7 +417,7 @@
|
|
421 |
*
|
422 |
* @since 1.0.0
|
423 |
* @param mixed[] $item Data of items.
|
424 |
-
* @return
|
425 |
*/
|
426 |
public function createElements($items = array())
|
427 |
{
|
@@ -437,7 +433,7 @@
|
|
437 |
*
|
438 |
* @since 1.0.0
|
439 |
* @param array $item Item data.
|
440 |
-
* @return
|
441 |
*/
|
442 |
public function createControl($item)
|
443 |
{
|
@@ -445,7 +441,7 @@
|
|
445 |
|
446 |
if( is_array($item) ) {
|
447 |
|
448 |
-
$control_data =
|
449 |
|
450 |
require_once($control_data['include']);
|
451 |
|
@@ -469,7 +465,7 @@
|
|
469 |
*
|
470 |
* @since 1.0.0
|
471 |
* @param array $item Item data.
|
472 |
-
* @return
|
473 |
*/
|
474 |
public function createHolder($item)
|
475 |
{
|
@@ -477,7 +473,7 @@
|
|
477 |
|
478 |
if( is_array($item) ) {
|
479 |
|
480 |
-
$holderData =
|
481 |
require_once($holderData['include']);
|
482 |
|
483 |
$object = new $holderData['class']($item, $this);
|
@@ -495,7 +491,7 @@
|
|
495 |
*
|
496 |
* @since 1.0.0
|
497 |
* @param mixed $item Item data.
|
498 |
-
* @return
|
499 |
*/
|
500 |
public function createCustomElement($item)
|
501 |
{
|
@@ -503,7 +499,7 @@
|
|
503 |
|
504 |
if( is_array($item) ) {
|
505 |
|
506 |
-
$data =
|
507 |
require_once($data['include']);
|
508 |
|
509 |
$options = $item;
|
@@ -527,12 +523,12 @@
|
|
527 |
public function html($options = array())
|
528 |
{
|
529 |
|
530 |
-
if( !isset(
|
531 |
die(sprintf('[ERROR] The form layout %s was not found.', $this->form_layout));
|
532 |
}
|
533 |
|
534 |
// include a render code
|
535 |
-
$layout_data =
|
536 |
require_once($layout_data['include']);
|
537 |
|
538 |
$this->connectAssets();
|
@@ -556,7 +552,7 @@
|
|
556 |
{
|
557 |
|
558 |
$this->connectAssetsForItems();
|
559 |
-
$layout_data =
|
560 |
|
561 |
if( $layout_data['name'] == 'default' ) {
|
562 |
if( isset($layout_data['style']) ) {
|
@@ -606,9 +602,9 @@
|
|
606 |
|
607 |
$haystack = array();
|
608 |
if( self::isControl($type) ) {
|
609 |
-
$haystack =
|
610 |
} elseif( self::isControlHolder($type) ) {
|
611 |
-
$haystack =
|
612 |
}
|
613 |
|
614 |
if( isset($haystack[$type]) ) {
|
@@ -635,7 +631,6 @@
|
|
635 |
* Saves form data by using a specified value provider.
|
636 |
*
|
637 |
* @since 1.0.0
|
638 |
-
* @return mixed
|
639 |
*/
|
640 |
public function save()
|
641 |
{
|
@@ -644,11 +639,12 @@
|
|
644 |
}
|
645 |
|
646 |
$controls = $this->getControls();
|
647 |
-
foreach($controls as $control) {
|
648 |
|
|
|
649 |
$values = $control->getValuesToSave();
|
650 |
-
|
651 |
-
|
|
|
652 |
}
|
653 |
}
|
654 |
|
@@ -664,7 +660,7 @@
|
|
664 |
*/
|
665 |
public static function isControl($item)
|
666 |
{
|
667 |
-
return isset(
|
668 |
}
|
669 |
|
670 |
/**
|
@@ -676,7 +672,7 @@
|
|
676 |
*/
|
677 |
public static function isControlHolder($item)
|
678 |
{
|
679 |
-
return isset(
|
680 |
}
|
681 |
|
682 |
/**
|
@@ -688,7 +684,7 @@
|
|
688 |
*/
|
689 |
public static function isCustomElement($item)
|
690 |
{
|
691 |
-
return isset(
|
692 |
}
|
693 |
}
|
694 |
}
|
15 |
}
|
16 |
|
17 |
// creating a license manager for each plugin created via the factory
|
18 |
+
add_action('wbcr_factory_forms_410_plugin_created', 'wbcr_factory_forms_410_plugin_created');
|
19 |
|
20 |
+
function wbcr_factory_forms_410_plugin_created($plugin)
|
21 |
{
|
22 |
+
$plugin->forms = new Wbcr_FactoryForms410_Manager($plugin);
|
23 |
}
|
24 |
|
25 |
+
if( !class_exists('Wbcr_FactoryForms410_Manager') ) {
|
26 |
|
27 |
+
class Wbcr_FactoryForms410_Manager {
|
28 |
|
29 |
// ----------------------------------------------------
|
30 |
// Static fields and methods
|
57 |
/**
|
58 |
* Registers a set of new controls.
|
59 |
*
|
60 |
+
* @see FactoryForms410_Form::registerControl()
|
61 |
*
|
62 |
* @since 1.0.0
|
63 |
* @return void
|
95 |
/**
|
96 |
* Registers a set of new holder controls.
|
97 |
*
|
98 |
+
* @see FactoryForms410_Form::registerHolder()
|
99 |
*
|
100 |
* @since 1.0.0
|
101 |
* @return void
|
129 |
/**
|
130 |
* Registers a set of new custom form elements.
|
131 |
*
|
132 |
+
* @see FactoryForms410_Form::registerCustomElement()
|
133 |
*
|
134 |
* @since 1.0.0
|
135 |
* @return void
|
180 |
public static $controls_registered = false;
|
181 |
}
|
182 |
}
|
183 |
+
if( !class_exists('Wbcr_FactoryForms410_Form') ) {
|
184 |
/**
|
185 |
* An abstraction for forms.
|
186 |
*/
|
187 |
+
class Wbcr_FactoryForms410_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_IFactoryForms410_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_FactoryForms410_FormLayout
|
249 |
*/
|
250 |
public $layout;
|
251 |
|
|
|
252 |
/**
|
253 |
* Creates a new instance of a form.
|
254 |
*
|
261 |
*
|
262 |
* @since 1.0.0
|
263 |
* @param array $options
|
264 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
265 |
*/
|
266 |
+
public function __construct(array $options = array(), Wbcr_Factory409_Plugin $plugin)
|
267 |
{
|
268 |
// register controls once, when the first form is created
|
269 |
+
if( !Wbcr_FactoryForms410_Manager::$controls_registered ) {
|
270 |
|
271 |
+
do_action('wbcr_factory_forms_410_register_controls', $plugin);
|
272 |
|
273 |
//if( !empty($plugin) ) {
|
274 |
+
do_action('wbcr_factory_forms_410_register_controls_' . $plugin->getPluginName(), $plugin);
|
275 |
//}
|
276 |
|
277 |
+
Wbcr_FactoryForms410_Manager::$controls_registered = true;
|
278 |
}
|
279 |
|
280 |
+
$this->scope = isset($options['scope']) ? $options['scope'] : null;
|
281 |
+
$this->name = isset($options['name']) ? $options['name'] : $this->name;
|
282 |
+
/*$this->all_sites = isset($options['all_sites'])
|
283 |
+
? $options['all_sites']
|
284 |
+
: false;*/
|
|
|
285 |
|
286 |
if( isset($options['formLayout']) ) {
|
287 |
$this->form_layout = $options['formLayout'];
|
289 |
$this->form_layout = 'bootstrap-3';
|
290 |
}
|
291 |
|
292 |
+
Wbcr_FactoryForms410_Manager::$temper = 'flat';
|
293 |
}
|
294 |
|
295 |
/**
|
296 |
* Sets a provider for the control.
|
297 |
*
|
298 |
* @since 1.0.0
|
299 |
+
* @param Wbcr_IFactoryForms410_ValueProvider $provider
|
300 |
* @return void
|
301 |
*/
|
302 |
public function setProvider($provider)
|
332 |
*/
|
333 |
public function getItems()
|
334 |
{
|
335 |
+
return apply_filters('wbcr_factory_409_form_items', $this->items, $this->name);
|
336 |
}
|
337 |
|
338 |
/**
|
339 |
* Returns form controls (control objects).
|
340 |
*
|
341 |
* @since 1.0.0
|
342 |
+
* @return Wbcr_FactoryForms410_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_FactoryForms410_Control[]
|
359 |
*/
|
360 |
|
361 |
public function createControls($holder = null)
|
362 |
{
|
363 |
+
$items = ($holder == null) ? $this->getItems() : $holder['items'];
|
|
|
|
|
364 |
|
365 |
foreach($items as $item) {
|
366 |
|
395 |
*
|
396 |
* @since 1.0.0
|
397 |
* @param array $item Item data.
|
398 |
+
* @return Wbcr_FactoryForms410_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_FactoryForms410_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_FactoryForms410_Control A control object.
|
437 |
*/
|
438 |
public function createControl($item)
|
439 |
{
|
441 |
|
442 |
if( is_array($item) ) {
|
443 |
|
444 |
+
$control_data = Wbcr_FactoryForms410_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_FactoryForms410_Holder A control holder object.
|
469 |
*/
|
470 |
public function createHolder($item)
|
471 |
{
|
473 |
|
474 |
if( is_array($item) ) {
|
475 |
|
476 |
+
$holderData = Wbcr_FactoryForms410_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_FactoryForms410_FormElement A custom form element object.
|
495 |
*/
|
496 |
public function createCustomElement($item)
|
497 |
{
|
499 |
|
500 |
if( is_array($item) ) {
|
501 |
|
502 |
+
$data = Wbcr_FactoryForms410_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_FactoryForms410_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_FactoryForms410_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_FactoryForms410_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_FactoryForms410_Manager::$registered_controls;
|
606 |
} elseif( self::isControlHolder($type) ) {
|
607 |
+
$haystack = Wbcr_FactoryForms410_Manager::$registered_holders;
|
608 |
}
|
609 |
|
610 |
if( isset($haystack[$type]) ) {
|
631 |
* Saves form data by using a specified value provider.
|
632 |
*
|
633 |
* @since 1.0.0
|
|
|
634 |
*/
|
635 |
public function save()
|
636 |
{
|
639 |
}
|
640 |
|
641 |
$controls = $this->getControls();
|
|
|
642 |
|
643 |
+
foreach($controls as $control) {
|
644 |
$values = $control->getValuesToSave();
|
645 |
+
|
646 |
+
foreach($values as $key_to_save => $value_to_save) {
|
647 |
+
$this->provider->setValue($key_to_save, $value_to_save);
|
648 |
}
|
649 |
}
|
650 |
|
660 |
*/
|
661 |
public static function isControl($item)
|
662 |
{
|
663 |
+
return isset(Wbcr_FactoryForms410_Manager::$registered_controls[$item['type']]);
|
664 |
}
|
665 |
|
666 |
/**
|
672 |
*/
|
673 |
public static function isControlHolder($item)
|
674 |
{
|
675 |
+
return isset(Wbcr_FactoryForms410_Manager::$registered_holders[$item['type']]);
|
676 |
}
|
677 |
|
678 |
/**
|
684 |
*/
|
685 |
public static function isCustomElement($item)
|
686 |
{
|
687 |
+
return isset(Wbcr_FactoryForms410_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_FactoryForms410_Holder') ) {
|
18 |
|
19 |
/**
|
20 |
* The base class for control holders.
|
21 |
*
|
22 |
* @since 1.0.0
|
23 |
*/
|
24 |
+
abstract class Wbcr_FactoryForms410_Holder extends Wbcr_FactoryForms410_FormElement {
|
25 |
|
26 |
/**
|
27 |
* Holder Elements.
|
28 |
*
|
29 |
* @since 1.0.0
|
30 |
+
* @var Wbcr_FactoryForms410_Control[]
|
31 |
*/
|
32 |
protected $elements = array();
|
33 |
|
44 |
*
|
45 |
* @since 1.0.0
|
46 |
* @param mixed[] $options A holder options.
|
47 |
+
* @param Wbcr_FactoryForms410_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_FactoryForms410_Control[].
|
60 |
*/
|
61 |
public function getElements()
|
62 |
{
|
84 |
$is_first_item = false;
|
85 |
}
|
86 |
|
87 |
+
do_action('wbcr_factory_409_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_FactoryForms410_HtmlAttributeBuilder') ) {
|
18 |
/**
|
19 |
* Html Attribute Builder
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
class Wbcr_FactoryForms410_HtmlAttributeBuilder {
|
24 |
|
25 |
/**
|
26 |
* An array to store css classes.
|
libs/factory/forms/includes/index.php
ADDED
File without changes
|
libs/factory/forms/includes/providers/index.php
ADDED
File without changes
|
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_FactoryForms410_OptionsValueProvider') ) {
|
18 |
|
19 |
/**
|
20 |
* Factory Meta Value Provider
|
24 |
*
|
25 |
* @since 1.0.0
|
26 |
*/
|
27 |
+
class Wbcr_FactoryForms410_MetaValueProvider implements Wbcr_IFactoryForms410_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,28 +22,28 @@
|
|
22 |
*
|
23 |
* @since 1.0.0
|
24 |
*/
|
25 |
-
class
|
26 |
|
27 |
/**
|
28 |
-
*
|
29 |
*
|
30 |
* @since 1.0.0
|
31 |
-
* @var
|
32 |
*/
|
33 |
-
|
34 |
|
35 |
/**
|
36 |
-
*
|
37 |
*
|
38 |
* @since 1.0.0
|
39 |
-
* @var
|
40 |
*/
|
41 |
-
|
42 |
|
43 |
/**
|
44 |
* Creates a new instance of an options value provider.
|
45 |
*/
|
46 |
-
public function __construct(
|
47 |
{
|
48 |
$this->plugin = $plugin;
|
49 |
}
|
@@ -61,12 +61,14 @@
|
|
61 |
*/
|
62 |
public function saveChanges()
|
63 |
{
|
64 |
-
|
|
|
|
|
65 |
}
|
66 |
|
67 |
public function getValue($name, $default = null, $multiple = false)
|
68 |
{
|
69 |
-
$value = $this->plugin->
|
70 |
|
71 |
if( $value === 'true' || $value === true ) {
|
72 |
$value = 1;
|
13 |
exit;
|
14 |
}
|
15 |
|
16 |
+
if( !class_exists('Wbcr_FactoryForms410_OptionsValueProvider') ) {
|
17 |
|
18 |
/**
|
19 |
* Factory Options Value Provider
|
22 |
*
|
23 |
* @since 1.0.0
|
24 |
*/
|
25 |
+
class Wbcr_FactoryForms410_OptionsValueProvider implements Wbcr_IFactoryForms410_ValueProvider {
|
26 |
|
27 |
/**
|
28 |
+
* A prefix that will be added to all option names.
|
29 |
*
|
30 |
* @since 1.0.0
|
31 |
+
* @var string
|
32 |
*/
|
33 |
+
public $scope;
|
34 |
|
35 |
/**
|
36 |
+
* Values to save $optionName => $optionValue
|
37 |
*
|
38 |
* @since 1.0.0
|
39 |
+
* @var mixed[]
|
40 |
*/
|
41 |
+
private $values = array();
|
42 |
|
43 |
/**
|
44 |
* Creates a new instance of an options value provider.
|
45 |
*/
|
46 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
47 |
{
|
48 |
$this->plugin = $plugin;
|
49 |
}
|
61 |
*/
|
62 |
public function saveChanges()
|
63 |
{
|
64 |
+
foreach((array)$this->values as $option_name => $option_value) {
|
65 |
+
$this->plugin->updatePopulateOption($option_name, $option_value);
|
66 |
+
}
|
67 |
}
|
68 |
|
69 |
public function getValue($name, $default = null, $multiple = false)
|
70 |
{
|
71 |
+
$value = $this->plugin->getPopulateOption($name, $default);
|
72 |
|
73 |
if( $value === 'true' || $value === true ) {
|
74 |
$value = 1;
|
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_IFactoryForms410_ValueProvider') ) {
|
18 |
/**
|
19 |
* The interface for all value provides.
|
20 |
*
|
21 |
* @since 1.0.0
|
22 |
*/
|
23 |
+
interface Wbcr_IFactoryForms410_ValueProvider {
|
24 |
|
25 |
/**
|
26 |
* Inits a form a provider to get data from a storage.
|
libs/factory/forms/index.php
ADDED
File without changes
|
libs/factory/forms/langs/index.php
ADDED
File without changes
|
libs/factory/forms/langs/wbcr_factory_forms_407-fr-FR.mo
DELETED
Binary file
|
libs/factory/forms/langs/wbcr_factory_forms_407-fr-FR.po
DELETED
@@ -1,104 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: factory_forms\n"
|
4 |
-
"POT-Creation-Date: 2017-11-09 10:37+0300\n"
|
5 |
-
"PO-Revision-Date: 2017-11-09 18:37+0300\n"
|
6 |
-
"Last-Translator: \n"
|
7 |
-
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
-
"Language: fr\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 1.8.8\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
-
"X-Poedit-SearchPath-0: .\n"
|
19 |
-
|
20 |
-
#: controls/checkbox.php:125
|
21 |
-
msgid "On"
|
22 |
-
msgstr "On"
|
23 |
-
|
24 |
-
#: controls/checkbox.php:128
|
25 |
-
msgid "Off"
|
26 |
-
msgstr "Off"
|
27 |
-
|
28 |
-
#: controls/dropdown.php:126 controls/list.php:89 controls/list.php:127
|
29 |
-
msgid "The list is empty."
|
30 |
-
msgstr "La liste est vide."
|
31 |
-
|
32 |
-
#: controls/dropdown.php:258 controls/dropdown.php:330
|
33 |
-
msgid "- empty -"
|
34 |
-
msgstr "- vide -"
|
35 |
-
|
36 |
-
#: controls/font.php:73 controls/google-font.php:41
|
37 |
-
msgid "(use default website font)"
|
38 |
-
msgstr "(utiliser la police de site par défaut)"
|
39 |
-
|
40 |
-
#: controls/font.php:76
|
41 |
-
msgid "Sans Serif:"
|
42 |
-
msgstr "Sans Serif:"
|
43 |
-
|
44 |
-
#: controls/font.php:127
|
45 |
-
msgid "Serif:"
|
46 |
-
msgstr "Serif:"
|
47 |
-
|
48 |
-
#: controls/font.php:177
|
49 |
-
msgid "Monospaced:"
|
50 |
-
msgstr "Monospaced:"
|
51 |
-
|
52 |
-
#: controls/google-font.php:44
|
53 |
-
msgid "Standard:"
|
54 |
-
msgstr "Standard:"
|
55 |
-
|
56 |
-
#: controls/google-font.php:53
|
57 |
-
msgid "Google Fonts:"
|
58 |
-
msgstr "Google Fonts:"
|
59 |
-
|
60 |
-
#: controls/google-font.php:94
|
61 |
-
msgid "Unable to retrieve the list of Google Fonts."
|
62 |
-
msgstr "Impossible de récupérer la liste des polices Google."
|
63 |
-
|
64 |
-
#: controls/google-font.php:101
|
65 |
-
msgid "Invalide response from the Google Fonts API."
|
66 |
-
msgstr "Réponse invalidée de l'API Google Fonts."
|
67 |
-
|
68 |
-
#: controls/google-font.php:110
|
69 |
-
msgid "Unexpected error. The list of Google Fonts are empty."
|
70 |
-
msgstr "Erreur inattendue. La liste des polices Google est vide."
|
71 |
-
|
72 |
-
#: controls/gradient.php:59
|
73 |
-
msgid "vertical"
|
74 |
-
msgstr "verticale"
|
75 |
-
|
76 |
-
#: controls/gradient.php:60
|
77 |
-
msgid "horizontal"
|
78 |
-
msgstr "horizontale"
|
79 |
-
|
80 |
-
#: controls/holders/more-link.php:47
|
81 |
-
msgid "hide extra options"
|
82 |
-
msgstr "masquer les options supplémentaires"
|
83 |
-
|
84 |
-
#: controls/paddings-editor.php:53
|
85 |
-
msgid "Select a side and move the slider to set up:"
|
86 |
-
msgstr "Sélectionnez un côté et déplacez le curseur pour configurer:"
|
87 |
-
|
88 |
-
#: controls/pattern.php:90
|
89 |
-
msgid "Change color"
|
90 |
-
msgstr "Changer de couleur"
|
91 |
-
|
92 |
-
#: controls/pattern.php:92
|
93 |
-
msgid "re-color"
|
94 |
-
msgstr "re-color"
|
95 |
-
|
96 |
-
#: controls/pattern.php:99
|
97 |
-
msgid "Select color:"
|
98 |
-
msgstr "Sélectionnez couleur:"
|
99 |
-
|
100 |
-
#: controls/pattern.php:102
|
101 |
-
msgid "Changing the color may takes a minute or more. Please be patient."
|
102 |
-
msgstr ""
|
103 |
-
"Changer la couleur peut prendre une minute ou plus. S'll vous plaît "
|
104 |
-
"soyez patient."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/forms/langs/{wbcr_factory_forms_407-ru_RU.mo → wbcr_factory_forms_410-ru_RU.mo}
RENAMED
File without changes
|
libs/factory/forms/langs/{wbcr_factory_forms_407-ru_RU.po → wbcr_factory_forms_410-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_FactoryForms410_Bootstrap3FormLayout') ) {
|
18 |
/**
|
19 |
* A form layout based on Twitter Bootstrap 3
|
20 |
*/
|
21 |
+
class Wbcr_FactoryForms410_Bootstrap3FormLayout extends Wbcr_FactoryForms410_FormLayout {
|
22 |
|
23 |
public $name = 'default';
|
24 |
|
27 |
*
|
28 |
* @since 1.0.0
|
29 |
* @param array $options A holder options.
|
30 |
+
* @param Wbcr_FactoryForms410_Form $form A parent form.
|
31 |
*/
|
32 |
public function __construct($options, $form)
|
33 |
{
|
68 |
}
|
69 |
|
70 |
/**
|
71 |
+
* @param Wbcr_FactoryForms410_Control $control
|
72 |
*/
|
73 |
public function beforeControl($control)
|
74 |
{
|
116 |
}
|
117 |
|
118 |
/**
|
119 |
+
* @param Wbcr_FactoryForms410_Control $control
|
120 |
*/
|
121 |
public function afterControl($control)
|
122 |
{
|
168 |
}
|
169 |
|
170 |
/**
|
171 |
+
* @param Wbcr_FactoryForms410_Control $control
|
172 |
* @param int $index
|
173 |
* @param int $total
|
174 |
*/
|
193 |
}
|
194 |
|
195 |
/**
|
196 |
+
* @param Wbcr_FactoryForms410_Control $control
|
197 |
* @param int $index
|
198 |
* @param int $total
|
199 |
*/
|
libs/factory/forms/layouts/bootstrap-3/index.php
ADDED
File without changes
|
libs/factory/forms/layouts/index.php
ADDED
File without changes
|
libs/factory/pages/boot.php
CHANGED
@@ -19,22 +19,25 @@
|
|
19 |
return;
|
20 |
}
|
21 |
|
22 |
-
if( defined('
|
23 |
return;
|
24 |
}
|
25 |
-
define('FACTORY_PAGES_407_LOADED', true);
|
26 |
|
27 |
-
define('
|
28 |
-
|
|
|
|
|
|
|
|
|
29 |
|
30 |
if( !defined('FACTORY_FLAT_ADMIN') ) {
|
31 |
define('FACTORY_FLAT_ADMIN', true);
|
32 |
}
|
33 |
|
34 |
-
load_plugin_textdomain('
|
35 |
|
36 |
-
require(
|
37 |
-
require(
|
38 |
-
require(
|
39 |
-
require(
|
40 |
|
19 |
return;
|
20 |
}
|
21 |
|
22 |
+
if( defined('FACTORY_PAGES_410_LOADED') ) {
|
23 |
return;
|
24 |
}
|
|
|
25 |
|
26 |
+
define('FACTORY_PAGES_410_LOADED', true);
|
27 |
+
|
28 |
+
define('FACTORY_PAGES_410_VERSION', '4.1.0');
|
29 |
+
|
30 |
+
define('FACTORY_PAGES_410_DIR', dirname(__FILE__));
|
31 |
+
define('FACTORY_PAGES_410_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_410', false, dirname(plugin_basename(__FILE__)) . '/langs');
|
38 |
|
39 |
+
require(FACTORY_PAGES_410_DIR . '/pages.php');
|
40 |
+
require(FACTORY_PAGES_410_DIR . '/includes/page.class.php');
|
41 |
+
require(FACTORY_PAGES_410_DIR . '/includes/admin-page.class.php');
|
42 |
+
require(FACTORY_PAGES_410_DIR . '/templates/impressive-page.class.php');
|
43 |
|
libs/factory/pages/includes/admin-page.class.php
CHANGED
@@ -14,9 +14,9 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( !class_exists('
|
18 |
|
19 |
-
class
|
20 |
|
21 |
/**
|
22 |
* Visible page title.
|
@@ -86,6 +86,12 @@
|
|
86 |
* @var bool
|
87 |
*/
|
88 |
public $internal = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
|
90 |
/**
|
91 |
* If true, the page will not be cretaed.
|
@@ -109,22 +115,29 @@
|
|
109 |
*/
|
110 |
public $add_link_to_plugin_actions = false;
|
111 |
|
112 |
-
public function __construct(
|
113 |
{
|
114 |
parent::__construct($plugin);
|
115 |
$this->configure();
|
116 |
|
117 |
-
$this->id = empty($this->id)
|
118 |
-
? str_replace('adminpage', '', strtolower(get_class($this)))
|
119 |
-
: $this->id;
|
120 |
|
121 |
if( $this->add_link_to_plugin_actions ) {
|
122 |
$plugin_path_info = $this->plugin->getPluginPathInfo();
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
}
|
129 |
}
|
130 |
|
@@ -166,6 +179,34 @@
|
|
166 |
{
|
167 |
return $this->plugin->getPluginName();
|
168 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
169 |
|
170 |
/**
|
171 |
* @param null $id
|
@@ -173,9 +214,7 @@
|
|
173 |
*/
|
174 |
public function getResultId($id = null)
|
175 |
{
|
176 |
-
$id = !empty($id)
|
177 |
-
? $id
|
178 |
-
: $this->id;
|
179 |
|
180 |
if( $this->plugin ) {
|
181 |
return $id . '-' . $this->getMenuScope();
|
@@ -191,13 +230,13 @@
|
|
191 |
{
|
192 |
$result_id = $this->getResultId();
|
193 |
|
194 |
-
$this->hidden = apply_filters('
|
195 |
|
196 |
if( $this->hidden ) {
|
197 |
return;
|
198 |
}
|
199 |
|
200 |
-
$this->internal = apply_filters('
|
201 |
|
202 |
if( $this->internal ) {
|
203 |
$this->menu_target = null;
|
@@ -236,7 +275,7 @@
|
|
236 |
$this->assets($this->scripts, $this->styles);
|
237 |
|
238 |
if( !$this->scripts->isEmpty('bootstrap') || !$this->styles->isEmpty('bootstrap') ) {
|
239 |
-
add_action('
|
240 |
$this,
|
241 |
'actionAdminBootstrapScripts'
|
242 |
));
|
@@ -261,29 +300,16 @@
|
|
261 |
if( empty($this->capabilitiy) ) {
|
262 |
$this->capabilitiy = 'manage_options';
|
263 |
}
|
264 |
-
|
265 |
-
$this->page_title = !$this->page_title
|
266 |
-
? $this->menu_title
|
267 |
-
: $this->page_title;
|
268 |
-
|
269 |
-
$this->menu_title = !$this->menu_title
|
270 |
-
? $this->page_title
|
271 |
-
: $this->menu_title;
|
272 |
-
|
273 |
-
$this->page_title = apply_filters('wbcr_factory_page_title_' . $result_id, $this->page_title);
|
274 |
-
$this->menu_title = apply_filters('wbcr_factory_menu_title_' . $result_id, $this->menu_title);
|
275 |
-
|
276 |
// submenu
|
277 |
if( $this->menu_target ) {
|
278 |
-
|
279 |
-
add_submenu_page($this->menu_target, $this->page_title, $this->menu_title, $this->capabilitiy, $result_id, array(
|
280 |
$this,
|
281 |
'show'
|
282 |
));
|
283 |
// global menu
|
284 |
} else {
|
285 |
-
|
286 |
-
add_menu_page($this->page_title, $this->menu_title, $this->capabilitiy, $result_id, array(
|
287 |
$this,
|
288 |
'show'
|
289 |
), null, $this->menu_position);
|
@@ -347,31 +373,30 @@
|
|
347 |
*/
|
348 |
public function getActionUrl($action = null, $query_args = array())
|
349 |
{
|
350 |
-
$
|
351 |
-
|
352 |
if( !empty($action) ) {
|
353 |
-
$
|
354 |
}
|
355 |
-
|
356 |
-
|
357 |
return $url;
|
358 |
}
|
359 |
-
|
360 |
/**
|
361 |
* @return string
|
362 |
*/
|
363 |
-
|
364 |
{
|
365 |
-
$result_id = $this->getResultId();
|
366 |
-
|
367 |
if( $this->menu_target ) {
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
return $this->menu_target . '&page=' . $result_id;
|
373 |
} else {
|
374 |
-
|
|
|
|
|
375 |
}
|
376 |
}
|
377 |
|
@@ -446,9 +471,7 @@
|
|
446 |
*/
|
447 |
function addLinkToPluginActions($links)
|
448 |
{
|
449 |
-
$link_title = !empty($this->title_plugin_action_link)
|
450 |
-
? $this->title_plugin_action_link
|
451 |
-
: $this->menu_title;
|
452 |
|
453 |
$settings_link = '<a href="' . $this->getBaseUrl() . '">' . $link_title . '</a>';
|
454 |
array_unshift($links, $settings_link);
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_FactoryPages410_AdminPage') ) {
|
18 |
|
19 |
+
class Wbcr_FactoryPages410_AdminPage extends Wbcr_FactoryPages410_Page {
|
20 |
|
21 |
/**
|
22 |
* Visible page title.
|
86 |
* @var bool
|
87 |
*/
|
88 |
public $internal = false;
|
89 |
+
|
90 |
+
/**
|
91 |
+
* If true, the page is for network
|
92 |
+
* @var bool
|
93 |
+
*/
|
94 |
+
public $network = false;
|
95 |
|
96 |
/**
|
97 |
* If true, the page will not be cretaed.
|
115 |
*/
|
116 |
public $add_link_to_plugin_actions = false;
|
117 |
|
118 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
119 |
{
|
120 |
parent::__construct($plugin);
|
121 |
$this->configure();
|
122 |
|
123 |
+
$this->id = empty($this->id) ? str_replace('adminpage', '', strtolower(get_class($this))) : $this->id;
|
|
|
|
|
124 |
|
125 |
if( $this->add_link_to_plugin_actions ) {
|
126 |
$plugin_path_info = $this->plugin->getPluginPathInfo();
|
127 |
+
|
128 |
+
if( $plugin->isNetworkActive() ) {
|
129 |
+
// plugin settings link
|
130 |
+
add_filter("network_admin_plugin_action_links_" . $plugin_path_info->relative_path, array(
|
131 |
+
$this,
|
132 |
+
'addLinkToPluginActions'
|
133 |
+
));
|
134 |
+
} else {
|
135 |
+
// plugin settings link
|
136 |
+
add_filter("plugin_action_links_" . $plugin_path_info->relative_path, array(
|
137 |
+
$this,
|
138 |
+
'addLinkToPluginActions'
|
139 |
+
));
|
140 |
+
}
|
141 |
}
|
142 |
}
|
143 |
|
179 |
{
|
180 |
return $this->plugin->getPluginName();
|
181 |
}
|
182 |
+
|
183 |
+
|
184 |
+
/**
|
185 |
+
* @return string
|
186 |
+
*/
|
187 |
+
public function getMenuTitle()
|
188 |
+
{
|
189 |
+
$menu_title = !$this->menu_title ? $this->page_title : $this->menu_title;
|
190 |
+
|
191 |
+
/**
|
192 |
+
* @since 4.0.9 - добавлен
|
193 |
+
*/
|
194 |
+
return apply_filters('wbcr/factory/pages/impressive/menu_title', $menu_title, $this->plugin->getPluginName(), $this->id);
|
195 |
+
}
|
196 |
+
|
197 |
+
/**
|
198 |
+
* @return string
|
199 |
+
*/
|
200 |
+
public function getPageTitle()
|
201 |
+
{
|
202 |
+
|
203 |
+
$page_title = !$this->page_title ? $this->getMenuTitle() : $this->page_title;
|
204 |
+
|
205 |
+
/**
|
206 |
+
* @since 4.0.9 - добавлен
|
207 |
+
*/
|
208 |
+
return apply_filters('wbcr/factory/pages/impressive/page_title', $page_title, $this->plugin->getPluginName(), $this->id);
|
209 |
+
}
|
210 |
|
211 |
/**
|
212 |
* @param null $id
|
214 |
*/
|
215 |
public function getResultId($id = null)
|
216 |
{
|
217 |
+
$id = !empty($id) ? $id : $this->id;
|
|
|
|
|
218 |
|
219 |
if( $this->plugin ) {
|
220 |
return $id . '-' . $this->getMenuScope();
|
230 |
{
|
231 |
$result_id = $this->getResultId();
|
232 |
|
233 |
+
$this->hidden = apply_filters('wbcr_factory_409_page_is_hidden_' . $result_id, $this->hidden);
|
234 |
|
235 |
if( $this->hidden ) {
|
236 |
return;
|
237 |
}
|
238 |
|
239 |
+
$this->internal = apply_filters('wbcr_factory_409_page_is_internal_' . $result_id, $this->internal);
|
240 |
|
241 |
if( $this->internal ) {
|
242 |
$this->menu_target = null;
|
275 |
$this->assets($this->scripts, $this->styles);
|
276 |
|
277 |
if( !$this->scripts->isEmpty('bootstrap') || !$this->styles->isEmpty('bootstrap') ) {
|
278 |
+
add_action('wbcr_factory_409_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), array(
|
279 |
$this,
|
280 |
'actionAdminBootstrapScripts'
|
281 |
));
|
300 |
if( empty($this->capabilitiy) ) {
|
301 |
$this->capabilitiy = 'manage_options';
|
302 |
}
|
303 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
304 |
// submenu
|
305 |
if( $this->menu_target ) {
|
306 |
+
add_submenu_page($this->menu_target, $this->getPageTitle(), $this->getMenuTitle(), $this->capabilitiy, $result_id, array(
|
|
|
307 |
$this,
|
308 |
'show'
|
309 |
));
|
310 |
// global menu
|
311 |
} else {
|
312 |
+
add_menu_page($this->getPageTitle(), $this->getMenuTitle(), $this->capabilitiy, $result_id, array(
|
|
|
313 |
$this,
|
314 |
'show'
|
315 |
), null, $this->menu_position);
|
373 |
*/
|
374 |
public function getActionUrl($action = null, $query_args = array())
|
375 |
{
|
376 |
+
$url = $this->getBaseUrl(null, $query_args);
|
377 |
+
|
378 |
if( !empty($action) ) {
|
379 |
+
$url = add_query_arg('action', $action, $url);
|
380 |
}
|
381 |
+
|
|
|
382 |
return $url;
|
383 |
}
|
384 |
+
|
385 |
/**
|
386 |
* @return string
|
387 |
*/
|
388 |
+
public function getBaseUrl($id = null, $query_args = array())
|
389 |
{
|
390 |
+
$result_id = $this->getResultId($id);
|
391 |
+
|
392 |
if( $this->menu_target ) {
|
393 |
+
$url = $this->network ? network_admin_url($this->menu_target) : admin_url($this->menu_target);
|
394 |
+
|
395 |
+
return add_query_arg(array_merge(array('page' => $result_id), $query_args), $url);
|
|
|
|
|
396 |
} else {
|
397 |
+
$url = $this->network ? network_admin_url('admin.php') : admin_url('admin.php');
|
398 |
+
|
399 |
+
return add_query_arg(array_merge(array('page' => $result_id, $query_args)), $url);
|
400 |
}
|
401 |
}
|
402 |
|
471 |
*/
|
472 |
function addLinkToPluginActions($links)
|
473 |
{
|
474 |
+
$link_title = !empty($this->title_plugin_action_link) ? $this->title_plugin_action_link : $this->getMenuTitle();
|
|
|
|
|
475 |
|
476 |
$settings_link = '<a href="' . $this->getBaseUrl() . '">' . $link_title . '</a>';
|
477 |
array_unshift($links, $settings_link);
|
libs/factory/pages/includes/index.php
ADDED
File without changes
|
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 |
|
@@ -35,12 +35,13 @@
|
|
35 |
*/
|
36 |
public $result;
|
37 |
|
|
|
38 |
|
39 |
/**
|
40 |
-
* @param
|
41 |
* @throws Exception
|
42 |
*/
|
43 |
-
public function __construct(
|
44 |
{
|
45 |
$this->plugin = $plugin;
|
46 |
|
@@ -51,6 +52,15 @@
|
|
51 |
}
|
52 |
}
|
53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
public function assets($scripts, $styles)
|
55 |
{
|
56 |
}
|
@@ -64,9 +74,7 @@
|
|
64 |
if( $this->result ) {
|
65 |
echo $this->result;
|
66 |
} else {
|
67 |
-
$action = isset($_GET['action'])
|
68 |
-
? $_GET['action']
|
69 |
-
: 'index';
|
70 |
$this->executeByName($action);
|
71 |
}
|
72 |
}
|
@@ -77,6 +85,8 @@
|
|
77 |
*/
|
78 |
public function executeByName($action)
|
79 |
{
|
|
|
|
|
80 |
if( preg_match('/[-_]+/', $action) ) {
|
81 |
$action = $this->dashesToCamelCase($action, false);
|
82 |
}
|
@@ -89,7 +99,16 @@
|
|
89 |
}
|
90 |
|
91 |
if( !method_exists($this, $actionFunction) ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
$actionFunction = 'indexAction';
|
|
|
93 |
}
|
94 |
|
95 |
call_user_func_array(array($this, $actionFunction), array());
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_FactoryPages410_Page') ) {
|
18 |
|
19 |
+
class Wbcr_FactoryPages410_Page {
|
20 |
|
21 |
/**
|
22 |
* Page id used to call.
|
26 |
|
27 |
/**
|
28 |
* Current Factory Plugin.
|
29 |
+
* @var Wbcr_Factory409_Plugin
|
30 |
*/
|
31 |
public $plugin;
|
32 |
|
35 |
*/
|
36 |
public $result;
|
37 |
|
38 |
+
//private $default_actions = array();
|
39 |
|
40 |
/**
|
41 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
42 |
* @throws Exception
|
43 |
*/
|
44 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
45 |
{
|
46 |
$this->plugin = $plugin;
|
47 |
|
52 |
}
|
53 |
}
|
54 |
|
55 |
+
/*public function __call($name, $arguments) {
|
56 |
+
|
57 |
+
|
58 |
+
if(!empty($custom_action)) {
|
59 |
+
|
60 |
+
}
|
61 |
+
|
62 |
+
}*/
|
63 |
+
|
64 |
public function assets($scripts, $styles)
|
65 |
{
|
66 |
}
|
74 |
if( $this->result ) {
|
75 |
echo $this->result;
|
76 |
} else {
|
77 |
+
$action = isset($_GET['action']) ? $_GET['action'] : 'index';
|
|
|
|
|
78 |
$this->executeByName($action);
|
79 |
}
|
80 |
}
|
85 |
*/
|
86 |
public function executeByName($action)
|
87 |
{
|
88 |
+
$raw_action_name = $action;
|
89 |
+
|
90 |
if( preg_match('/[-_]+/', $action) ) {
|
91 |
$action = $this->dashesToCamelCase($action, false);
|
92 |
}
|
99 |
}
|
100 |
|
101 |
if( !method_exists($this, $actionFunction) ) {
|
102 |
+
// todo: продумать и доработать выполнение произвольных и глобальных дейтсвия для всех страниц
|
103 |
+
/*$custom_actions = apply_filters('wbcr/factory_pages_410/custom_actions', array(), $raw_action_name);
|
104 |
+
|
105 |
+
if(isset($custom_actions[$raw_action_name])) {
|
106 |
+
$custom_actions[$raw_action_name]();
|
107 |
+
$this->OnActionExected($action);
|
108 |
+
return;
|
109 |
+
} else {*/
|
110 |
$actionFunction = 'indexAction';
|
111 |
+
//}
|
112 |
}
|
113 |
|
114 |
call_user_func_array(array($this, $actionFunction), array());
|
libs/factory/pages/index.php
ADDED
File without changes
|
libs/factory/pages/langs/index.php
ADDED
File without changes
|
libs/factory/pages/langs/wbcr_factory_pages_407-ru_RU.mo
DELETED
Binary file
|
libs/factory/pages/langs/wbcr_factory_pages_407-ru_RU.po
DELETED
@@ -1,99 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: clearfy\n"
|
4 |
-
"POT-Creation-Date: 2017-10-14 13:52+0300\n"
|
5 |
-
"PO-Revision-Date: 2017-11-17 07:31+0300\n"
|
6 |
-
"Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
|
7 |
-
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
-
"Language: ru_RU\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 1.8.8\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
-
"X-Poedit-SearchPath-0: .\n"
|
19 |
-
|
20 |
-
#: templates/impressive-page.class.php:45
|
21 |
-
msgid "Settings"
|
22 |
-
msgstr "Настройки"
|
23 |
-
|
24 |
-
#: templates/impressive-page.class.php:170
|
25 |
-
msgid ""
|
26 |
-
"It seems that a caching/performance plugin is active on this site. Please "
|
27 |
-
"manually invalidate that plugin's cache after making any changes to the "
|
28 |
-
"settings below."
|
29 |
-
msgstr ""
|
30 |
-
"Похоже, что Вы используете плагин кэширования или ускорения блога. Не "
|
31 |
-
"забудьте после изменения любых настроек, очистить кэш вручную!"
|
32 |
-
|
33 |
-
#: templates/impressive-page.class.php:187
|
34 |
-
msgid "The settings have been updated successfully!"
|
35 |
-
msgstr "Настройки были успешно обновлены!"
|
36 |
-
|
37 |
-
#: templates/impressive-page.class.php:251
|
38 |
-
msgid "Page"
|
39 |
-
msgstr "Страница"
|
40 |
-
|
41 |
-
#: templates/impressive-page.class.php:256
|
42 |
-
msgid "Save settings"
|
43 |
-
msgstr "Сохранить настройки"
|
44 |
-
|
45 |
-
#: templates/impressive-page.class.php:328
|
46 |
-
msgid "You do not have permission to edit page."
|
47 |
-
msgstr "У вас недостаточно прав, для редактирования этой страницы."
|
48 |
-
|
49 |
-
#: templates/impressive-page.class.php:403
|
50 |
-
msgid ""
|
51 |
-
"A neutral setting that can not harm your site, but you must be sure that you "
|
52 |
-
"need to use it."
|
53 |
-
msgstr ""
|
54 |
-
"Нейтральная настройка, которая не может нанести вред вашему сайту, но вы "
|
55 |
-
"должны быть уверены, что вам нужно ее использовать."
|
56 |
-
|
57 |
-
#: templates/impressive-page.class.php:407
|
58 |
-
msgid ""
|
59 |
-
"When set this option, you must be careful. Plugins and themes may depend on "
|
60 |
-
"this function. You must be sure that you can disable this feature for the "
|
61 |
-
"site."
|
62 |
-
msgstr ""
|
63 |
-
"При включении этой настройки, вы должны быть осторожны. Некоторые плагины и "
|
64 |
-
"темы могут зависеть от этой функции. Вы должны быть уверены, что эту функцию "
|
65 |
-
"можно отключить для сайта."
|
66 |
-
|
67 |
-
#: templates/impressive-page.class.php:411
|
68 |
-
msgid "Absolutely safe setting, We recommend to use."
|
69 |
-
msgstr "Абсолютно безопасная настройка, рекомендуем использовать."
|
70 |
-
|
71 |
-
#: templates/impressive-page.class.php:416
|
72 |
-
msgid "Hover to the icon to get help for the feature you selected."
|
73 |
-
msgstr ""
|
74 |
-
"Наведите указатель мыши на значок, чтобы получить справку по выбранной "
|
75 |
-
"функции."
|
76 |
-
|
77 |
-
#: templates/impressive-page.class.php:432
|
78 |
-
msgid "Do you want the plugin to improved and update?"
|
79 |
-
msgstr "Вы хотите, чтобы плагин улучшался и обновлялся?"
|
80 |
-
|
81 |
-
#: templates/impressive-page.class.php:435
|
82 |
-
msgid ""
|
83 |
-
"Help the author, leave a review on wordpress.org. Thanks to feedback, I will "
|
84 |
-
"know that the plugin is really useful to you and is needed."
|
85 |
-
msgstr ""
|
86 |
-
"Помогите автору, оставьте отзыв на wordpress.org. Благодаря отзывам, я буду "
|
87 |
-
"знать, что плагин действительно полезен для вас и необходим."
|
88 |
-
|
89 |
-
#: templates/impressive-page.class.php:437
|
90 |
-
msgid "And also write your ideas on how to extend or improve the plugin."
|
91 |
-
msgstr "А также напишите свои идеи о том, как расширить или улучшить плагин."
|
92 |
-
|
93 |
-
#: templates/impressive-page.class.php:442
|
94 |
-
msgid "Go rate us and push ideas"
|
95 |
-
msgstr "Оставить отзыв или поделиться идеей"
|
96 |
-
|
97 |
-
#: templates/impressive-page.class.php:454
|
98 |
-
msgid "Donation for plug-in development"
|
99 |
-
msgstr "Пожертвования на развитие плагина"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/pages/langs/{wbcr_factory_pages_407-fr_FR.mo → wbcr_factory_pages_410-fr_FR.mo}
RENAMED
File without changes
|
libs/factory/pages/langs/{wbcr_factory_pages_407-fr_FR.po → wbcr_factory_pages_410-fr_FR.po}
RENAMED
File without changes
|
libs/factory/pages/langs/wbcr_factory_pages_410-ru_RU.mo
ADDED
Binary file
|
libs/factory/pages/langs/wbcr_factory_pages_410-ru_RU.po
ADDED
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: clearfy\n"
|
4 |
+
"POT-Creation-Date: 2018-10-16 22:44+0300\n"
|
5 |
+
"PO-Revision-Date: 2018-10-16 22:44+0300\n"
|
6 |
+
"Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
|
7 |
+
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
+
"Language: ru_RU\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 2.1.1\n"
|
13 |
+
"X-Poedit-Basepath: ..\n"
|
14 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
+
"X-Poedit-SearchPath-0: .\n"
|
19 |
+
|
20 |
+
#: templates/impressive-page.class.php:128
|
21 |
+
msgid "Settings"
|
22 |
+
msgstr "Настройки"
|
23 |
+
|
24 |
+
#: templates/impressive-page.class.php:484
|
25 |
+
msgid "The settings have been updated successfully!"
|
26 |
+
msgstr "Настройки были успешно обновлены!"
|
27 |
+
|
28 |
+
#: templates/impressive-page.class.php:484
|
29 |
+
msgid ""
|
30 |
+
"It seems that a caching/performance plugin is active on this site. Please "
|
31 |
+
"manually invalidate that plugin's cache after making any changes to the "
|
32 |
+
"settings below."
|
33 |
+
msgstr ""
|
34 |
+
"Похоже, что Вы используете плагин кэширования или ускорения блога. Не "
|
35 |
+
"забудьте после изменения любых настроек, очистить кэш вручную!"
|
36 |
+
|
37 |
+
#: templates/impressive-page.class.php:659
|
38 |
+
msgid "Page"
|
39 |
+
msgstr "Страница"
|
40 |
+
|
41 |
+
#: templates/impressive-page.class.php:665
|
42 |
+
msgid "Clearfy settings"
|
43 |
+
msgstr "Настройки Clearfy"
|
44 |
+
|
45 |
+
#: templates/impressive-page.class.php:668
|
46 |
+
msgid "Save"
|
47 |
+
msgstr "Сохранить"
|
48 |
+
|
49 |
+
#: templates/impressive-page.class.php:783
|
50 |
+
msgid "You do not have permission to edit page."
|
51 |
+
msgstr "У вас недостаточно прав, для редактирования этой страницы."
|
52 |
+
|
53 |
+
#~ msgid "Save settings"
|
54 |
+
#~ msgstr "Сохранить настройки"
|
55 |
+
|
56 |
+
#~ msgid ""
|
57 |
+
#~ "A neutral setting that can not harm your site, but you must be sure that "
|
58 |
+
#~ "you need to use it."
|
59 |
+
#~ msgstr ""
|
60 |
+
#~ "Нейтральная настройка, которая не может нанести вред вашему сайту, но вы "
|
61 |
+
#~ "должны быть уверены, что вам нужно ее использовать."
|
62 |
+
|
63 |
+
#~ msgid ""
|
64 |
+
#~ "When set this option, you must be careful. Plugins and themes may depend "
|
65 |
+
#~ "on this function. You must be sure that you can disable this feature for "
|
66 |
+
#~ "the site."
|
67 |
+
#~ msgstr ""
|
68 |
+
#~ "При включении этой настройки, вы должны быть осторожны. Некоторые плагины "
|
69 |
+
#~ "и темы могут зависеть от этой функции. Вы должны быть уверены, что эту "
|
70 |
+
#~ "функцию можно отключить для сайта."
|
71 |
+
|
72 |
+
#~ msgid "Absolutely safe setting, We recommend to use."
|
73 |
+
#~ msgstr "Абсолютно безопасная настройка, рекомендуем использовать."
|
74 |
+
|
75 |
+
#~ msgid "Hover to the icon to get help for the feature you selected."
|
76 |
+
#~ msgstr ""
|
77 |
+
#~ "Наведите указатель мыши на значок, чтобы получить справку по выбранной "
|
78 |
+
#~ "функции."
|
79 |
+
|
80 |
+
#~ msgid "Do you want the plugin to improved and update?"
|
81 |
+
#~ msgstr "Вы хотите, чтобы плагин улучшался и обновлялся?"
|
82 |
+
|
83 |
+
#~ msgid ""
|
84 |
+
#~ "Help the author, leave a review on wordpress.org. Thanks to feedback, I "
|
85 |
+
#~ "will know that the plugin is really useful to you and is needed."
|
86 |
+
#~ msgstr ""
|
87 |
+
#~ "Помогите автору, оставьте отзыв на wordpress.org. Благодаря отзывам, я "
|
88 |
+
#~ "буду знать, что плагин действительно полезен для вас и необходим."
|
89 |
+
|
90 |
+
#~ msgid "And also write your ideas on how to extend or improve the plugin."
|
91 |
+
#~ msgstr ""
|
92 |
+
#~ "А также напишите свои идеи о том, как расширить или улучшить плагин."
|
93 |
+
|
94 |
+
#~ msgid "Go rate us and push ideas"
|
95 |
+
#~ msgstr "Оставить отзыв или поделиться идеей"
|
96 |
+
|
97 |
+
#~ msgid "Donation for plug-in development"
|
98 |
+
#~ msgstr "Пожертвования на развитие плагина"
|
libs/factory/pages/pages.php
CHANGED
@@ -14,23 +14,24 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
add_action('admin_menu', '
|
|
|
18 |
|
19 |
-
if( !class_exists('
|
20 |
/**
|
21 |
* A base class to manage pages.
|
22 |
*
|
23 |
* @since 1.0.0
|
24 |
*/
|
25 |
-
class
|
26 |
|
27 |
/**
|
28 |
-
* @var
|
29 |
*/
|
30 |
private static $pages = array();
|
31 |
|
32 |
/**
|
33 |
-
* @param
|
34 |
* @param $class_name
|
35 |
*/
|
36 |
public static function register($plugin, $class_name)
|
@@ -38,7 +39,11 @@
|
|
38 |
if( !isset(self::$pages[$plugin->getPluginName()]) ) {
|
39 |
self::$pages[$plugin->getPluginName()] = array();
|
40 |
}
|
41 |
-
|
|
|
|
|
|
|
|
|
42 |
}
|
43 |
|
44 |
public static function actionAdminMenu()
|
@@ -54,8 +59,23 @@
|
|
54 |
}
|
55 |
}
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
/**
|
58 |
-
* @param
|
59 |
* @return array
|
60 |
*/
|
61 |
public static function getIds($plugin)
|
@@ -73,14 +93,14 @@
|
|
73 |
}
|
74 |
}
|
75 |
|
76 |
-
if( !function_exists('
|
77 |
/**
|
78 |
*
|
79 |
-
* @param
|
80 |
* @param string $page_id
|
81 |
* @return string
|
82 |
*/
|
83 |
-
function
|
84 |
{
|
85 |
return $page_id . '-' . $plugin->getPluginName();
|
86 |
}
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
add_action('admin_menu', 'Wbcr_FactoryPages410::actionAdminMenu');
|
18 |
+
add_action('network_admin_menu', 'Wbcr_FactoryPages410::actionAdminMenu');
|
19 |
|
20 |
+
if( !class_exists('Wbcr_FactoryPages410') ) {
|
21 |
/**
|
22 |
* A base class to manage pages.
|
23 |
*
|
24 |
* @since 1.0.0
|
25 |
*/
|
26 |
+
class Wbcr_FactoryPages410 {
|
27 |
|
28 |
/**
|
29 |
+
* @var Wbcr_FactoryPages410_Page[]
|
30 |
*/
|
31 |
private static $pages = array();
|
32 |
|
33 |
/**
|
34 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
35 |
* @param $class_name
|
36 |
*/
|
37 |
public static function register($plugin, $class_name)
|
39 |
if( !isset(self::$pages[$plugin->getPluginName()]) ) {
|
40 |
self::$pages[$plugin->getPluginName()] = array();
|
41 |
}
|
42 |
+
$page = new $class_name($plugin);
|
43 |
+
if( is_multisite() && is_network_admin() && !$page->available_for_multisite ) {
|
44 |
+
return;
|
45 |
+
}
|
46 |
+
self::$pages[$plugin->getPluginName()][] = $page;
|
47 |
}
|
48 |
|
49 |
public static function actionAdminMenu()
|
59 |
}
|
60 |
}
|
61 |
|
62 |
+
public static function getPageUrl(Wbcr_Factory409_Plugin $plugin, $page_id, $args = array())
|
63 |
+
{
|
64 |
+
if( isset(self::$pages[$plugin->getPluginName()]) ) {
|
65 |
+
$pages = self::$pages[$plugin->getPluginName()];
|
66 |
+
|
67 |
+
foreach($pages as $page) {
|
68 |
+
if( $page->id == $page_id ) {
|
69 |
+
return $page->getBaseUrl($page_id, $args);
|
70 |
+
}
|
71 |
+
}
|
72 |
+
} else {
|
73 |
+
_doing_it_wrong(__METHOD__, __('You are trying to call this earlier than the plugin menu will be registered.'), '4.0.8');
|
74 |
+
}
|
75 |
+
}
|
76 |
+
|
77 |
/**
|
78 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
79 |
* @return array
|
80 |
*/
|
81 |
public static function getIds($plugin)
|
93 |
}
|
94 |
}
|
95 |
|
96 |
+
if( !function_exists('wbcr_factory_pages_410_get_page_id') ) {
|
97 |
/**
|
98 |
*
|
99 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
100 |
* @param string $page_id
|
101 |
* @return string
|
102 |
*/
|
103 |
+
function wbcr_factory_pages_410_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
@@ -1,430 +1,507 @@
|
|
1 |
-
/**
|
2 |
-
* General styles
|
3 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>
|
4 |
-
* @copyright Alex Kovalev 23.08.2017
|
5 |
-
*/
|
6 |
-
#WBCR .updated,
|
7 |
-
#WBCR .notice,
|
8 |
-
#WBCR .error {
|
9 |
-
display: none !important;
|
10 |
-
}
|
11 |
-
#WBCR .wbcr-factory-pages-
|
12 |
-
position: relative;
|
13 |
-
/**
|
14 |
-
Content sections
|
15 |
-
*/
|
16 |
-
/**
|
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;
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
#
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
padding
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
#
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
#
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
#WBCR .wbcr-factory-pages-
|
252 |
-
|
253 |
-
|
254 |
-
|
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 |
-
|
288 |
-
|
289 |
-
|
290 |
-
}
|
291 |
-
#WBCR .wbcr-factory-pages-
|
292 |
-
|
293 |
-
|
294 |
-
#WBCR .wbcr-factory-pages-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
#
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
}
|
315 |
-
#WBCR .wbcr-factory-pages-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
}
|
330 |
-
#WBCR .wbcr-factory-pages-
|
331 |
-
|
332 |
-
}
|
333 |
-
#WBCR .wbcr-factory-pages-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
color: #
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
}
|
385 |
-
#WBCR .wbcr-factory-pages-
|
386 |
-
display:
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
}
|
398 |
-
#WBCR .wbcr-factory-pages-
|
399 |
-
|
400 |
-
|
401 |
-
}
|
402 |
-
#WBCR .wbcr-factory-pages-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
#
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* General styles
|
3 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>
|
4 |
+
* @copyright Alex Kovalev 23.08.2017
|
5 |
+
*/
|
6 |
+
#WBCR .updated,
|
7 |
+
#WBCR .notice,
|
8 |
+
#WBCR .error {
|
9 |
+
display: none !important;
|
10 |
+
}
|
11 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template {
|
12 |
+
position: relative;
|
13 |
+
/**
|
14 |
+
Content sections
|
15 |
+
*/
|
16 |
+
/**
|
17 |
+
Widget in the sidebar of the plugin
|
18 |
+
*/
|
19 |
+
}
|
20 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-color-grey {
|
21 |
+
color: #9a9a9a;
|
22 |
+
}
|
23 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-orange-color {
|
24 |
+
color: #ffc107;
|
25 |
+
}
|
26 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-light-orange-color {
|
27 |
+
color: #ffeb3b;
|
28 |
+
}
|
29 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .form-group {
|
30 |
+
padding: 0 20px;
|
31 |
+
}
|
32 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .form-group label {
|
33 |
+
font-weight: normal;
|
34 |
+
}
|
35 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .form-horizontal .control-label {
|
36 |
+
max-width: 300px;
|
37 |
+
}
|
38 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .factory-control-buttons {
|
39 |
+
text-align: right;
|
40 |
+
padding-right: 20px;
|
41 |
+
}
|
42 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .factory-from-control-list label span {
|
43 |
+
display: inline-block;
|
44 |
+
vertical-align: bottom;
|
45 |
+
}
|
46 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .factory-from-control-list label span input[type="checkbox"],
|
47 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .factory-from-control-list label span input[type="checkbox"]:focus {
|
48 |
+
outline: none;
|
49 |
+
}
|
50 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .alert + .wbcr-factory-page-group-header {
|
58 |
+
margin-top: 0 !important;
|
59 |
+
}
|
60 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .alert.alert-warning {
|
61 |
+
background: #fff3d0;
|
62 |
+
}
|
63 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .alert.alert-warning:nth-child(2n+1) {
|
64 |
+
background: #fffde9;
|
65 |
+
}
|
66 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .alert.alert-danger {
|
67 |
+
background: #de716d;
|
68 |
+
}
|
69 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .alert.alert-danger:nth-child(2n+1) {
|
70 |
+
background: #ec8c89;
|
71 |
+
}
|
72 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .alert.alert-success {
|
73 |
+
background: #d0ecc4;
|
74 |
+
}
|
75 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .alert.alert-success:nth-child(2n+1) {
|
76 |
+
background: #e0eadb;
|
77 |
+
}
|
78 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-header {
|
79 |
+
padding: 20px 20px 40px;
|
80 |
+
}
|
81 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-options,
|
88 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page {
|
89 |
+
position: relative;
|
90 |
+
background: #e6e6e6;
|
91 |
+
overflow: hidden;
|
92 |
+
}
|
93 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-options:after,
|
94 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page:after {
|
95 |
+
display: block;
|
96 |
+
content: '';
|
97 |
+
clear: both;
|
98 |
+
}
|
99 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-group-header:first-child {
|
106 |
+
margin-top: 0;
|
107 |
+
}
|
108 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-group-header strong {
|
109 |
+
font-size: 15px;
|
110 |
+
}
|
111 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-group-header p {
|
112 |
+
color: #8c8888;
|
113 |
+
font-size: 12px;
|
114 |
+
}
|
115 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-wrapper,
|
122 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-inner-wrap h2.nav-tab-wrapper,
|
123 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-inner-wrap h1.nav-tab-wrapper {
|
124 |
+
border: 0;
|
125 |
+
}
|
126 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:first-child {
|
132 |
+
margin: 0;
|
133 |
+
}
|
134 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:hover {
|
135 |
+
background: #f7f7f7;
|
136 |
+
}
|
137 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:active,
|
143 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:focus {
|
144 |
+
box-shadow: none;
|
145 |
+
outline: none;
|
146 |
+
}
|
147 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-header {
|
148 |
+
position: absolute;
|
149 |
+
z-index: 13;
|
150 |
+
top: 0;
|
151 |
+
left: 0;
|
152 |
+
right: 0;
|
153 |
+
overflow: hidden;
|
154 |
+
background-color: #32373c;
|
155 |
+
color: #fff;
|
156 |
+
border-radius: 5px 5px 0 0;
|
157 |
+
}
|
158 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-logo {
|
159 |
+
float: left;
|
160 |
+
padding: 25px 0;
|
161 |
+
font-size: 20px;
|
162 |
+
line-height: 30px;
|
163 |
+
font-weight: 400;
|
164 |
+
text-align: center;
|
165 |
+
background-color: #464b50;
|
166 |
+
color: #ccc;
|
167 |
+
padding-left: 25px;
|
168 |
+
margin-right: 10px;
|
169 |
+
background: none;
|
170 |
+
}
|
171 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-title h2 {
|
176 |
+
font-size: 18px;
|
177 |
+
line-height: 30px;
|
178 |
+
font-weight: 300;
|
179 |
+
margin-top: 26px;
|
180 |
+
padding: 0 !important;
|
181 |
+
overflow: hidden;
|
182 |
+
white-space: nowrap;
|
183 |
+
text-overflow: ellipsis;
|
184 |
+
color: #fff;
|
185 |
+
}
|
186 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-header .wbcr-factory-button {
|
192 |
+
display: inline-block;
|
193 |
+
vertical-align: top;
|
194 |
+
font-size: 13px;
|
195 |
+
font-weight: 600;
|
196 |
+
line-height: 20px;
|
197 |
+
text-transform: uppercase;
|
198 |
+
margin: 10px 0 0;
|
199 |
+
padding: 8px 30px;
|
200 |
+
cursor: pointer;
|
201 |
+
position: relative;
|
202 |
+
overflow: hidden;
|
203 |
+
border: none;
|
204 |
+
border-radius: 50px;
|
205 |
+
box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.08) inset;
|
206 |
+
background-color: #f1f1f1;
|
207 |
+
color: inherit;
|
208 |
+
transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
|
209 |
+
text-align: center;
|
210 |
+
outline: none;
|
211 |
+
text-decoration: none;
|
212 |
+
z-index: 3;
|
213 |
+
}
|
214 |
+
#WBCR .wbcr-factory-pages-410-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-410-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-410-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-410-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-410-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-410-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-410-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-410-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-410-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-410-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;
|
260 |
+
font-size: 12px;
|
261 |
+
color: #585858;
|
262 |
+
text-decoration: none;
|
263 |
+
text-transform: uppercase;
|
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-410-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-410-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-410-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-410-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-410-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-410-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-410-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link,
|
292 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
|
293 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:hover,
|
294 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab .wbcr-factory-tab__link:active,
|
295 |
+
#WBCR .wbcr-factory-pages-410-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-410-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-410-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-410-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-410-impressive-page-template .wbcr-factory-content-section,
|
311 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section {
|
312 |
+
display: inline-block;
|
313 |
+
vertical-align: top;
|
314 |
+
}
|
315 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-content-section {
|
316 |
+
width: 74.6%;
|
317 |
+
}
|
318 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-content-section.wbcr-fullwidth {
|
319 |
+
width: 100%;
|
320 |
+
}
|
321 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-content-section .nav-tab-wrapper {
|
322 |
+
margin-top: 15px;
|
323 |
+
}
|
324 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content > form {
|
331 |
+
padding-top: 0 !important;
|
332 |
+
}
|
333 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-sidebar-widget {
|
341 |
+
margin: 0 0 20px;
|
342 |
+
}
|
343 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget {
|
344 |
+
display: inline-block;
|
345 |
+
min-height: 230px;
|
346 |
+
width: 100%;
|
347 |
+
margin-top: 20px;
|
348 |
+
background-color: #fff;
|
349 |
+
padding: 20px 15px;
|
350 |
+
vertical-align: top;
|
351 |
+
}
|
352 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-hide {
|
353 |
+
display: none;
|
354 |
+
}
|
355 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-warning {
|
356 |
+
background: #fff4d0;
|
357 |
+
}
|
358 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-danger {
|
359 |
+
background: #e2ffc0;
|
360 |
+
}
|
361 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-success {
|
362 |
+
background: #ffebe9;
|
363 |
+
}
|
364 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-hint-icon-simple {
|
365 |
+
display: inline-block;
|
366 |
+
width: 16px;
|
367 |
+
height: 16px;
|
368 |
+
line-height: 13px;
|
369 |
+
padding: 0;
|
370 |
+
font-size: 11px;
|
371 |
+
text-align: center;
|
372 |
+
color: #fff;
|
373 |
+
background: #E91E63;
|
374 |
+
border-radius: 3px;
|
375 |
+
}
|
376 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-grey {
|
377 |
+
background: #E91E63;
|
378 |
+
}
|
379 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-red {
|
380 |
+
background: #9e9e9e;
|
381 |
+
}
|
382 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-green {
|
383 |
+
background: #8bc34a;
|
384 |
+
}
|
385 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-icon-5stars {
|
386 |
+
display: block;
|
387 |
+
width: 80px;
|
388 |
+
height: 17px;
|
389 |
+
background: url('../img/5-stars22.png') no-repeat;
|
390 |
+
vertical-align: middle;
|
391 |
+
margin-bottom: 5px;
|
392 |
+
}
|
393 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :focus,
|
399 |
+
#WBCR .wbcr-factory-pages-410-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-410-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-410-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box {
|
410 |
+
min-height: 240px;
|
411 |
+
margin-bottom: 20px;
|
412 |
+
text-align: center;
|
413 |
+
background: #fdfcf7;
|
414 |
+
padding: 30px;
|
415 |
+
border: 1px solid #f3f1e7;
|
416 |
+
}
|
417 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box h3 {
|
425 |
+
color: #7b6111;
|
426 |
+
}
|
427 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box p {
|
428 |
+
color: #9e9e9e;
|
429 |
+
}
|
430 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button {
|
435 |
+
display: inline-block;
|
436 |
+
padding: 20px 60px;
|
437 |
+
background-color: #FFC107;
|
438 |
+
color: #866605;
|
439 |
+
text-decoration: none;
|
440 |
+
text-transform: uppercase;
|
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-410-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button:hover {
|
445 |
+
background-color: #ffce3a;
|
446 |
+
}
|
447 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template #wbcr-factory-confirm-dialog {
|
448 |
+
padding: 20px;
|
449 |
+
background: #ffffff;
|
450 |
+
}
|
451 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template #wbcr-factory-confirm-dialog .updated,
|
452 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template #wbcr-factory-confirm-dialog .alert {
|
453 |
+
display: none;
|
454 |
+
}
|
455 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template #wbcr-factory-confirm-dialog h2 {
|
456 |
+
font-size: 18px;
|
457 |
+
margin-top: 10px;
|
458 |
+
}
|
459 |
+
#WBCR .wbcr-factory-pages-410-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-410-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-410-impressive-page-template .wbcr-factory-content-section {
|
471 |
+
width: 69.6%;
|
472 |
+
}
|
473 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-content-section {
|
479 |
+
width: 100%;
|
480 |
+
}
|
481 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-right-sidebar-section {
|
482 |
+
display: none !important;
|
483 |
+
}
|
484 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-header-logo .dash {
|
485 |
+
display: none !important;
|
486 |
+
}
|
487 |
+
#WBCR .wbcr-factory-pages-410-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-410-impressive-page-template .wbcr-factory-left-navigation-bar {
|
493 |
+
width: 70px;
|
494 |
+
}
|
495 |
+
#WBCR .wbcr-factory-pages-410-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a {
|
496 |
+
font-size: 0;
|
497 |
+
}
|
498 |
+
#WBCR .wbcr-factory-pages-410-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-410-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-410-impressive-page-template .wbcr-factory-page-inner-wrap {
|
505 |
+
margin-left: 70px;
|
506 |
+
}
|
507 |
+
}
|
libs/factory/pages/templates/assets/css/impressive.page.template.less
CHANGED
@@ -154,15 +154,20 @@
|
|
154 |
border: 0;
|
155 |
}
|
156 |
.nav-tab-active {
|
157 |
-
background: #efefef;
|
|
|
|
|
158 |
}
|
159 |
.nav-tab:first-child {
|
160 |
-
margin
|
161 |
}
|
162 |
.nav-tab:hover {
|
163 |
background: #f7f7f7;
|
164 |
}
|
165 |
.nav-tab {
|
|
|
|
|
|
|
166 |
&:active, &:focus {
|
167 |
box-shadow: none;
|
168 |
outline: none;
|
@@ -217,45 +222,59 @@
|
|
217 |
position: relative;
|
218 |
float: right;
|
219 |
margin: 12px;
|
|
|
220 |
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
|
|
242 |
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
|
|
|
|
|
|
247 |
color: #fff;
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
}
|
252 |
-
&:active {
|
253 |
-
box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
|
254 |
-
}
|
255 |
}
|
256 |
}
|
257 |
-
}
|
258 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
259 |
}
|
260 |
|
261 |
.wbcr-factory-left-navigation-bar {
|
@@ -274,16 +293,45 @@
|
|
274 |
background: #efefef;
|
275 |
//padding: 15px 20px;
|
276 |
margin: 1px 0;
|
277 |
-
|
278 |
display: block;
|
279 |
width: 100%;
|
280 |
padding: 20px 20px;
|
281 |
font-size: 12px;
|
282 |
-
color: #
|
283 |
text-decoration: none;
|
284 |
text-transform: uppercase;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
285 |
&:hover {
|
286 |
background: #f7f6f6;
|
|
|
|
|
|
|
287 |
}
|
288 |
&, &:active, &:hover, &:active, &:focus {
|
289 |
outline: 0 !important;
|
@@ -294,7 +342,12 @@
|
|
294 |
&.wbcr-factory-active-tab {
|
295 |
background: #fff;
|
296 |
a {
|
297 |
-
color: #
|
|
|
|
|
|
|
|
|
|
|
298 |
}
|
299 |
}
|
300 |
}
|
@@ -310,7 +363,7 @@
|
|
310 |
}
|
311 |
|
312 |
.wbcr-factory-content-section {
|
313 |
-
width:
|
314 |
&.wbcr-fullwidth {
|
315 |
width: 100%;
|
316 |
}
|
@@ -329,9 +382,9 @@
|
|
329 |
}
|
330 |
|
331 |
.wbcr-factory-right-sidebar-section {
|
332 |
-
width:
|
333 |
-
padding:
|
334 |
-
margin:
|
335 |
background-color: #f9f9f9;
|
336 |
box-shadow: -1px 1px 5px rgba(0, 0, 0, 0.1);
|
337 |
|
@@ -487,6 +540,41 @@
|
|
487 |
}
|
488 |
}
|
489 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
490 |
@media screen and (max-width: 950px) {
|
491 |
#WBCR {
|
492 |
.wbcr-factory-pages-000-impressive-page-template {
|
@@ -498,6 +586,12 @@
|
|
498 |
a {
|
499 |
font-size: 0;
|
500 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
501 |
}
|
502 |
}
|
503 |
}
|
154 |
border: 0;
|
155 |
}
|
156 |
.nav-tab-active {
|
157 |
+
background: #efefef !important;
|
158 |
+
margin-bottom: -2px !important;
|
159 |
+
border-bottom: 1px solid #efefef !important;
|
160 |
}
|
161 |
.nav-tab:first-child {
|
162 |
+
margin: 0;
|
163 |
}
|
164 |
.nav-tab:hover {
|
165 |
background: #f7f7f7;
|
166 |
}
|
167 |
.nav-tab {
|
168 |
+
border: 2px solid #dedede;
|
169 |
+
border-bottom: 0;
|
170 |
+
box-shadow: -1px 0 0 rgba(0, 0, 0, 0.1);
|
171 |
&:active, &:focus {
|
172 |
box-shadow: none;
|
173 |
outline: none;
|
222 |
position: relative;
|
223 |
float: right;
|
224 |
margin: 12px;
|
225 |
+
}
|
226 |
|
227 |
+
.wbcr-factory-button {
|
228 |
+
display: inline-block;
|
229 |
+
vertical-align: top;
|
230 |
+
font-size: 13px;
|
231 |
+
font-weight: 600;
|
232 |
+
line-height: 20px;
|
233 |
+
text-transform: uppercase;
|
234 |
+
margin: 10px 0 0;
|
235 |
+
padding: 8px 30px;
|
236 |
+
cursor: pointer;
|
237 |
+
position: relative;
|
238 |
+
overflow: hidden;
|
239 |
+
border: none;
|
240 |
+
border-radius: 50px;
|
241 |
+
box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.08) inset;
|
242 |
+
background-color: #f1f1f1;
|
243 |
+
color: inherit;
|
244 |
+
transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
|
245 |
+
text-align: center;
|
246 |
+
outline: none;
|
247 |
+
text-decoration: none;
|
248 |
+
z-index: 3;
|
249 |
|
250 |
+
&.wbcr-factory-type-save {
|
251 |
+
box-shadow: none;
|
252 |
+
min-width: 100px;
|
253 |
+
background-color: #8bc34a;
|
254 |
+
color: #fff;
|
255 |
+
&:hover {
|
256 |
+
background: #9dbb7b;
|
257 |
color: #fff;
|
258 |
+
}
|
259 |
+
&:active {
|
260 |
+
box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
|
|
|
|
|
|
|
|
|
261 |
}
|
262 |
}
|
|
|
263 |
|
264 |
+
&.wbcr-factory-type-settings {
|
265 |
+
box-shadow: none;
|
266 |
+
min-width: 200px;
|
267 |
+
background-color: #9e9e9e;
|
268 |
+
color: #fff;
|
269 |
+
&:hover {
|
270 |
+
background: #797979;
|
271 |
+
color: #fff;
|
272 |
+
}
|
273 |
+
&:active {
|
274 |
+
box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
|
275 |
+
}
|
276 |
+
}
|
277 |
+
}
|
278 |
}
|
279 |
|
280 |
.wbcr-factory-left-navigation-bar {
|
293 |
background: #efefef;
|
294 |
//padding: 15px 20px;
|
295 |
margin: 1px 0;
|
296 |
+
.wbcr-factory-tab__link {
|
297 |
display: block;
|
298 |
width: 100%;
|
299 |
padding: 20px 20px;
|
300 |
font-size: 12px;
|
301 |
+
color: #585858;
|
302 |
text-decoration: none;
|
303 |
text-transform: uppercase;
|
304 |
+
text-align: left;
|
305 |
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
306 |
+
|
307 |
+
.wbcr-factory-tab__title {
|
308 |
+
display: block;
|
309 |
+
font-weight: bold;
|
310 |
+
}
|
311 |
+
|
312 |
+
.wbcr-factory-tab__short-description {
|
313 |
+
display: block;
|
314 |
+
font-size: 13px;
|
315 |
+
font-weight: normal;
|
316 |
+
text-transform: none;
|
317 |
+
color: #9a9a9a;
|
318 |
+
}
|
319 |
+
|
320 |
+
.dashicons {
|
321 |
+
float: right;
|
322 |
+
//font-size: 22px;
|
323 |
+
color: #ccc;
|
324 |
+
}
|
325 |
+
|
326 |
+
&::after {
|
327 |
+
clear: both;
|
328 |
+
}
|
329 |
+
|
330 |
&:hover {
|
331 |
background: #f7f6f6;
|
332 |
+
.dashicons {
|
333 |
+
color: #9a9a9a;
|
334 |
+
}
|
335 |
}
|
336 |
&, &:active, &:hover, &:active, &:focus {
|
337 |
outline: 0 !important;
|
342 |
&.wbcr-factory-active-tab {
|
343 |
background: #fff;
|
344 |
a {
|
345 |
+
color: #ff5722;
|
346 |
+
font-weight: bold;
|
347 |
+
border-left: 5px solid #ff5722;
|
348 |
+
.dashicons {
|
349 |
+
color: #9a9a9a;
|
350 |
+
}
|
351 |
}
|
352 |
}
|
353 |
}
|
363 |
}
|
364 |
|
365 |
.wbcr-factory-content-section {
|
366 |
+
width: 74.6%;
|
367 |
&.wbcr-fullwidth {
|
368 |
width: 100%;
|
369 |
}
|
382 |
}
|
383 |
|
384 |
.wbcr-factory-right-sidebar-section {
|
385 |
+
width: 25%;
|
386 |
+
padding: 10px;
|
387 |
+
margin: 0 0 -20px;
|
388 |
background-color: #f9f9f9;
|
389 |
box-shadow: -1px 1px 5px rgba(0, 0, 0, 0.1);
|
390 |
|
540 |
}
|
541 |
}
|
542 |
|
543 |
+
@media screen and (max-width: 1367px) {
|
544 |
+
#WBCR {
|
545 |
+
.wbcr-factory-pages-000-impressive-page-template {
|
546 |
+
.wbcr-factory-content-section {
|
547 |
+
width: 69.6%;
|
548 |
+
}
|
549 |
+
|
550 |
+
.wbcr-factory-right-sidebar-section {
|
551 |
+
width: 30%;
|
552 |
+
}
|
553 |
+
}
|
554 |
+
}
|
555 |
+
}
|
556 |
+
|
557 |
+
@media screen and (max-width: 1320px) {
|
558 |
+
#WBCR {
|
559 |
+
.wbcr-factory-pages-000-impressive-page-template {
|
560 |
+
.wbcr-factory-content-section {
|
561 |
+
width: 100%;
|
562 |
+
}
|
563 |
+
.wbcr-factory-right-sidebar-section {
|
564 |
+
display: none !important;
|
565 |
+
}
|
566 |
+
.wbcr-factory-header-logo {
|
567 |
+
.dash {
|
568 |
+
display: none !important;
|
569 |
+
}
|
570 |
+
}
|
571 |
+
.wbcr-factory-header-title {
|
572 |
+
display: none !important;
|
573 |
+
}
|
574 |
+
}
|
575 |
+
}
|
576 |
+
}
|
577 |
+
|
578 |
@media screen and (max-width: 950px) {
|
579 |
#WBCR {
|
580 |
.wbcr-factory-pages-000-impressive-page-template {
|
586 |
a {
|
587 |
font-size: 0;
|
588 |
}
|
589 |
+
.wbcr-factory-tab__title {
|
590 |
+
font-size: 0;
|
591 |
+
}
|
592 |
+
.wbcr-factory-tab__short-description {
|
593 |
+
display: none !important;
|
594 |
+
}
|
595 |
}
|
596 |
}
|
597 |
}
|
libs/factory/pages/templates/assets/css/index.php
ADDED
File without changes
|
libs/factory/pages/templates/assets/img/index.php
ADDED
File without changes
|
libs/factory/pages/templates/assets/index.php
ADDED
File without changes
|
libs/factory/pages/templates/impressive-page.class.php
CHANGED
@@ -14,15 +14,11 @@
|
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
-
if( !class_exists('
|
18 |
/**
|
19 |
-
* Class
|
20 |
-
*
|
21 |
-
* @method string getInfoWidget() - get widget content information
|
22 |
-
* @method string getRatingWidget(array $args = array()) - get widget content rating
|
23 |
-
* @method string getDonateWidget() - get widget content donate
|
24 |
*/
|
25 |
-
abstract class
|
26 |
|
27 |
//public $menu_target = 'options-general.php';
|
28 |
|
@@ -30,6 +26,21 @@
|
|
30 |
* @var bool
|
31 |
*/
|
32 |
public $internal = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
/**
|
35 |
* Тип страницы
|
@@ -56,6 +67,12 @@
|
|
56 |
*/
|
57 |
public $page_menu_dashicon;
|
58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
/**
|
60 |
* Позиция закладки в меню плагина.
|
61 |
* 0 - в самом конце, 100 - в самом начале
|
@@ -86,61 +103,73 @@
|
|
86 |
* @var bool
|
87 |
*/
|
88 |
public $show_bottom_sidebar = true;
|
|
|
|
|
|
|
|
|
|
|
89 |
|
90 |
/**
|
91 |
-
* @param
|
92 |
*/
|
93 |
-
public function __construct(
|
94 |
{
|
95 |
-
$this->menuIcon =
|
96 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
|
98 |
parent::__construct($plugin);
|
99 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
global $factory_impressive_page_menu;
|
101 |
-
|
102 |
-
$dashicon = (!empty($this->page_menu_dashicon))
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
//$this->show_right_sidebar_in_options = true;
|
110 |
-
//$this->show_bottom_sidebar = false;
|
111 |
-
//}
|
112 |
-
|
113 |
$factory_impressive_page_menu[$this->getMenuScope()][$this->getResultId()] = array(
|
114 |
'type' => $this->type, // page, options
|
115 |
'url' => $this->getBaseUrl(),
|
116 |
-
'title' => '<span class="dashicons' . $dashicon . '"></span>
|
|
|
117 |
'position' => $this->page_menu_position,
|
118 |
'parent' => $this->page_parent_page
|
119 |
);
|
120 |
}
|
121 |
-
|
122 |
-
|
|
|
|
|
|
|
|
|
|
|
123 |
{
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
ob_start();
|
128 |
-
|
129 |
-
$this->$called_method_name($arguments);
|
130 |
-
$content = ob_get_contents();
|
131 |
-
ob_end_clean();
|
132 |
-
|
133 |
-
return $content;
|
134 |
-
}
|
135 |
-
}
|
136 |
-
|
137 |
-
return null;
|
138 |
}
|
139 |
|
140 |
/**
|
141 |
* Requests assets (js and css) for the page.
|
142 |
*
|
143 |
-
* @see
|
144 |
*
|
145 |
* @since 1.0.0
|
146 |
* @return void
|
@@ -164,40 +193,58 @@
|
|
164 |
'control.checkbox'
|
165 |
), 'bootstrap');
|
166 |
|
167 |
-
$this->styles->add(
|
168 |
-
//$this->styles->add('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css');
|
169 |
}
|
170 |
|
171 |
/**
|
|
|
|
|
172 |
* @return string
|
173 |
*/
|
174 |
-
public function
|
175 |
{
|
176 |
-
|
177 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
178 |
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
return $
|
185 |
}
|
186 |
|
187 |
/**
|
|
|
|
|
188 |
* @return string
|
189 |
*/
|
190 |
-
public function
|
191 |
{
|
192 |
-
|
|
|
|
|
|
|
193 |
}
|
194 |
|
195 |
/**
|
|
|
|
|
|
|
196 |
* @return string
|
197 |
*/
|
198 |
-
public function
|
199 |
{
|
200 |
-
|
|
|
|
|
|
|
201 |
}
|
202 |
|
203 |
/**
|
@@ -208,23 +255,11 @@
|
|
208 |
*/
|
209 |
public function getOption($option_name, $default = false)
|
210 |
{
|
|
|
|
|
211 |
return $this->plugin->getOption($option_name, $default);
|
212 |
}
|
213 |
|
214 |
-
/**
|
215 |
-
* @return string
|
216 |
-
*/
|
217 |
-
protected function getBaseUrl()
|
218 |
-
{
|
219 |
-
$result_id = $this->getResultId();
|
220 |
-
|
221 |
-
if( $this->menu_target ) {
|
222 |
-
return add_query_arg(array('page' => $result_id), admin_url($this->menu_target));
|
223 |
-
} else {
|
224 |
-
return add_query_arg(array('page' => $result_id), admin_url('admin.php'));
|
225 |
-
}
|
226 |
-
}
|
227 |
-
|
228 |
/**
|
229 |
* Shows a page or options
|
230 |
*
|
@@ -233,9 +268,8 @@
|
|
233 |
*/
|
234 |
public function indexAction()
|
235 |
{
|
236 |
-
|
237 |
-
|
238 |
-
if( 'options' === $factory_impressive_page_menu[$this->getMenuScope()][$this->getResultId()]['type'] ) {
|
239 |
$this->showOptions();
|
240 |
} else {
|
241 |
$this->showPage();
|
@@ -252,32 +286,49 @@
|
|
252 |
{
|
253 |
check_admin_referer('wbcr_factory_' . $this->getResultId() . '_flush_action');
|
254 |
|
255 |
-
|
256 |
-
|
257 |
-
w3tc_pgcache_flush();
|
258 |
-
} elseif( function_exists('wp_cache_clear_cache') ) {
|
259 |
-
wp_cache_clear_cache();
|
260 |
-
} elseif( function_exists('rocket_clean_files') ) {
|
261 |
-
rocket_clean_files(esc_url($_SERVER['HTTP_REFERER']));
|
262 |
-
} else if( isset($GLOBALS['wp_fastest_cache']) && method_exists($GLOBALS['wp_fastest_cache'], 'deleteCache') ) {
|
263 |
-
$GLOBALS['wp_fastest_cache']->deleteCache();
|
264 |
}
|
265 |
|
266 |
-
|
|
|
|
|
|
|
267 |
$this->plugin->getPluginName(),
|
268 |
$this->getResultId()
|
269 |
-
), '4.0.1', '
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
|
271 |
/**
|
272 |
-
* @since 4.0.1
|
|
|
273 |
*/
|
274 |
-
do_action('
|
275 |
|
276 |
$this->afterFormSave();
|
277 |
|
278 |
-
$
|
279 |
$this->plugin->getPluginName() . '_saved' => 1
|
280 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
281 |
}
|
282 |
|
283 |
|
@@ -287,7 +338,7 @@
|
|
287 |
protected function warningNotice()
|
288 |
{
|
289 |
/*if( WP_CACHE ) {
|
290 |
-
$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.", '
|
291 |
}*/
|
292 |
// Метод предназначен для вызова в дочернем классе
|
293 |
}
|
@@ -353,15 +404,28 @@
|
|
353 |
echo '<div class="alert alert-success wbcr-factory-warning-notice"><p><span class="dashicons dashicons-plus"></span> ' . $message . '</p></div>';
|
354 |
}
|
355 |
|
|
|
|
|
|
|
|
|
356 |
protected function printAllNotices()
|
357 |
{
|
358 |
$this->warningNotice();
|
359 |
$this->showActionsNotice();
|
360 |
|
361 |
/**
|
362 |
-
* @since 4.0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
363 |
*/
|
364 |
-
do_action('
|
365 |
}
|
366 |
|
367 |
private function showActionsNotice()
|
@@ -372,13 +436,25 @@
|
|
372 |
$this->plugin->getPluginName() . '_saved' => '1'
|
373 |
),
|
374 |
'type' => 'success',
|
375 |
-
'message' => __('The settings have been updated successfully!', '
|
376 |
-
? '<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_407')
|
377 |
-
: '')
|
378 |
)
|
379 |
);
|
380 |
-
|
381 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
382 |
$notices = $this->getActionNotices($notices);
|
383 |
|
384 |
foreach($notices as $key => $notice) {
|
@@ -395,9 +471,7 @@
|
|
395 |
continue;
|
396 |
}
|
397 |
|
398 |
-
$notice_type = isset($notice['type'])
|
399 |
-
? $notice['type']
|
400 |
-
: 'success';
|
401 |
|
402 |
switch( $notice_type ) {
|
403 |
case 'success':
|
@@ -415,18 +489,12 @@
|
|
415 |
|
416 |
protected function showPageMenu()
|
417 |
{
|
418 |
-
|
419 |
-
|
420 |
-
$page_menu = $factory_impressive_page_menu[$this->getMenuScope()];
|
421 |
$self_page_id = $this->getResultId();
|
422 |
-
$current_page = isset($page_menu[$self_page_id])
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
$parent_page_id = !empty($current_page['parent'])
|
427 |
-
? $this->getResultId($current_page['parent'])
|
428 |
-
: null;
|
429 |
-
|
430 |
uasort($page_menu, array($this, 'pageMenuSort'));
|
431 |
?>
|
432 |
<ul>
|
@@ -441,8 +509,15 @@
|
|
441 |
}
|
442 |
?>
|
443 |
<li class="wbcr-factory-nav-tab<?= $active_tab ?>">
|
444 |
-
<a href="<?php echo $page['url'] ?>" id="<?= $page_screen ?>-tab">
|
445 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
446 |
</a>
|
447 |
</li>
|
448 |
<?php endforeach; ?>
|
@@ -462,12 +537,9 @@
|
|
462 |
|
463 |
protected function showPageSubMenu()
|
464 |
{
|
465 |
-
global $factory_impressive_page_menu;
|
466 |
$self_page_id = $this->getResultId();
|
467 |
-
$page_menu = $
|
468 |
-
$current_page = isset($page_menu[$self_page_id])
|
469 |
-
? $page_menu[$self_page_id]
|
470 |
-
: null;
|
471 |
|
472 |
$page_submenu = array();
|
473 |
foreach($page_menu as $page_screen => $page) {
|
@@ -487,9 +559,7 @@
|
|
487 |
|
488 |
$get_menu_id = null;
|
489 |
$has_parent = !empty($current_page) && !empty($current_page['parent']);
|
490 |
-
$parent_page_id = $has_parent
|
491 |
-
? $this->getResultId($current_page['parent'])
|
492 |
-
: null;
|
493 |
|
494 |
if( ($has_parent && isset($page_submenu[$parent_page_id])) ) {
|
495 |
$get_menu_id = $parent_page_id;
|
@@ -529,6 +599,11 @@
|
|
529 |
protected function showHeader()
|
530 |
{
|
531 |
?>
|
|
|
|
|
|
|
|
|
|
|
532 |
<div class="wbcr-factory-page-header">
|
533 |
<div class="wbcr-factory-header-logo"><?= $this->getPluginTitle(); ?>
|
534 |
<span class="version"><?= $this->plugin->getPluginVersion() ?> </span>
|
@@ -539,14 +614,26 @@
|
|
539 |
<h2><?php _e('Page') ?>: <?= $this->getPageTitle() ?></h2>
|
540 |
</div>
|
541 |
<?php endif; ?>
|
542 |
-
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
|
|
|
|
|
|
|
|
|
|
547 |
</div>
|
548 |
<?php
|
549 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
550 |
|
551 |
protected function showRightSidebar()
|
552 |
{
|
@@ -555,7 +642,7 @@
|
|
555 |
if( empty($widgets) ) {
|
556 |
return;
|
557 |
}
|
558 |
-
|
559 |
foreach($widgets as $widget_content):
|
560 |
echo $widget_content;
|
561 |
endforeach;
|
@@ -580,64 +667,52 @@
|
|
580 |
<?php
|
581 |
}
|
582 |
|
|
|
|
|
|
|
|
|
583 |
protected function getPageWidgets($position = 'bottom')
|
584 |
{
|
585 |
-
|
586 |
-
array(
|
587 |
-
'info_widget' => $this->getInfoWidget(),
|
588 |
-
'rating_widget' => $this->getRatingWidget(),
|
589 |
-
'donate_widget' => $this->getDonateWidget()
|
590 |
-
),
|
591 |
-
$this->getResultId()
|
592 |
-
), '4.0.1', 'wbcr_factory_pages_407_imppage_get_widgets');
|
593 |
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
$this->
|
601 |
-
|
|
|
602 |
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
|
|
|
|
608 |
}
|
609 |
-
|
610 |
-
/**
|
611 |
-
*
|
612 |
-
*/
|
613 |
protected function showOptions()
|
614 |
{
|
615 |
-
|
616 |
-
global $factory_impressive_page_menu;
|
617 |
-
|
618 |
-
$form = new Wbcr_FactoryForms407_Form(array(
|
619 |
'scope' => rtrim($this->plugin->getPrefix(), '_'),
|
620 |
'name' => $this->getResultId() . "-options"
|
621 |
), $this->plugin);
|
622 |
|
623 |
-
$form->setProvider(new
|
624 |
|
625 |
-
$options = $this->
|
626 |
|
627 |
if( isset($options[0]) && isset($options[0]['items']) && is_array($options[0]['items']) ) {
|
628 |
-
|
629 |
-
/*array_unshift($options[0]['items'], array(
|
630 |
-
'type' => 'html',
|
631 |
-
'html' => array($this, 'printAllNotices')
|
632 |
-
));*/
|
633 |
-
|
634 |
foreach($options[0]['items'] as $key => $value) {
|
635 |
|
636 |
if( $value['type'] == 'div' ) {
|
637 |
if( isset($options[0]['items'][$key]['items']) && !empty($options[0]['items'][$key]['items']) ) {
|
638 |
foreach($options[0]['items'][$key]['items'] as $group_key => $group_value) {
|
639 |
-
$options[0]['items'][$key]['items'][$group_key]['layout']['column-left'] = '
|
640 |
-
$options[0]['items'][$key]['items'][$group_key]['layout']['column-right'] = '
|
641 |
}
|
642 |
|
643 |
continue;
|
@@ -650,10 +725,11 @@
|
|
650 |
'integer',
|
651 |
'textbox',
|
652 |
'dropdown',
|
653 |
-
'list'
|
|
|
654 |
)) ) {
|
655 |
-
$options[0]['items'][$key]['layout']['column-left'] = '
|
656 |
-
$options[0]['items'][$key]['layout']['column-right'] = '
|
657 |
}
|
658 |
}
|
659 |
}
|
@@ -665,27 +741,43 @@
|
|
665 |
check_admin_referer('wbcr_factory_' . $this->getResultId() . '_save_action');
|
666 |
|
667 |
if( !current_user_can('administrator') && !current_user_can($this->capabilitiy) ) {
|
668 |
-
wp_die(__('You do not have permission to edit page.', '
|
669 |
exit;
|
670 |
}
|
671 |
|
672 |
-
|
|
|
|
|
|
|
673 |
$form,
|
674 |
-
$this->plugin
|
675 |
-
|
|
|
676 |
|
677 |
-
|
|
|
|
|
|
|
|
|
678 |
|
679 |
$this->beforeFormSave();
|
680 |
|
681 |
$form->save();
|
682 |
|
683 |
-
|
|
|
|
|
|
|
684 |
$form,
|
685 |
-
$this->plugin
|
686 |
-
|
687 |
-
|
688 |
-
|
|
|
|
|
|
|
|
|
|
|
689 |
|
690 |
$this->formSaved();
|
691 |
|
@@ -696,21 +788,21 @@
|
|
696 |
|
697 |
?>
|
698 |
<div id="WBCR" class="wrap">
|
699 |
-
<div class="wbcr-factory-pages-
|
700 |
<div class="wbcr-factory-options wbcr-factory-options-<?= esc_attr($this->id) ?>">
|
701 |
<div class="wbcr-factory-left-navigation-bar">
|
702 |
<?php $this->showPageMenu() ?>
|
703 |
</div>
|
704 |
<?php
|
705 |
$min_height = 0;
|
706 |
-
foreach($
|
707 |
if( !isset($page['parent']) || empty($page['parent']) ) {
|
708 |
-
$min_height +=
|
709 |
}
|
710 |
}
|
711 |
?>
|
712 |
<div class="wbcr-factory-page-inner-wrap">
|
713 |
-
<div class="wbcr-factory-content-section<?php if( !$this->
|
714 |
<?php $this->showPageSubMenu() ?>
|
715 |
<div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
|
716 |
<form method="post" class="form-horizontal">
|
@@ -720,7 +812,7 @@
|
|
720 |
</form>
|
721 |
</div>
|
722 |
</div>
|
723 |
-
<?php if( $this->
|
724 |
<div class="wbcr-factory-right-sidebar-section">
|
725 |
<?php $this->showRightSidebar(); ?>
|
726 |
</div>
|
@@ -741,12 +833,10 @@
|
|
741 |
<?php
|
742 |
}
|
743 |
|
744 |
-
protected function showPage()
|
745 |
-
{
|
746 |
-
global $factory_impressive_page_menu;
|
747 |
-
?>
|
748 |
<div id="WBCR" class="wrap">
|
749 |
-
<div class="wbcr-factory-pages-
|
750 |
<div class="wbcr-factory-page wbcr-factory-page-<?= $this->id ?>">
|
751 |
<?php $this->showHeader(); ?>
|
752 |
|
@@ -755,20 +845,30 @@
|
|
755 |
</div>
|
756 |
<?php
|
757 |
$min_height = 0;
|
758 |
-
foreach($
|
759 |
if( !isset($page['parent']) || empty($page['parent']) ) {
|
760 |
-
$min_height +=
|
761 |
}
|
762 |
}
|
763 |
?>
|
764 |
<div class="wbcr-factory-page-inner-wrap">
|
765 |
-
<div class="wbcr-factory-content-section<?php if( !$this->
|
766 |
<?php $this->showPageSubMenu() ?>
|
767 |
<div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
|
768 |
<?php $this->printAllNotices(); ?>
|
769 |
-
<?php $
|
|
|
|
|
|
|
|
|
770 |
</div>
|
771 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
772 |
</div>
|
773 |
</div>
|
774 |
<div class="clearfix"></div>
|
@@ -777,98 +877,21 @@
|
|
777 |
</div>
|
778 |
<?php
|
779 |
}
|
780 |
-
|
781 |
/**
|
782 |
-
* @return
|
783 |
*/
|
784 |
-
public function
|
785 |
{
|
786 |
// используется в классе потомке
|
787 |
}
|
788 |
|
789 |
-
|
790 |
-
|
791 |
-
|
792 |
-
|
793 |
-
<div class="wbcr-factory-sidebar-widget">
|
794 |
-
<ul>
|
795 |
-
<li>
|
796 |
-
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
|
797 |
-
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
798 |
-
</span>
|
799 |
-
- <?php _e('A neutral setting that can not harm your site, but you must be sure that you need to use it.', 'wbcr_factory_pages_407'); ?>
|
800 |
-
</li>
|
801 |
-
<li>
|
802 |
-
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
|
803 |
-
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
804 |
-
</span>
|
805 |
-
- <?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_pages_407'); ?>
|
806 |
-
</li>
|
807 |
-
<li>
|
808 |
-
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
|
809 |
-
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
810 |
-
</span>
|
811 |
-
- <?php _e('Absolutely safe setting, We recommend to use.', 'wbcr_factory_pages_407'); ?>
|
812 |
-
</li>
|
813 |
-
</ul>
|
814 |
-
----------<br>
|
815 |
-
|
816 |
-
<p><?php _e('Hover to the icon to get help for the feature you selected.', 'wbcr_factory_pages_407'); ?></p>
|
817 |
-
</div>
|
818 |
-
<?php
|
819 |
-
}
|
820 |
-
|
821 |
-
public function showRatingWidget(array $args)
|
822 |
-
{
|
823 |
-
if( !isset($args[0]) || empty($args[0]) ) {
|
824 |
-
$page_url = "https://goo.gl/tETE2X";
|
825 |
-
} else {
|
826 |
-
$page_url = $args[0];
|
827 |
-
}
|
828 |
-
|
829 |
-
$page_url = apply_filters('wbcr_factory_pages_407_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId());
|
830 |
-
|
831 |
-
?>
|
832 |
-
<div class="wbcr-factory-sidebar-widget">
|
833 |
-
<p>
|
834 |
-
<strong><?php _e('Do you want the plugin to improved and update?', 'wbcr_factory_pages_407'); ?></strong>
|
835 |
-
</p>
|
836 |
-
|
837 |
-
<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_pages_407'); ?></p>
|
838 |
-
|
839 |
-
<p><?php _e('And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_pages_407'); ?></p>
|
840 |
-
|
841 |
-
<p>
|
842 |
-
<i class="wbcr-factory-icon-5stars"></i>
|
843 |
-
<a href="<?= $page_url ?>" title="Go rate us" target="_blank">
|
844 |
-
<strong><?php _e('Go rate us and push ideas', 'wbcr_factory_pages_407'); ?></strong>
|
845 |
-
</a>
|
846 |
-
</p>
|
847 |
-
</div>
|
848 |
-
<?php
|
849 |
-
}
|
850 |
-
|
851 |
-
public function showDonateWidget()
|
852 |
{
|
853 |
-
|
854 |
-
<div class="wbcr-factory-sidebar-widget">
|
855 |
-
<p>
|
856 |
-
<strong><?php _e('Donation for plugin development', 'wbcr_factory_pages_407'); ?></strong>
|
857 |
-
</p>
|
858 |
-
|
859 |
-
<?php if( get_locale() !== 'ru_RU' ): ?>
|
860 |
-
<form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
|
861 |
-
<input type="hidden" name="cmd" value="_s-xclick">
|
862 |
-
<input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
|
863 |
-
|
864 |
-
<div class="wbcr-factory-donation-price">5$</div>
|
865 |
-
<input type="image" src="<?= FACTORY_PAGES_407_URL ?>/templates/assets/img/paypal-donate.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
|
866 |
-
</form>
|
867 |
-
<?php else: ?>
|
868 |
-
<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>
|
869 |
-
<?php endif; ?>
|
870 |
-
</div>
|
871 |
-
<?php
|
872 |
}
|
873 |
|
874 |
/**
|
@@ -881,7 +904,7 @@
|
|
881 |
{
|
882 |
?>
|
883 |
<div id="WBCR" class="wrap">
|
884 |
-
<div class="wbcr-factory-pages-
|
885 |
<div id="wbcr-factory-confirm-dialog">
|
886 |
<h2><?php echo $data['title'] ?></h2>
|
887 |
|
14 |
exit;
|
15 |
}
|
16 |
|
17 |
+
if( !class_exists('Wbcr_FactoryPages410_ImpressiveThemplate') ) {
|
18 |
/**
|
19 |
+
* Class Wbcr_FactoryPages410_ImpressiveThemplate
|
|
|
|
|
|
|
|
|
20 |
*/
|
21 |
+
abstract class Wbcr_FactoryPages410_ImpressiveThemplate extends Wbcr_FactoryPages410_AdminPage {
|
22 |
|
23 |
//public $menu_target = 'options-general.php';
|
24 |
|
26 |
* @var bool
|
27 |
*/
|
28 |
public $internal = true;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* @var bool
|
32 |
+
*/
|
33 |
+
public $network = false;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @var bool
|
37 |
+
*/
|
38 |
+
public $available_for_multisite = false;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @var bool
|
42 |
+
*/
|
43 |
+
//public $only_for_network = false;
|
44 |
|
45 |
/**
|
46 |
* Тип страницы
|
67 |
*/
|
68 |
public $page_menu_dashicon;
|
69 |
|
70 |
+
/**
|
71 |
+
*
|
72 |
+
* @var
|
73 |
+
*/
|
74 |
+
public $page_menu_short_description;
|
75 |
+
|
76 |
/**
|
77 |
* Позиция закладки в меню плагина.
|
78 |
* 0 - в самом конце, 100 - в самом начале
|
103 |
* @var bool
|
104 |
*/
|
105 |
public $show_bottom_sidebar = true;
|
106 |
+
|
107 |
+
/**
|
108 |
+
* @var array
|
109 |
+
*/
|
110 |
+
public $page_menu = array();
|
111 |
|
112 |
/**
|
113 |
+
* @param Wbcr_Factory409_Plugin $plugin
|
114 |
*/
|
115 |
+
public function __construct(Wbcr_Factory409_Plugin $plugin)
|
116 |
{
|
117 |
+
$this->menuIcon = FACTORY_PAGES_410_URL . '/templates/assets/img/webcraftic-plugin-icon.png';
|
118 |
+
//$allow_multisite = apply_filters('wbcr_factory_409_core_admin_allow_multisite', false);
|
119 |
+
|
120 |
+
if( is_multisite() && $this->available_for_multisite && $plugin->isNetworkActive() ) {
|
121 |
+
$this->network = true;
|
122 |
+
$this->menu_target = 'settings.php';
|
123 |
+
$this->capabilitiy = 'manage_network';
|
124 |
+
}
|
125 |
|
126 |
parent::__construct($plugin);
|
127 |
|
128 |
+
$this->title_plugin_action_link = __('Settings', 'wbcr_factory_pages_410');
|
129 |
+
|
130 |
+
$this->setPageMenu();
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Set page menu item
|
135 |
+
*/
|
136 |
+
public function setPageMenu()
|
137 |
+
{
|
138 |
global $factory_impressive_page_menu;
|
139 |
+
|
140 |
+
$dashicon = (!empty($this->page_menu_dashicon)) ? ' ' . $this->page_menu_dashicon : '';
|
141 |
+
$short_description = (!empty($this->page_menu_short_description)) ? ' ' . $this->page_menu_short_description : '';
|
142 |
+
|
143 |
+
if( is_multisite() && is_network_admin() && !$this->network ) {
|
144 |
+
return;
|
145 |
+
}
|
146 |
+
|
|
|
|
|
|
|
|
|
147 |
$factory_impressive_page_menu[$this->getMenuScope()][$this->getResultId()] = array(
|
148 |
'type' => $this->type, // page, options
|
149 |
'url' => $this->getBaseUrl(),
|
150 |
+
'title' => $this->getPageTitle() . ' <span class="dashicons' . $dashicon . '"></span>',
|
151 |
+
'short_description' => $short_description,
|
152 |
'position' => $this->page_menu_position,
|
153 |
'parent' => $this->page_parent_page
|
154 |
);
|
155 |
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Get page menu items
|
159 |
+
*
|
160 |
+
* @return mixed
|
161 |
+
*/
|
162 |
+
public function getPageMenu()
|
163 |
{
|
164 |
+
global $factory_impressive_page_menu;
|
165 |
+
|
166 |
+
return $factory_impressive_page_menu[$this->getMenuScope()];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
167 |
}
|
168 |
|
169 |
/**
|
170 |
* Requests assets (js and css) for the page.
|
171 |
*
|
172 |
+
* @see FactoryPages410_AdminPage
|
173 |
*
|
174 |
* @since 1.0.0
|
175 |
* @return void
|
193 |
'control.checkbox'
|
194 |
), 'bootstrap');
|
195 |
|
196 |
+
$this->styles->add(FACTORY_PAGES_410_URL . '/templates/assets/css/impressive.page.template.css');
|
|
|
197 |
}
|
198 |
|
199 |
/**
|
200 |
+
* Получает заголовок плагина (обычно используется для брендинга)
|
201 |
+
*
|
202 |
* @return string
|
203 |
*/
|
204 |
+
public function getPluginTitle()
|
205 |
{
|
206 |
+
/**
|
207 |
+
* @since 4.0.8 - добавлен
|
208 |
+
* @since 4.0.9 - является устаревшим
|
209 |
+
*/
|
210 |
+
$plugin_title = wbcr_factory_409_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');
|
214 |
|
215 |
+
/**
|
216 |
+
* @since 4.0.9 - является устаревшим
|
217 |
+
*/
|
218 |
+
$plugin_title = apply_filters('wbcr/factory/pages/impressive/plugin_title', $plugin_title, $this->plugin->getPluginName());
|
219 |
+
|
220 |
+
return $plugin_title;
|
221 |
}
|
222 |
|
223 |
/**
|
224 |
+
* Получает полную ссылку текущей страницы
|
225 |
+
*
|
226 |
* @return string
|
227 |
*/
|
228 |
+
public function getPageUrl()
|
229 |
{
|
230 |
+
/**
|
231 |
+
* @since 4.0.9 - добавлен
|
232 |
+
*/
|
233 |
+
return apply_filters('wbcr/factory/pages/impressive/base_url', $this->getBaseUrl(), $this->plugin->getPluginName(), $this->id);
|
234 |
}
|
235 |
|
236 |
/**
|
237 |
+
* Пространство имен для меню плагина
|
238 |
+
* Можно приклеить меню к другому плагину, просто перезаписав этот метод в дочернем классе
|
239 |
+
*
|
240 |
* @return string
|
241 |
*/
|
242 |
+
public function getMenuScope()
|
243 |
{
|
244 |
+
/**
|
245 |
+
* @since 4.0.9 - добавлен
|
246 |
+
*/
|
247 |
+
return apply_filters('wbcr/factory/pages/impressive/menu_scope', $this->plugin->getPluginName(), $this->plugin->getPluginName(), $this->id);
|
248 |
}
|
249 |
|
250 |
/**
|
255 |
*/
|
256 |
public function getOption($option_name, $default = false)
|
257 |
{
|
258 |
+
_deprecated_function(__METHOD__, '4.0.9', '$this->plugin->getOption()');
|
259 |
+
|
260 |
return $this->plugin->getOption($option_name, $default);
|
261 |
}
|
262 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
/**
|
264 |
* Shows a page or options
|
265 |
*
|
268 |
*/
|
269 |
public function indexAction()
|
270 |
{
|
271 |
+
$page_menu = $this->getPageMenu();
|
272 |
+
if( 'options' === $page_menu[$this->getResultId()]['type'] ) {
|
|
|
273 |
$this->showOptions();
|
274 |
} else {
|
275 |
$this->showPage();
|
286 |
{
|
287 |
check_admin_referer('wbcr_factory_' . $this->getResultId() . '_flush_action');
|
288 |
|
289 |
+
if( class_exists('WbcrFactoryClearfy206_Helpers') ) {
|
290 |
+
WbcrFactoryClearfy206_Helpers::flushPageCache();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
291 |
}
|
292 |
|
293 |
+
/**
|
294 |
+
* @since 4.0.1 - является устаревшим
|
295 |
+
*/
|
296 |
+
wbcr_factory_409_do_action_deprecated('wbcr_factory_409_imppage_flush_cache', array(
|
297 |
$this->plugin->getPluginName(),
|
298 |
$this->getResultId()
|
299 |
+
), '4.0.1', 'wbcr_factory_409_imppage_after_form_save');
|
300 |
+
|
301 |
+
/**
|
302 |
+
* @since 4.0.9 - является устаревшим
|
303 |
+
*/
|
304 |
+
wbcr_factory_409_do_action_deprecated('wbcr_factory_409_imppage_after_form_save', array(
|
305 |
+
$this->plugin,
|
306 |
+
$this
|
307 |
+
), '4.0.9', 'wbcr/factory/pages/impressive/after_form_save');
|
308 |
|
309 |
/**
|
310 |
+
* @since 4.0.1 - добавлен
|
311 |
+
* @since 4.0.9 - изменено название экшена, без привязки к версии фреймворка
|
312 |
*/
|
313 |
+
do_action('wbcr/factory/pages/impressive/after_form_save', $this->plugin, $this);
|
314 |
|
315 |
$this->afterFormSave();
|
316 |
|
317 |
+
$redirect_args = array(
|
318 |
$this->plugin->getPluginName() . '_saved' => 1
|
319 |
+
);
|
320 |
+
/**
|
321 |
+
* @since 4.0.9 - является устаревшим
|
322 |
+
*/
|
323 |
+
$redirect_args = wbcr_factory_409_apply_filters_deprecated('wbcr_factory_409_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 - добавлен
|
327 |
+
* @since 4.0.9 - изменено название экшена, без привязки к версии фреймворка
|
328 |
+
*/
|
329 |
+
$redirect_args = apply_filters('wbcr/factory/pages/impressive/save_redirect_args', $redirect_args);
|
330 |
+
|
331 |
+
$this->redirectToAction('index', $redirect_args);
|
332 |
}
|
333 |
|
334 |
|
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_410'));
|
342 |
}*/
|
343 |
// Метод предназначен для вызова в дочернем классе
|
344 |
}
|
404 |
echo '<div class="alert alert-success wbcr-factory-warning-notice"><p><span class="dashicons dashicons-plus"></span> ' . $message . '</p></div>';
|
405 |
}
|
406 |
|
407 |
+
/**
|
408 |
+
* Печатает все зарегистрированные системные уведомления внутри интерфейса плагина
|
409 |
+
* Типы уведомлений: предупреждения, ошибки, успешные выполнения задач
|
410 |
+
*/
|
411 |
protected function printAllNotices()
|
412 |
{
|
413 |
$this->warningNotice();
|
414 |
$this->showActionsNotice();
|
415 |
|
416 |
/**
|
417 |
+
* @since 4.0.9 - является устаревшим
|
418 |
+
*/
|
419 |
+
wbcr_factory_409_do_action_deprecated('wbcr_factory_pages_410_imppage_print_all_notices', array(
|
420 |
+
$this->plugin,
|
421 |
+
$this
|
422 |
+
), '4.0.9', 'wbcr/factory/pages/impressive/print_all_notices');
|
423 |
+
|
424 |
+
/**
|
425 |
+
* @since 4.0.1 - добавлен
|
426 |
+
* @since 4.0.9 - изменено имя
|
427 |
*/
|
428 |
+
do_action('wbcr/factory/pages/impressive/print_all_notices', $this->plugin, $this);
|
429 |
}
|
430 |
|
431 |
private function showActionsNotice()
|
436 |
$this->plugin->getPluginName() . '_saved' => '1'
|
437 |
),
|
438 |
'type' => 'success',
|
439 |
+
'message' => __('The settings have been updated successfully!', 'wbcr_factory_pages_410') . (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_410') : '')
|
|
|
|
|
440 |
)
|
441 |
);
|
442 |
+
|
443 |
+
/**
|
444 |
+
* @since 4.0.9 - является устаревшим
|
445 |
+
*/
|
446 |
+
$notices = wbcr_factory_409_apply_filters_deprecated('wbcr_factory_pages_410_imppage_actions_notice', array(
|
447 |
+
$notices,
|
448 |
+
$this->plugin,
|
449 |
+
$this->id
|
450 |
+
), '4.0.9', 'wbcr/factory/pages/impressive/actions_notice');
|
451 |
+
|
452 |
+
/**
|
453 |
+
* @since 4.0.1 - добавлен
|
454 |
+
* @since 4.0.9 - изменено имя
|
455 |
+
*/
|
456 |
+
$notices = apply_filters('wbcr/factory/pages/impressive/actions_notice', $notices, $this->plugin, $this->id);
|
457 |
+
|
458 |
$notices = $this->getActionNotices($notices);
|
459 |
|
460 |
foreach($notices as $key => $notice) {
|
471 |
continue;
|
472 |
}
|
473 |
|
474 |
+
$notice_type = isset($notice['type']) ? $notice['type'] : 'success';
|
|
|
|
|
475 |
|
476 |
switch( $notice_type ) {
|
477 |
case 'success':
|
489 |
|
490 |
protected function showPageMenu()
|
491 |
{
|
492 |
+
$page_menu = $this->getPageMenu();
|
|
|
|
|
493 |
$self_page_id = $this->getResultId();
|
494 |
+
$current_page = isset($page_menu[$self_page_id]) ? $page_menu[$self_page_id] : null;
|
495 |
+
|
496 |
+
$parent_page_id = !empty($current_page['parent']) ? $this->getResultId($current_page['parent']) : null;
|
497 |
+
|
|
|
|
|
|
|
|
|
498 |
uasort($page_menu, array($this, 'pageMenuSort'));
|
499 |
?>
|
500 |
<ul>
|
509 |
}
|
510 |
?>
|
511 |
<li class="wbcr-factory-nav-tab<?= $active_tab ?>">
|
512 |
+
<a href="<?php echo $page['url'] ?>" id="<?= $page_screen ?>-tab" class="wbcr-factory-tab__link">
|
513 |
+
<div class="wbcr-factory-tab__title">
|
514 |
+
<?php echo $page['title'] ?>
|
515 |
+
</div>
|
516 |
+
<?php if( !empty($page['short_description']) ): ?>
|
517 |
+
<div class="wbcr-factory-tab__short-description">
|
518 |
+
<?php echo $page['short_description'] ?>
|
519 |
+
</div>
|
520 |
+
<?php endif; ?>
|
521 |
</a>
|
522 |
</li>
|
523 |
<?php endforeach; ?>
|
537 |
|
538 |
protected function showPageSubMenu()
|
539 |
{
|
|
|
540 |
$self_page_id = $this->getResultId();
|
541 |
+
$page_menu = $this->getPageMenu();
|
542 |
+
$current_page = isset($page_menu[$self_page_id]) ? $page_menu[$self_page_id] : null;
|
|
|
|
|
543 |
|
544 |
$page_submenu = array();
|
545 |
foreach($page_menu as $page_screen => $page) {
|
559 |
|
560 |
$get_menu_id = null;
|
561 |
$has_parent = !empty($current_page) && !empty($current_page['parent']);
|
562 |
+
$parent_page_id = $has_parent ? $this->getResultId($current_page['parent']) : null;
|
|
|
|
|
563 |
|
564 |
if( ($has_parent && isset($page_submenu[$parent_page_id])) ) {
|
565 |
$get_menu_id = $parent_page_id;
|
599 |
protected function showHeader()
|
600 |
{
|
601 |
?>
|
602 |
+
<style>
|
603 |
+
.updated, .notice, .error {
|
604 |
+
display: none !important;
|
605 |
+
}
|
606 |
+
</style>
|
607 |
<div class="wbcr-factory-page-header">
|
608 |
<div class="wbcr-factory-header-logo"><?= $this->getPluginTitle(); ?>
|
609 |
<span class="version"><?= $this->plugin->getPluginVersion() ?> </span>
|
614 |
<h2><?php _e('Page') ?>: <?= $this->getPageTitle() ?></h2>
|
615 |
</div>
|
616 |
<?php endif; ?>
|
617 |
+
|
618 |
+
<div class="wbcr-factory-control">
|
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_410'); ?>">
|
623 |
+
|
624 |
+
<?php wp_nonce_field('wbcr_factory_' . $this->getResultId() . '_save_action'); ?>
|
625 |
+
<?php endif; ?>
|
626 |
+
</div>
|
627 |
</div>
|
628 |
<?php
|
629 |
}
|
630 |
+
|
631 |
+
protected function isShowRightSidebar()
|
632 |
+
{
|
633 |
+
$widgets = $this->getPageWidgets('right');
|
634 |
+
|
635 |
+
return !empty($widgets) && $this->show_right_sidebar_in_options;
|
636 |
+
}
|
637 |
|
638 |
protected function showRightSidebar()
|
639 |
{
|
642 |
if( empty($widgets) ) {
|
643 |
return;
|
644 |
}
|
645 |
+
|
646 |
foreach($widgets as $widget_content):
|
647 |
echo $widget_content;
|
648 |
endforeach;
|
667 |
<?php
|
668 |
}
|
669 |
|
670 |
+
/**
|
671 |
+
* @param string $position
|
672 |
+
* @return mixed|void
|
673 |
+
*/
|
674 |
protected function getPageWidgets($position = 'bottom')
|
675 |
{
|
676 |
+
$widgets = array();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
677 |
|
678 |
+
/**
|
679 |
+
* @since 4.0.9 - является устаревшим
|
680 |
+
*/
|
681 |
+
$widgets = wbcr_factory_409_apply_filters_deprecated('wbcr_factory_pages_410_imppage_get_widgets', array(
|
682 |
+
$widgets,
|
683 |
+
$position,
|
684 |
+
$this->plugin,
|
685 |
+
$this
|
686 |
+
), '4.0.9', 'wbcr/factory/pages/impressive/widgets');
|
687 |
|
688 |
+
/**
|
689 |
+
* @since 4.0.1 - добавлен
|
690 |
+
* @since 4.0.9 - изменено имя
|
691 |
+
*/
|
692 |
+
$widgets = apply_filters('wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this);
|
693 |
+
|
694 |
+
return $widgets;
|
695 |
}
|
696 |
+
|
|
|
|
|
|
|
697 |
protected function showOptions()
|
698 |
{
|
699 |
+
$form = new Wbcr_FactoryForms410_Form(array(
|
|
|
|
|
|
|
700 |
'scope' => rtrim($this->plugin->getPrefix(), '_'),
|
701 |
'name' => $this->getResultId() . "-options"
|
702 |
), $this->plugin);
|
703 |
|
704 |
+
$form->setProvider(new Wbcr_FactoryForms410_OptionsValueProvider($this->plugin));
|
705 |
|
706 |
+
$options = $this->getPageOptions();
|
707 |
|
708 |
if( isset($options[0]) && isset($options[0]['items']) && is_array($options[0]['items']) ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
709 |
foreach($options[0]['items'] as $key => $value) {
|
710 |
|
711 |
if( $value['type'] == 'div' ) {
|
712 |
if( isset($options[0]['items'][$key]['items']) && !empty($options[0]['items'][$key]['items']) ) {
|
713 |
foreach($options[0]['items'][$key]['items'] as $group_key => $group_value) {
|
714 |
+
$options[0]['items'][$key]['items'][$group_key]['layout']['column-left'] = '4';
|
715 |
+
$options[0]['items'][$key]['items'][$group_key]['layout']['column-right'] = '8';
|
716 |
}
|
717 |
|
718 |
continue;
|
725 |
'integer',
|
726 |
'textbox',
|
727 |
'dropdown',
|
728 |
+
'list',
|
729 |
+
'wp-editor'
|
730 |
)) ) {
|
731 |
+
$options[0]['items'][$key]['layout']['column-left'] = '4';
|
732 |
+
$options[0]['items'][$key]['layout']['column-right'] = '8';
|
733 |
}
|
734 |
}
|
735 |
}
|
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_410'));
|
745 |
exit;
|
746 |
}
|
747 |
|
748 |
+
/**
|
749 |
+
* @since 4.0.9 - является устаревшим
|
750 |
+
*/
|
751 |
+
wbcr_factory_409_do_action_deprecated('wbcr_factory_409_imppage_before_form_save', array(
|
752 |
$form,
|
753 |
+
$this->plugin,
|
754 |
+
$this
|
755 |
+
), '4.0.9', 'wbcr/factory/pages/impressive/before_form_save');
|
756 |
|
757 |
+
/**
|
758 |
+
* @since 4.0.1 - добавлен
|
759 |
+
* @since 4.0.9 - изменено имя
|
760 |
+
*/
|
761 |
+
do_action('wbcr/factory/pages/impressive/before_form_save', $form, $this->plugin, $this);
|
762 |
|
763 |
$this->beforeFormSave();
|
764 |
|
765 |
$form->save();
|
766 |
|
767 |
+
/**
|
768 |
+
* @since 4.0.9 - является устаревшим
|
769 |
+
*/
|
770 |
+
wbcr_factory_409_do_action_deprecated('wbcr_factory_409_imppage_form_saved', array(
|
771 |
$form,
|
772 |
+
$this->plugin,
|
773 |
+
$this
|
774 |
+
), '4.0.9', 'wbcr/factory/pages/impressive/form_saved');
|
775 |
+
|
776 |
+
/**
|
777 |
+
* @since 4.0.1 - добавлен
|
778 |
+
* @since 4.0.9 - изменено имя
|
779 |
+
*/
|
780 |
+
do_action('wbcr/factory/pages/impressive/form_saved', $form, $this->plugin, $this);
|
781 |
|
782 |
$this->formSaved();
|
783 |
|
788 |
|
789 |
?>
|
790 |
<div id="WBCR" class="wrap">
|
791 |
+
<div class="wbcr-factory-pages-410-impressive-page-template factory-bootstrap-409 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() ?>
|
795 |
</div>
|
796 |
<?php
|
797 |
$min_height = 0;
|
798 |
+
foreach($this->getPageMenu() as $page) {
|
799 |
if( !isset($page['parent']) || empty($page['parent']) ) {
|
800 |
+
$min_height += 77;
|
801 |
}
|
802 |
}
|
803 |
?>
|
804 |
<div class="wbcr-factory-page-inner-wrap">
|
805 |
+
<div class="wbcr-factory-content-section<?php if( !$this->isShowRightSidebar() ): echo ' wbcr-fullwidth'; endif ?>">
|
806 |
<?php $this->showPageSubMenu() ?>
|
807 |
<div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
|
808 |
<form method="post" class="form-horizontal">
|
812 |
</form>
|
813 |
</div>
|
814 |
</div>
|
815 |
+
<?php if( $this->isShowRightSidebar() ): ?>
|
816 |
<div class="wbcr-factory-right-sidebar-section">
|
817 |
<?php $this->showRightSidebar(); ?>
|
818 |
</div>
|
833 |
<?php
|
834 |
}
|
835 |
|
836 |
+
protected function showPage($content = null)
|
837 |
+
{ ?>
|
|
|
|
|
838 |
<div id="WBCR" class="wrap">
|
839 |
+
<div class="wbcr-factory-pages-410-impressive-page-template factory-bootstrap-409 factory-fontawesome-000">
|
840 |
<div class="wbcr-factory-page wbcr-factory-page-<?= $this->id ?>">
|
841 |
<?php $this->showHeader(); ?>
|
842 |
|
845 |
</div>
|
846 |
<?php
|
847 |
$min_height = 0;
|
848 |
+
foreach($this->getPageMenu() as $page) {
|
849 |
if( !isset($page['parent']) || empty($page['parent']) ) {
|
850 |
+
$min_height += 77;
|
851 |
}
|
852 |
}
|
853 |
?>
|
854 |
<div class="wbcr-factory-page-inner-wrap">
|
855 |
+
<div class="wbcr-factory-content-section<?php if( !$this->isShowRightSidebar() ): echo ' wbcr-fullwidth'; endif ?>">
|
856 |
<?php $this->showPageSubMenu() ?>
|
857 |
<div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
|
858 |
<?php $this->printAllNotices(); ?>
|
859 |
+
<?php if( empty($content) ): ?>
|
860 |
+
<?php $this->showPageContent() ?>
|
861 |
+
<?php else: ?>
|
862 |
+
<?php echo $content; ?>
|
863 |
+
<?php endif; ?>
|
864 |
</div>
|
865 |
</div>
|
866 |
+
|
867 |
+
<?php if( $this->isShowRightSidebar() ): ?>
|
868 |
+
<div class="wbcr-factory-right-sidebar-section" style="min-height:<?= $min_height ?>px">
|
869 |
+
<?php $this->showRightSidebar(); ?>
|
870 |
+
</div>
|
871 |
+
<?php endif; ?>
|
872 |
</div>
|
873 |
</div>
|
874 |
<div class="clearfix"></div>
|
877 |
</div>
|
878 |
<?php
|
879 |
}
|
880 |
+
|
881 |
/**
|
882 |
+
* @return array
|
883 |
*/
|
884 |
+
public function getPageOptions()
|
885 |
{
|
886 |
// используется в классе потомке
|
887 |
}
|
888 |
|
889 |
+
/**
|
890 |
+
* @return void
|
891 |
+
*/
|
892 |
+
public function showPageContent()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
893 |
{
|
894 |
+
// используется в классе потомке
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
895 |
}
|
896 |
|
897 |
/**
|
904 |
{
|
905 |
?>
|
906 |
<div id="WBCR" class="wrap">
|
907 |
+
<div class="wbcr-factory-pages-410-impressive-page-template factory-bootstrap-409 factory-fontawesome-000">
|
908 |
<div id="wbcr-factory-confirm-dialog">
|
909 |
<h2><?php echo $data['title'] ?></h2>
|
910 |
|
libs/factory/pages/templates/index.php
ADDED
File without changes
|
readme.txt
CHANGED
@@ -3,7 +3,7 @@ Tags: image, optimizer, image optimization, resmush.it, smush, jpg, png, gif, op
|
|
3 |
Contributors: webcraftic
|
4 |
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VDX7JNTQPNPFW
|
5 |
Requires at least: 4.2
|
6 |
-
Tested up to:
|
7 |
Requires PHP: 5.3
|
8 |
Stable tag: trunk
|
9 |
License: GPLv2
|
@@ -52,8 +52,7 @@ We invite you to check out a few other related free plugins that our team has al
|
|
52 |
* [Hide login page](https://wordpress.org/plugins/hide-login-page/ "Hide login page")
|
53 |
|
54 |
#### Thanks the authors of plugins ####
|
55 |
-
We used some useful functions from plugins **Imagify Image Optimizer**, **Smush Image Compression and Optimization**, **EWWW Image Optimizer**, **reSmush.it Image Optimizer**, **ShortPixel Image Optimizer
|
56 |
-
|
57 |
|
58 |
== Translations ==
|
59 |
|
@@ -95,24 +94,46 @@ Yes. By enabling the backup feature in the plugin, you can re-optimize any image
|
|
95 |
2. The simple interface
|
96 |
|
97 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
= 1.0.8 =
|
99 |
* Added: Ability to re-optimize images with errors.
|
100 |
* Fixed: Some bugs
|
101 |
* Added: An alternative server for image optimization. Now you can select an alternative optimization server if the current server is unavailable.
|
102 |
* Fixed: Problems with translations
|
|
|
103 |
= 1.0.7
|
104 |
* Fixed: Images are saved in a size 0 bytes
|
105 |
* Fixed: Trying to backup file with empty filename
|
106 |
* Fixed: Curl replacement for file_get_contents
|
107 |
* Fixed: Statistics
|
|
|
108 |
= 1.0.6 =
|
109 |
* Fixed: fixed bar progress styles
|
110 |
* Fixed: changed the link to the reviews page
|
|
|
111 |
= 1.0.5 =
|
112 |
* Fixed: corrected image size calculations for individual optimization
|
|
|
113 |
= 1.0.4 =
|
114 |
* Fixed: update core framework
|
|
|
115 |
= 1.0.3 =
|
116 |
* Fixed: small bugs
|
|
|
117 |
= 1.0.0 =
|
118 |
* Release
|
3 |
Contributors: webcraftic
|
4 |
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VDX7JNTQPNPFW
|
5 |
Requires at least: 4.2
|
6 |
+
Tested up to: 5.0
|
7 |
Requires PHP: 5.3
|
8 |
Stable tag: trunk
|
9 |
License: GPLv2
|
52 |
* [Hide login page](https://wordpress.org/plugins/hide-login-page/ "Hide login page")
|
53 |
|
54 |
#### Thanks the authors of plugins ####
|
55 |
+
We used some useful functions from plugins **Imagify Image Optimizer**, **Smush Image Compression and Optimization**, **EWWW Image Optimizer**, **reSmush.it Image Optimizer**, **ShortPixel Image Optimizer**.
|
|
|
56 |
|
57 |
== Translations ==
|
58 |
|
94 |
2. The simple interface
|
95 |
|
96 |
== Changelog ==
|
97 |
+
= 1.0.5 =
|
98 |
+
* Fixed: Added compatibility with ithemes sync
|
99 |
+
|
100 |
+
= 1.1.3 =
|
101 |
+
* Fixed: Compatibility with W3 total cache
|
102 |
+
* Fixed: Compatibility with External Media without Import
|
103 |
+
|
104 |
+
= 1.1.2 =
|
105 |
+
* Fixed: Some bugs
|
106 |
+
* Fixed: Removed limit on image resizing
|
107 |
+
* Fixed: Update core framework
|
108 |
+
* Added: New free server
|
109 |
+
* Added: Servers status, you can select available servers to optimize images
|
110 |
+
* Added: Added compatibility with the plugin Clearfy
|
111 |
+
* Preparing plugin for multisite support
|
112 |
+
|
113 |
= 1.0.8 =
|
114 |
* Added: Ability to re-optimize images with errors.
|
115 |
* Fixed: Some bugs
|
116 |
* Added: An alternative server for image optimization. Now you can select an alternative optimization server if the current server is unavailable.
|
117 |
* Fixed: Problems with translations
|
118 |
+
|
119 |
= 1.0.7
|
120 |
* Fixed: Images are saved in a size 0 bytes
|
121 |
* Fixed: Trying to backup file with empty filename
|
122 |
* Fixed: Curl replacement for file_get_contents
|
123 |
* Fixed: Statistics
|
124 |
+
|
125 |
= 1.0.6 =
|
126 |
* Fixed: fixed bar progress styles
|
127 |
* Fixed: changed the link to the reviews page
|
128 |
+
|
129 |
= 1.0.5 =
|
130 |
* Fixed: corrected image size calculations for individual optimization
|
131 |
+
|
132 |
= 1.0.4 =
|
133 |
* Fixed: update core framework
|
134 |
+
|
135 |
= 1.0.3 =
|
136 |
* Fixed: small bugs
|
137 |
+
|
138 |
= 1.0.0 =
|
139 |
* Release
|
robin-image-optimizer.php
CHANGED
@@ -4,10 +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: image-optimizer
|
9 |
* Domain Path: /languages/
|
10 |
* Author URI: https://clearfy.pro
|
|
|
11 |
*/
|
12 |
|
13 |
// Exit if accessed directly
|
@@ -15,71 +16,96 @@
|
|
15 |
exit;
|
16 |
}
|
17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
/**
|
19 |
-
*
|
20 |
-
* Мы блокируем работу этого плагина, чтобы не вызывать конфликт.
|
21 |
*/
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
add_action('admin_notices', 'wbcr_wio_admin_notice_error');
|
33 |
|
|
|
|
|
|
|
|
|
|
|
34 |
return;
|
35 |
-
} else {
|
36 |
-
|
37 |
-
// Устанавливаем контстанту, что плагин уже используется
|
38 |
-
define('WIO_PLUGIN_ACTIVE', true);
|
39 |
-
|
40 |
-
// Директория плагина
|
41 |
-
define('WIO_PLUGIN_DIR', dirname(__FILE__));
|
42 |
-
|
43 |
-
// Относительный путь к плагину
|
44 |
-
define('WIO_PLUGIN_BASE', plugin_basename(__FILE__));
|
45 |
-
|
46 |
-
// Ссылка к директории плагина
|
47 |
-
define('WIO_PLUGIN_URL', plugins_url(null, __FILE__));
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
// Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
|
52 |
-
// а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
|
53 |
-
// Константа LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON утсанавливается в классе libs/factory/core/includes/Wbcr_Factory406_Plugin
|
54 |
-
|
55 |
-
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ) {
|
56 |
-
// Фреймворк - отвечает за интерфейс, содержит общие функции для серии плагинов и готовые шаблоны для быстрого развертывания плагина.
|
57 |
-
require_once(WIO_PLUGIN_DIR . '/libs/factory/core/boot.php');
|
58 |
-
}
|
59 |
-
|
60 |
-
// Основной класс плагина
|
61 |
-
require_once(WIO_PLUGIN_DIR . '/includes/class.plugin.php');
|
62 |
-
|
63 |
-
// Класс WIO_Plugin создается только, если этот плагин работает, как самостоятельный плагин.
|
64 |
-
// Если плагин работает, как аддон, то класс создается родительским плагином.
|
65 |
-
|
66 |
-
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ) {
|
67 |
-
new WIO_Plugin(__FILE__, array(
|
68 |
-
'prefix' => 'wbcr_io_',
|
69 |
-
// префикс для базы данных и полей формы
|
70 |
-
'plugin_name' => 'wbcr_image_optimizer',
|
71 |
-
// имя плагина, как уникальный идентификатор
|
72 |
-
'plugin_title' => __('Webcraftic Robin image optimizer', 'robin-image-optimizer'),
|
73 |
-
// заголовок плагина
|
74 |
-
'plugin_version' => '1.0.8',
|
75 |
-
// текущая версия плагина
|
76 |
-
'required_php_version' => '5.2',
|
77 |
-
// минимальная версия php для работы плагина
|
78 |
-
'required_wp_version' => '4.2',
|
79 |
-
// минимальная версия wp для работы плагина
|
80 |
-
'plugin_build' => 'free',
|
81 |
-
// сборка плагина
|
82 |
-
'updates' => WIO_PLUGIN_DIR . '/updates/'
|
83 |
-
));
|
84 |
-
}
|
85 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.1.5
|
8 |
* Text Domain: image-optimizer
|
9 |
* Domain Path: /languages/
|
10 |
* Author URI: https://clearfy.pro
|
11 |
+
* Framework Version: FACTORY_409_VERSION
|
12 |
*/
|
13 |
|
14 |
// Exit if accessed directly
|
16 |
exit;
|
17 |
}
|
18 |
|
19 |
+
define('WIO_PLUGIN_VERSION', '1.1.5');
|
20 |
+
|
21 |
+
// Директория плагина
|
22 |
+
define('WIO_PLUGIN_DIR', dirname(__FILE__));
|
23 |
+
|
24 |
+
// Относительный путь к плагину
|
25 |
+
define('WIO_PLUGIN_BASE', plugin_basename(__FILE__));
|
26 |
+
|
27 |
+
// Ссылка к директории плагина
|
28 |
+
define('WIO_PLUGIN_URL', plugins_url(null, __FILE__));
|
29 |
+
|
30 |
+
// Fix for ithemes sync. When the ithemes sync plugin accepts the request, set the WP_ADMIN constant,
|
31 |
+
// after which the plugin Clearfy begins to create errors, and how the logic of its work is broken.
|
32 |
+
// Solution to simply terminate the plugin if there is a request from ithemes sync
|
33 |
+
// --------------------------------------
|
34 |
+
if( defined('DOING_AJAX') && DOING_AJAX && isset($_REQUEST['action']) && $_REQUEST['action'] == 'ithemes_sync_request' ) {
|
35 |
+
return;
|
36 |
+
}
|
37 |
+
|
38 |
+
if( isset($_GET['ithemes-sync-request']) && !empty($_GET['ithemes-sync-request']) ) {
|
39 |
+
return;
|
40 |
+
}
|
41 |
+
// ----------------------------------------
|
42 |
+
|
43 |
+
|
44 |
+
|
45 |
+
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ) {
|
46 |
+
require_once(WIO_PLUGIN_DIR . '/libs/factory/core/includes/check-compatibility.php');
|
47 |
+
require_once(WIO_PLUGIN_DIR . '/libs/factory/clearfy/includes/check-clearfy-compatibility.php');
|
48 |
+
}
|
49 |
+
|
50 |
+
$plugin_info = array(
|
51 |
+
'prefix' => 'wbcr_io_',
|
52 |
+
// префикс для базы данных и полей формы
|
53 |
+
'plugin_name' => 'wbcr_image_optimizer',
|
54 |
+
// имя плагина, как уникальный идентификатор
|
55 |
+
'plugin_title' => __('Webcraftic Robin image optimizer', 'robin-image-optimizer'),
|
56 |
+
// заголовок плагина
|
57 |
+
'plugin_version' => WIO_PLUGIN_VERSION,
|
58 |
+
// текущая версия плагина
|
59 |
+
'required_php_version' => '5.3',
|
60 |
+
// минимальная версия php для работы плагина
|
61 |
+
'required_wp_version' => '4.2',
|
62 |
+
// минимальная версия wp для работы плагина
|
63 |
+
'plugin_build' => 'free',
|
64 |
+
// сборка плагина
|
65 |
+
'updates' => WIO_PLUGIN_DIR . '/updates/'
|
66 |
+
);
|
67 |
+
|
68 |
/**
|
69 |
+
* Проверяет совместимость с Wordpress, php и другими плагинами.
|
|
|
70 |
*/
|
71 |
+
$compatibility = new Wbcr_FactoryClearfy_Compatibility(array_merge($plugin_info, array(
|
72 |
+
'plugin_already_activate' => defined('WIO_PLUGIN_ACTIVE'),
|
73 |
+
'plugin_as_component' => defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON'),
|
74 |
+
'plugin_dir' => WIO_PLUGIN_DIR,
|
75 |
+
'plugin_base' => WIO_PLUGIN_BASE,
|
76 |
+
'plugin_url' => WIO_PLUGIN_URL,
|
77 |
+
'required_php_version' => '5.3',
|
78 |
+
'required_wp_version' => '4.2.0',
|
79 |
+
'required_clearfy_check_component' => false
|
80 |
+
)));
|
|
|
81 |
|
82 |
+
/**
|
83 |
+
* Если плагин совместим, то он продолжит свою работу, иначе будет остановлен,
|
84 |
+
* а пользователь получит предупреждение.
|
85 |
+
*/
|
86 |
+
if( !$compatibility->check() ) {
|
87 |
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
}
|
89 |
+
|
90 |
+
// Устанавливаем контстанту, что плагин уже используется
|
91 |
+
define('WIO_PLUGIN_ACTIVE', true);
|
92 |
+
|
93 |
+
// Этот плагин может быть аддоном плагина Clearfy, если он загружен, как аддон, то мы не подключаем фреймворк,
|
94 |
+
// а наследуем функции фреймворка от плагина Clearfy. Если плагин скомпилирован, как отдельный плагин, то он использует собственный фреймворк для работы.
|
95 |
+
// Константа LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON утсанавливается в классе libs/factory/core/includes/Wbcr_Factory409_Plugin
|
96 |
+
|
97 |
+
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ) {
|
98 |
+
// Фреймворк - отвечает за интерфейс, содержит общие функции для серии плагинов и готовые шаблоны для быстрого развертывания плагина.
|
99 |
+
require_once(WIO_PLUGIN_DIR . '/libs/factory/core/boot.php');
|
100 |
+
}
|
101 |
+
|
102 |
+
// Основной класс плагина
|
103 |
+
require_once(WIO_PLUGIN_DIR . '/includes/class.plugin.php');
|
104 |
+
|
105 |
+
// Класс WIO_Plugin создается только, если этот плагин работает, как самостоятельный плагин.
|
106 |
+
// Если плагин работает, как аддон, то класс создается родительским плагином.
|
107 |
+
|
108 |
+
if( !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON') ) {
|
109 |
+
new WIO_Plugin(__FILE__, $plugin_info);
|
110 |
+
}
|
111 |
+
|
uninstall.php
CHANGED
@@ -13,5 +13,5 @@
|
|
13 |
|
14 |
// remove backup dir
|
15 |
require_once( dirname( __FILE__ ) . '/includes/classes/class.backup.php' );
|
16 |
-
$backup = new WIO_Backup;
|
17 |
$backup->removeBackupDir();
|
13 |
|
14 |
// remove backup dir
|
15 |
require_once( dirname( __FILE__ ) . '/includes/classes/class.backup.php' );
|
16 |
+
$backup = new WIO_Backup();
|
17 |
$backup->removeBackupDir();
|
updates/{010008.php → 010009.php}
RENAMED
@@ -4,10 +4,10 @@
|
|
4 |
* Updates for altering the table used to store statistics data.
|
5 |
* Adds new columns and renames existing ones in order to add support for the new social buttons.
|
6 |
*/
|
7 |
-
class
|
8 |
|
9 |
public function install()
|
10 |
{
|
11 |
-
WIO_Plugin::app()->updateOption('image_optimization_server', '
|
12 |
}
|
13 |
}
|
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_Factory409_Update {
|
8 |
|
9 |
public function install()
|
10 |
{
|
11 |
+
//WIO_Plugin::app()->updateOption('image_optimization_server', 'server_3');
|
12 |
}
|
13 |
}
|