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

Version Description

Download this release

Release Info

Developer webcraftic
Plugin Icon 128x128 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

Files changed (183) hide show
  1. admin/activation.php +6 -6
  2. admin/ajax/backup.php +66 -0
  3. admin/ajax/check-servers-status.php +56 -0
  4. admin/ajax/optimization.php +46 -0
  5. admin/ajax/select-server.php +31 -0
  6. admin/assets/css/base-statistic.css +82 -5
  7. admin/assets/css/base-statistic.less +109 -11
  8. admin/assets/img/quick-start-loader.gif +0 -0
  9. admin/assets/js/bulk-optimozation.js +13 -9
  10. admin/assets/js/check-servers-status.js +82 -0
  11. admin/assets/js/restore-backup.js +2 -2
  12. admin/assets/js/statistic.js +2 -2
  13. admin/boot.php +39 -4
  14. admin/pages/log.php +42 -12
  15. admin/pages/settings.php +186 -200
  16. admin/pages/statistic.php +255 -142
  17. includes/class.plugin.php +81 -169
  18. includes/classes/class.attachment.php +83 -22
  19. includes/classes/class.backup.php +176 -94
  20. includes/classes/class.cron.php +14 -12
  21. includes/classes/class.image-processor-abstract.php +6 -2
  22. includes/classes/class.image-processor-clearfy1.php +139 -0
  23. includes/classes/class.image-processor-resmush.php +3 -3
  24. includes/classes/class.image-processor-webcraftic.php +110 -0
  25. includes/classes/class.image-statistic.php +1 -0
  26. includes/classes/class.logger.php +1 -1
  27. includes/classes/class.media-library.php +54 -56
  28. includes/classes/class.optimization-tools.php +47 -0
  29. includes/functions.php +63 -19
  30. languages/robin-image-optimizer-ru_RU.po +610 -610
  31. libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css +1 -1
  32. libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css +1 -1
  33. libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css +1 -1
  34. libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css +2 -2
  35. libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css +1 -1
  36. libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css +1 -1
  37. libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css +1 -1
  38. libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css +1 -1
  39. libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css +1 -1
  40. libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css +1 -1
  41. libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css +1 -1
  42. libs/factory/bootstrap/assets/css-min/control.checkbox.min.css +1 -1
  43. libs/factory/bootstrap/assets/css-min/control.dropdown.min.css +1 -1
  44. libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css +1 -1
  45. libs/factory/bootstrap/assets/css-min/holder.more-link.min.css +1 -1
  46. libs/factory/bootstrap/assets/css-min/index.php +0 -0
  47. libs/factory/bootstrap/assets/images/index.php +0 -0
  48. libs/factory/bootstrap/assets/index.php +0 -0
  49. libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js +1 -1
  50. libs/factory/bootstrap/assets/js-min/control.checkbox.min.js +1 -1
  51. libs/factory/bootstrap/assets/js-min/control.dropdown.min.js +1 -1
  52. libs/factory/bootstrap/assets/js-min/control.list.min.js +1 -1
  53. libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js +1 -1
  54. libs/factory/bootstrap/assets/js-min/index.php +0 -0
  55. libs/factory/bootstrap/boot.php +6 -6
  56. libs/factory/bootstrap/includes/functions.php +20 -20
  57. libs/factory/bootstrap/includes/index.php +0 -0
  58. libs/factory/bootstrap/index.php +0 -0
  59. libs/factory/clearfy/assets/css/clearfy-base.css +180 -0
  60. libs/factory/clearfy/assets/css/clearfy-base.less +170 -0
  61. libs/factory/clearfy/assets/css/index.php +0 -0
  62. libs/factory/clearfy/assets/index.php +0 -0
  63. libs/factory/clearfy/assets/js/globals.js +203 -0
  64. libs/factory/clearfy/assets/js/index.php +0 -0
  65. libs/factory/clearfy/boot.php +22 -12
  66. libs/factory/clearfy/includes/check-clearfy-compatibility.php +306 -0
  67. libs/factory/clearfy/includes/class.configurate.php +57 -4
  68. libs/factory/clearfy/includes/class.helpers.php +201 -11
  69. libs/factory/clearfy/includes/index.php +0 -0
  70. libs/factory/clearfy/index.php +0 -0
  71. libs/factory/clearfy/langs/index.php +0 -0
  72. libs/factory/clearfy/langs/wbcr_factory_clearfy_203-fr-FR.mo +0 -0
  73. libs/factory/clearfy/langs/wbcr_factory_clearfy_203-fr-FR.po +0 -129
  74. libs/factory/clearfy/langs/wbcr_factory_clearfy_203-ru_RU.mo +0 -0
  75. libs/factory/clearfy/langs/wbcr_factory_clearfy_203-ru_RU.po +0 -124
  76. libs/factory/clearfy/langs/wbcr_factory_clearfy_206-ru_RU.mo +0 -0
  77. libs/factory/clearfy/langs/wbcr_factory_clearfy_206-ru_RU.po +307 -0
  78. libs/factory/clearfy/pages/class.pages.php +376 -0
  79. libs/factory/clearfy/pages/index.php +0 -0
  80. libs/factory/clearfy/pages/more-features.php +24 -24
  81. libs/factory/core/boot.php +16 -14
  82. libs/factory/core/includes/activation/activator.class.php +5 -144
  83. libs/factory/core/includes/activation/index.php +0 -0
  84. libs/factory/core/includes/activation/update.class.php +4 -4
  85. libs/factory/core/includes/assets-managment/assets-list.class.php +5 -49
  86. libs/factory/core/includes/assets-managment/index.php +0 -0
  87. libs/factory/core/includes/assets-managment/script-list.class.php +86 -14
  88. libs/factory/core/includes/assets-managment/style-list.class.php +41 -4
  89. libs/factory/core/includes/base.class.php +363 -217
  90. libs/factory/core/includes/check-compatibility.php +128 -0
  91. libs/factory/core/includes/functions.php +78 -36
  92. libs/factory/core/includes/index.php +0 -0
  93. libs/factory/core/includes/plugin.class.php +102 -219
  94. libs/factory/core/includes/request.class.php +29 -11
  95. libs/factory/core/index.php +0 -0
  96. libs/factory/core/langs/index.php +0 -0
  97. libs/factory/core/langs/wbcr_factory_409-ru_RU.mo +0 -0
  98. libs/factory/core/langs/wbcr_factory_409-ru_RU.po +128 -0
  99. libs/factory/forms/assets/css/index.php +0 -0
  100. libs/factory/forms/assets/index.php +0 -0
  101. libs/factory/forms/boot.php +96 -94
  102. libs/factory/forms/controls/checkbox.php +4 -4
  103. libs/factory/forms/controls/color-and-opacity.php +4 -4
  104. libs/factory/forms/controls/color.php +2 -2
  105. libs/factory/forms/controls/customs/html.php +2 -2
  106. libs/factory/forms/controls/customs/separator.php +2 -2
  107. libs/factory/forms/controls/datepicker-range.php +4 -4
  108. libs/factory/forms/controls/dropdown-and-colors.php +6 -6
  109. libs/factory/forms/controls/dropdown.php +5 -5
  110. libs/factory/forms/controls/font.php +11 -11
  111. libs/factory/forms/controls/google-font.php +8 -8
  112. libs/factory/forms/controls/gradient.php +4 -4
  113. libs/factory/forms/controls/hidden.php +2 -2
  114. libs/factory/forms/controls/holders/accordion-item.php +2 -2
  115. libs/factory/forms/controls/holders/accordion.php +2 -2
  116. libs/factory/forms/controls/holders/columns.php +2 -2
  117. libs/factory/forms/controls/holders/control-group-item.php +2 -2
  118. libs/factory/forms/controls/holders/control-group.php +3 -3
  119. libs/factory/forms/controls/holders/div.php +2 -2
  120. libs/factory/forms/controls/holders/form-group.php +2 -2
  121. libs/factory/forms/controls/holders/index.php +0 -0
  122. libs/factory/forms/controls/holders/more-link.php +2 -2
  123. libs/factory/forms/controls/holders/tab-item.php +2 -2
  124. libs/factory/forms/controls/holders/tab.php +4 -4
  125. libs/factory/forms/controls/index.php +0 -0
  126. libs/factory/forms/controls/integer.php +2 -2
  127. libs/factory/forms/controls/list.php +4 -4
  128. libs/factory/forms/controls/multiple-textbox.php +3 -3
  129. libs/factory/forms/controls/paddings-editor.php +3 -3
  130. libs/factory/forms/controls/pattern.php +9 -9
  131. libs/factory/forms/controls/radio-colors.php +2 -2
  132. libs/factory/forms/controls/radio.php +2 -2
  133. libs/factory/forms/controls/textarea.php +2 -2
  134. libs/factory/forms/controls/textbox.php +2 -2
  135. libs/factory/forms/controls/url.php +3 -3
  136. libs/factory/forms/controls/wp-editor.php +3 -3
  137. libs/factory/forms/includes/complex-control.class.php +4 -4
  138. libs/factory/forms/includes/control-holder.class.php +5 -5
  139. libs/factory/forms/includes/control.class.php +5 -5
  140. libs/factory/forms/includes/custom-element.class.php +2 -2
  141. libs/factory/forms/includes/form-element.class.php +7 -7
  142. libs/factory/forms/includes/form-layout.class.php +5 -5
  143. libs/factory/forms/includes/form.class.php +49 -53
  144. libs/factory/forms/includes/holder.class.php +6 -6
  145. libs/factory/forms/includes/html-builder.class.php +2 -2
  146. libs/factory/forms/includes/index.php +0 -0
  147. libs/factory/forms/includes/providers/index.php +0 -0
  148. libs/factory/forms/includes/providers/meta-value-provider.class.php +2 -2
  149. libs/factory/forms/includes/providers/options-value-provider.class.php +13 -11
  150. libs/factory/forms/includes/providers/value-provider.interface.php +2 -2
  151. libs/factory/forms/index.php +0 -0
  152. libs/factory/forms/langs/index.php +0 -0
  153. libs/factory/forms/langs/wbcr_factory_forms_407-fr-FR.mo +0 -0
  154. libs/factory/forms/langs/wbcr_factory_forms_407-fr-FR.po +0 -104
  155. libs/factory/forms/langs/{wbcr_factory_forms_407-ru_RU.mo → wbcr_factory_forms_410-ru_RU.mo} +0 -0
  156. libs/factory/forms/langs/{wbcr_factory_forms_407-ru_RU.po → wbcr_factory_forms_410-ru_RU.po} +0 -0
  157. libs/factory/forms/layouts/bootstrap-3/bootstrap-3.php +7 -7
  158. libs/factory/forms/layouts/bootstrap-3/index.php +0 -0
  159. libs/factory/forms/layouts/index.php +0 -0
  160. libs/factory/pages/boot.php +12 -9
  161. libs/factory/pages/includes/admin-page.class.php +74 -51
  162. libs/factory/pages/includes/index.php +0 -0
  163. libs/factory/pages/includes/page.class.php +27 -8
  164. libs/factory/pages/index.php +0 -0
  165. libs/factory/pages/langs/index.php +0 -0
  166. libs/factory/pages/langs/wbcr_factory_pages_407-ru_RU.mo +0 -0
  167. libs/factory/pages/langs/wbcr_factory_pages_407-ru_RU.po +0 -99
  168. libs/factory/pages/langs/{wbcr_factory_pages_407-fr_FR.mo → wbcr_factory_pages_410-fr_FR.mo} +0 -0
  169. libs/factory/pages/langs/{wbcr_factory_pages_407-fr_FR.po → wbcr_factory_pages_410-fr_FR.po} +0 -0
  170. libs/factory/pages/langs/wbcr_factory_pages_410-ru_RU.mo +0 -0
  171. libs/factory/pages/langs/wbcr_factory_pages_410-ru_RU.po +98 -0
  172. libs/factory/pages/pages.php +30 -10
  173. libs/factory/pages/templates/assets/css/impressive.page.template.css +507 -430
  174. libs/factory/pages/templates/assets/css/impressive.page.template.less +136 -42
  175. libs/factory/pages/templates/assets/css/index.php +0 -0
  176. libs/factory/pages/templates/assets/img/index.php +0 -0
  177. libs/factory/pages/templates/assets/index.php +0 -0
  178. libs/factory/pages/templates/impressive-page.class.php +301 -278
  179. libs/factory/pages/templates/index.php +0 -0
  180. readme.txt +24 -3
  181. robin-image-optimizer.php +90 -64
  182. uninstall.php +1 -1
  183. 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 Factory406_Activator
9
  * @version 1.0
10
  */
11
 
@@ -14,7 +14,7 @@
14
  exit;
15
  }
16
 
17
- class WIO_Activation extends Wbcr_Factory406_Activator {
18
 
19
  /**
20
  * Runs activation actions.
@@ -23,9 +23,11 @@
23
  */
24
  public function activate()
25
  {
26
- WIO_Plugin::app()->updateOption('image_optimization_server', 'resmush');
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
- if( wp_next_scheduled('wio_optimize_images') ) {
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 .wio-warning-message {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  padding: 20px;
40
- border: 1px dashed #bfbfbf;
41
- background: #ffffff;
42
- margin-bottom: 40px;
43
  font-size: 15px;
44
- color: #828282;
 
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
- .wio-warning-message {
18
- padding: 20px;
19
- border: 1px dashed #bfbfbf;
20
- background: #ffffff;
21
- margin-bottom: 40px;
22
- font-size: 15px;
23
- color: #828282;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
 
26
  .wio-columns {
@@ -260,8 +358,8 @@
260
  .wio-optimize-button {
261
  width: 180px;
262
  padding: 12px 30px;
263
- background: #c9deb2;
264
- color: #586549;
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: #a57b3c;
278
- background: #fdd599 url("../img/Spinner-1s-33px.gif") 10px center no-repeat;
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
- var ai_data = {
21
- 'action': 'wio_process_images',
22
- '_wpnonce': $('#wio-iph-nonce').val(),
23
- 'cron_mode': 0,
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
- return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
 
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('wbcr_factory_pages_407_imppage_rating_widget_url', 'wio_rating_widget_url', 10, 2);
31
 
32
  /**
33
  * Widget with the offer to buy Clearfy Business
34
  *
35
  * @param array $widgets
36
  * @param string $position
37
- * @param Wbcr_Factory406_Plugin $plugin
38
  */
39
  function wio_donate_widget($widgets, $position, $plugin)
40
  {
@@ -69,7 +104,7 @@
69
  return $widgets;
70
  }
71
 
72
- add_filter('wbcr_factory_pages_407_imppage_get_widgets', 'wio_donate_widget', 10, 3);
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 Wbcr_FactoryPages407_ImpressiveThemplate {
21
 
22
  /**
23
  * The id of the page in the admin menu.
24
  *
25
  * Mainly used to navigate between pages.
26
- * @see FactoryPages407_AdminPage
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 Wbcr_Factory406_Plugin $plugin
38
  */
39
- public function __construct(Wbcr_Factory406_Plugin $plugin)
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( defined('WBCR_CLEARFY_PLUGIN_ACTIVE') ) {
53
- $this->page_parent_page = 'image_optimizer';
54
 
55
  return 'wbcr_clearfy';
56
  }
@@ -61,7 +93,7 @@
61
  /**
62
  * Requests assets (js and css) for the page.
63
  *
64
- * @see Wbcr_FactoryPages407_AdminPage
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 = WIO_Plugin::app()->getLogger();
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( ! defined( 'ABSPATH' ) ) {
11
  exit;
12
  }
13
 
@@ -17,13 +17,13 @@
17
  * @copyright (c) 2018, Webcraftic
18
  * @version 1.0
19
  */
20
- class WIO_SettingsPage extends Wbcr_FactoryPages407_ImpressiveThemplate {
21
 
22
  /**
23
  * The id of the page in the admin menu.
24
  *
25
  * Mainly used to navigate between pages.
26
- * @see FactoryPages407_AdminPage
27
  *
28
  * @since 1.0.0
29
  * @var string
@@ -33,98 +33,73 @@
33
  public $page_parent_page = null; // Уникальный идентификатор родительской страницы
34
 
35
  /**
36
- * @param Wbcr_Factory406_Plugin $plugin
37
  */
38
- public function __construct( Wbcr_Factory406_Plugin $plugin ) {
39
- // Заголовок страницы
40
- $this->menu_title = __( 'Main Settings', 'robin-image-optimizer' );
41
- parent::__construct( $plugin );
42
- $this->hooks();
43
- }
44
 
45
  /**
46
- * Подменяем простраинство имен для меню плагина, если активирован плагин Clearfy
47
- * Меню текущего плагина будет добавлено в общее меню Clearfy
48
- * @return string
49
  */
50
- public function getMenuScope() {
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
- * AJAX обработчик массовой оптимизации изображений со страницы статистики
 
 
 
67
  */
68
- public function ajaxRestoreBackup() {
69
- check_admin_referer( 'wio-iph' );
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
- * AJAX обработчик очистки папки с бекапами
93
  */
94
- public function ajaxClearBackupDir() {
95
- check_admin_referer( 'wio-iph' );
96
- $backup = WIO_Plugin::app()->getBackup();
97
- $backup->removeBackupDir();
98
- wp_send_json( true );
 
 
 
 
 
 
 
 
 
 
 
 
99
  }
100
-
101
  /**
102
- * AJAX обработчик массовой сохранения уровня сжатия
 
 
103
  */
104
- public function ajaxUpdateLevel() {
105
- check_admin_referer( 'wio-iph' );
106
- $level = $_POST['level'];
107
- if ( ! $level ) {
108
- die();
109
- }
110
- if ( ! in_array( $level, array( 'normal', 'aggresive', 'ultra' ) ) ) {
111
- die();
112
  }
113
- WIO_Plugin::app()->updateOption( 'image_optimization_level' , $level );
114
- die();
115
  }
116
-
117
  /**
118
  * Подключаем скрипты и стили для страницы
119
  *
120
- * @see Wbcr_FactoryPages407_AdminPage
121
  *
122
  * @since 1.0.0
123
  * @return void
124
  */
125
- public function assets( $scripts, $styles ) {
126
- parent::assets( $scripts, $styles );
127
- $this->scripts->add( WIO_PLUGIN_URL . '/admin/assets/js/restore-backup.js' );
 
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 ( ! is_writable( $upload_dir['basedir'] ) ) {
143
- $this->printErrorNotice( __( 'Folder wp-content/uploads/ is unavailable for writing', 'robin-image-optimizer' ) );
144
  }
145
  $wio_backup = $upload_dir['basedir'] . '/wio_backup/';
146
- if ( file_exists( $wio_backup ) and ! is_writable( $wio_backup ) ) {
147
- $this->printErrorNotice( __( 'Folder wp-content/uploads/wio-backup/ is unavailable for writing', 'robin-image-optimizer' ) );
148
  }
149
- if ( defined( 'DISABLE_WP_CRON' ) and DISABLE_WP_CRON == true ) {
150
- $this->printErrorNotice( __( 'Cron is disabled in wp-config.php', 'robin-image-optimizer' ) );
151
  }
152
  }
153
 
@@ -159,12 +135,13 @@
159
  * @since 1.0.0
160
  * @return mixed[]
161
  */
162
- public function getOptions() {
 
163
  $options = array();
164
 
165
  $options[] = array(
166
  'type' => 'html',
167
- '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>'
168
  );
169
 
170
  $options[] = array(
@@ -173,45 +150,54 @@
173
  'title' => __('Optimization server', 'robin-image-optimizer'),
174
  'data' => array(
175
  array(
176
- 'resmush',
177
  __('Server 1 (recommended) - image size limit up to 5 MB', 'robin-image-optimizer'),
178
 
179
  ),
180
  array(
181
- 'smushpro',
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' => 'resmush',
188
- );
189
 
190
  // Радио переключатель
191
  $options[] = array(
192
- 'type' => 'dropdown',
193
- 'name' => 'image_optimization_level',
194
- 'way' => 'buttons',
195
- 'title' => __( 'Compression mode', 'robin-image-optimizer' ),
196
- 'data' => array(
197
  array(
198
  'normal',
199
- __( 'Normal', 'robin-image-optimizer' ),
200
- __( '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' )
201
  ),
202
  array(
203
  'aggresive',
204
- __( 'Medium', 'robin-image-optimizer' ),
205
- __( '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' )
206
  ),
207
  array(
208
  'ultra',
209
- __( 'High', 'robin-image-optimizer' ),
210
- __( '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' )
211
  )
212
  ),
213
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
214
- 'hint' => __( 'Select the compression mode appropriate for your case.', 'robin-image-optimizer' ),
215
  'default' => 'normal',
216
  /*'events' => array(
217
  'disable_certain_post_types_comments' => array(
@@ -229,92 +215,92 @@
229
 
230
  // Переключатель
231
  $options[] = array(
232
- 'type' => 'checkbox',
233
- 'way' => 'buttons',
234
- 'name' => 'auto_optimize_when_upload',
235
- 'title' => __( 'Auto optimization on upload', 'robin-image-optimizer' ),
236
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
237
- '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' ),
238
  'default' => false
239
  );
240
 
241
  // Переключатель
242
  $options[] = array(
243
- 'type' => 'checkbox',
244
- 'way' => 'buttons',
245
- 'name' => 'backup_origin_images',
246
- 'title' => __( 'Backup images', 'robin-image-optimizer' ),
247
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
248
- 'hint' => __( 'Before optimizing, all your images will be saved in a separate folder for future recovery.', 'robin-image-optimizer' ),
249
  'default' => true
250
  );
251
 
252
  // Переключатель
253
  $options[] = array(
254
- 'type' => 'checkbox',
255
- 'way' => 'buttons',
256
- 'name' => 'error_log',
257
- 'title' => __( 'Error Log', 'robin-image-optimizer' ),
258
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
259
- 'hint' => __( 'Enable error logging. The log will be displayed on a separate tab.', 'robin-image-optimizer' ),
260
  'default' => false
261
  );
262
 
263
  // восстановление
264
  $options[] = array(
265
  'type' => 'html',
266
- 'html' => array( $this, 'rollbackButton' ),
267
  );
268
 
269
  // Переключатель
270
  $options[] = array(
271
- 'type' => 'checkbox',
272
- 'way' => 'buttons',
273
- 'name' => 'save_exif_data',
274
- 'title' => __( 'Leave EXIF data', 'robin-image-optimizer' ),
275
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
276
- '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' ),
277
  'default' => true
278
  );
279
 
280
  $options[] = array(
281
  'type' => 'html',
282
- '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>'
283
  );
284
 
285
  // Переключатель
286
  $options[] = array(
287
- 'type' => 'checkbox',
288
- 'way' => 'buttons',
289
- 'name' => 'resize_larger',
290
- 'title' => __( 'Resizing large images', 'robin-image-optimizer' ),
291
- 'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
292
- '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' ),
293
- 'default' => false,
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' => '.factory-control-resize_larger_w'
301
  )
302
  );
303
 
304
  // Текстовое поле
305
  $options[] = array(
306
- 'type' => 'textbox',
307
- 'name' => 'resize_larger_w',
308
- 'title' => __( 'Enter the maximum size (px)', 'robin-image-optimizer' ),
309
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
310
- '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' ),
311
  'default' => '1600'
312
  );
313
 
314
  // получаем зарегистрированные размеры изображений
315
  $wp_image_sizes = wio_get_image_sizes();
316
  $wio_image_sizes = array();
317
- foreach( $wp_image_sizes as $key => $value ) {
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' => 'list',
326
- 'way' => 'checklist',
327
- 'name' => 'allowed_sizes_thumbnail',
328
- 'title' => __( 'Optimize thumbnails', 'robin-image-optimizer' ),
329
- 'data' => $wio_image_sizes,
330
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
331
- 'hint' => __( 'Choose which sizes of thumbnails should be optimized and uncheck those that do not need optimization.', 'robin-image-optimizer' ),
332
  'default' => 'thumbnail,medium'
333
  );
334
 
335
  // cron
336
  $options[] = array(
337
  'type' => 'html',
338
- '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>'
339
  );
340
 
341
  // автооптимизация
342
  $options[] = array(
343
- 'type' => 'checkbox',
344
- 'way' => 'buttons',
345
- 'name' => 'image_autooptimize_mode',
346
- 'title' => __( 'Enable Scheduled Optimization', 'robin-image-optimizer' ),
347
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
348
- 'hint' => __( 'You can enable image optimization on schedule. The plugin will optimize specified number of images automatically after selected time.', 'robin-image-optimizer' ),
349
- 'default' => false,
350
- 'eventsOn' => array(
351
  'show' => '#wbcr-io-shedule-options'
352
  ),
353
  'eventsOff' => array(
@@ -356,80 +342,80 @@
356
  );
357
 
358
  $group_items[] = array(
359
- 'type' => 'dropdown',
360
- 'way' => 'buttons',
361
- 'name' => 'image_autooptimize_shedule_time',
362
- 'data' => array(
363
- array( 'wio_1_min', __( '1 min', 'robin-image-optimizer' ) ),
364
- array( 'wio_2_min', __( '2 min', 'robin-image-optimizer' ) ),
365
- array( 'wio_5_min', __( '5 min', 'robin-image-optimizer' ) ),
366
- array( 'wio_10_min', __( '10 min', 'robin-image-optimizer' ) ),
367
- array( 'wio_30_min', __( '30 min', 'robin-image-optimizer' ) ),
368
- array( 'wio_hourly', __( 'Hour', 'robin-image-optimizer' ) ),
369
- array( 'wio_daily', __( 'Day', 'robin-image-optimizer' ) ),
370
  ),
371
  'default' => 'wio_5_min',
372
- 'title' => __( 'Run every', 'robin-image-optimizer' ),
373
- 'hint' => __( 'Select time at which the task will be repeated.', 'robin-image-optimizer' )
374
  );
375
 
376
-
377
  $group_items[] = array(
378
- 'type' => 'textbox',
379
- 'name' => 'image_autooptimize_items_number_per_interation',
380
- 'title' => __( 'Images per iteration', 'robin-image-optimizer' ),
381
- 'layout' => array( 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ),
382
- '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' ),
383
  'default' => '3'
384
  );
385
 
386
  $options[] = array(
387
- 'type' => 'div',
388
- 'id' => 'wbcr-io-shedule-options',
389
  'items' => $group_items
390
  );
391
 
392
  $formOptions = array();
393
 
394
  $formOptions[] = array(
395
- 'type' => 'form-group',
396
  'items' => $options,
397
  //'cssClass' => 'postbox'
398
  );
399
 
400
- return apply_filters( 'wbcr_wio_settings_form_options', $formOptions );
401
  }
402
 
403
  /**
404
  * Кнопка восстановления изображений
405
  *
406
  */
407
- public function rollbackButton() {
 
408
  ?>
409
- <div class="form-group form-group-checkbox factory-control-save_exif_data">
410
- <label for="wbcr_io_save_exif_data" class="col-sm-6 control-label">
411
- <?php _e( 'Manage backups', 'robin-image-optimizer' ); ?>
412
- <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' ); ?>">
413
  <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt="">
414
  </span>
415
- </label>
416
- <input type="hidden" value="<?php echo wp_create_nonce( 'wio-iph' ) ?>" id="wio-iph-nonce">
417
- <div class="control-group col-sm-6">
418
- <div class="factory-buttons-way btn-group">
419
- <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>
420
- <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>
421
- </div>
422
- <div class="progress" id="wio-restore-backup-progress" style="display:none;">
423
- <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">
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( ! defined( 'ABSPATH' ) ) {
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 Wbcr_FactoryPages407_ImpressiveThemplate {
21
 
22
  /**
23
  * The id of the page in the admin menu.
24
  *
25
  * Mainly used to navigate between pages.
26
- * @see FactoryPages407_AdminPage
27
  *
28
  * @since 1.0.0
29
  * @var string
30
  */
31
- public $id = 'image_optimizer'; // Уникальный идентификатор страницы
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 Wbcr_Factory406_Plugin $plugin
44
  */
45
- public function __construct( Wbcr_Factory406_Plugin $plugin ) {
46
- $this->menu_title = __( 'Robin image optimizer', 'robin-image-optimizer' );
47
-
 
 
48
  // Если плагин загружен, как самостоятельный, то мы меняем настройки страницы и делаем ее внешней,
49
  // а не внутренней страницей родительского плагина. Внешнии страницы добавляются в Wordpress меню "Общие"
50
 
51
- if( ! defined( 'LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON' ) ) {
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( $plugin );
64
-
65
  }
66
 
67
  /**
@@ -69,181 +101,242 @@
69
  * Меню текущего плагина будет добавлено в общее меню Clearfy
70
  * @return string
71
  */
72
- public function getMenuScope() {
73
- if(defined('WBCR_CLEARFY_PLUGIN_ACTIVE')) {
 
74
  $this->internal = true;
 
75
  return 'wbcr_clearfy';
76
  }
77
 
78
  return $this->plugin->getPluginName();
79
  }
80
 
81
- // Метод позволяет менять заголовок меню, в зависимости от сборки плагина.
82
- public function getMenuTitle() {
83
- return defined('WBCR_CLEARFY_PLUGIN_ACTIVE')
84
- ? __( 'Image optimizer', 'robin-image-optimizer' )
85
- : __( 'General', 'robin-image-optimizer' );
86
  }
87
 
88
  /**
89
- * Устанавливаем хуки
 
90
  */
91
- public function hooks() {
92
- add_action( 'wp_ajax_wio_process_images', array( $this, 'ajaxProcessImages' ) );
93
- add_action( 'wbcr_clearfy_quick_boards', array( $this, 'widget' ) );
94
- add_action( 'wbcr_clearfy_page_enqueue_scripts', array($this, 'registerWidgetScripts'), 10, 3 );
95
  }
96
-
97
-
98
  /**
99
- * AJAX обработчик массовой оптимизации изображений со страницы статистики
100
  */
101
- public function ajaxProcessImages() {
102
- $cron_mode = (bool) $_REQUEST['cron_mode'];
103
- $media_library = WIO_Plugin::app()->getMediaLibrary();
104
- $media_library->resetCurrentErrors(); // сбрасываем текущие ошибки оптимизации
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
- wp_send_json( $optimized_data );
 
123
  }
124
 
125
  /**
126
  * Подключаем скрипты и стили для страницы
127
  *
128
- * @see Wbcr_FactoryPages407_AdminPage
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( WIO_PLUGIN_URL . '/admin/assets/css/base-statistic.css' );
 
 
 
 
137
 
138
- $this->scripts->add( WIO_PLUGIN_URL . '/admin/assets/js/Chart.min.js' );
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\FactoryPages407_ImpressiveThemplate
154
  */
155
- public function showPageContent() {
156
- ?>
157
- <?php
158
- $statistics = WIO_Plugin::app()->getImageStatistics();
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( 'Image optimization dashboard', 'robin-image-optimizer' ) ?></strong>
166
 
167
  <p>
168
- <?php _e( 'Monitor image optimization statistics and run on demand or scheduled optimization.', 'robin-image-optimizer' ) ?>
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( $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>
187
- <div id="wio-overview-chart-percent" class="wio-chart-percent"><?php echo esc_attr( $image_statistics['optimized_percent'] ); ?><span>%</span></div>
 
188
  <p class="wio-global-optim-phrase wio-clear">
189
- <?php _e( 'You optimized', 'robin-image-optimizer' ); ?> <span class="wio-total-percent"><?php echo esc_attr( $image_statistics['optimized_percent'] ); ?>%</span> <?php _e( "of your website's images", 'robin-image-optimizer' ); ?>
 
 
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><span style="background-color:#d6d6d6"></span><?php _e( 'Unoptimized', 'robin-image-optimizer' ); ?> - <span class="wio-num" id="wio-unoptimized-num"><?php echo esc_attr( $image_statistics['unoptimized'] ); ?></span></li>
197
- <li><span style="background-color:#8bc34a"></span><?php _e( 'Optimized', 'robin-image-optimizer' ); ?> - <span class="wio-num" id="wio-optimized-num"><?php echo esc_attr( $image_statistics['optimized'] ); ?></span></li>
198
- <li><span style="background-color:#f1b1b6"></span><?php _e( 'Error', 'robin-image-optimizer' ); ?> - <span class="wio-num" id="wio-error-num"><?php echo esc_attr( $image_statistics['error'] ); ?></span></li>
 
 
 
 
 
 
 
 
 
 
 
 
199
  </ul>
200
  </div>
201
- <h3 class="screen-reader-text"><?php _e( 'Statistics', 'robin-image-optimizer' ); ?></h3>
202
-
203
  <!--<div class="wio-number-you-optimized">
204
  <p>
205
- <span id="wio-total-optimized-attachments" class="wio-number"><?php echo esc_attr( $image_statistics['optimized'] ); ?></span>
206
  <span class="wio-text">
207
- <?php _e( "that's the number of original images<br> you optimized with Image Optimizer", 'robin-image-optimizer' ); ?>
208
  </span>
209
  </p>
210
  </div>-->
211
-
212
  <div class="wio-bars" style="width: 90%">
213
- <p><?php _e( 'Original size', 'robin-image-optimizer' ); ?></p>
 
214
  <div class="wio-bar-negative base-transparent wio-right-outside-number">
215
- <div id="wio-original-bar" class="wio-progress" style="width: 100%"><span class="wio-barnb" id="wio-original-size"><?php echo esc_attr( $statistics->convertToReadableSize( $image_statistics['original_size'] ) ); ?></span></div>
 
 
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 ( $image_statistics['percent_line'] ) ? esc_attr( $image_statistics['percent_line'] ) : 100; ?>%"><span class="wio-barnb" id="wio-optimized-size"><?php echo esc_attr( $statistics->convertToReadableSize( $image_statistics['optimized_size'] ) ); ?></span></div>
 
 
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( $image_statistics['save_size_percent'] ); ?>%</span>
 
228
  <span class="wio-text">
229
- <?php _e( "that's the size you saved <br>by using Image Optimizer", 'robin-image-optimizer' ); ?>
230
  </span>
231
  </p>
232
  </div>
233
  </div>
234
  </div>
235
-
236
  <div>
237
- <input type="hidden" value="<?php echo wp_create_nonce( 'wio-iph' ) ?>" id="wio-iph-nonce">
238
 
239
  <p>
240
  <?php $this->button(); ?>
241
- <span id="wio-start-msg-complete"><?php _e( 'All images from the media library are optimized.', 'robin-image-optimizer' ); ?></span>
 
 
 
 
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
- $backup_origin_images = WIO_Plugin::app()->getOption( 'backup_origin_images', false );
256
- $is_cron_mode = WIO_Plugin::app()->getOption( 'image_autooptimize_mode', false );
 
257
  $button_classes = array(
258
  'wio-optimize-button'
259
  );
260
- if( ! $backup_origin_images ) {
261
  $button_classes[] = 'wio-nobackup';
262
  }
263
- $button_name = __( 'Run', 'robin-image-optimizer' );
264
  if( $is_cron_mode ) {
265
  $button_classes[] = 'wio-cron-mode';
266
- $cron_running = WIO_Plugin::app()->getOption( 'cron_running', false );
267
- if ( $cron_running ) {
268
  $button_classes[] = 'wio-running';
269
- $button_name = __( 'Stop', 'robin-image-optimizer' );
270
  } else {
271
- $button_name = __( 'Run', 'robin-image-optimizer' );
272
  }
273
  }
274
  ?>
275
- <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>
276
- <?php
277
  }
278
 
279
  /**
280
  * @param string $page_id
281
- * @param Wbcr_Factory406_ScriptList $scripts
282
- * @param Wbcr_Factory406_StyleList $styles
283
  */
284
- public function registerWidgetScripts($page_id, $scripts, $styles) {
285
- if($page_id == 'quick_start-wbcr_clearfy') {
 
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
- $statistics = WIO_Plugin::app()->getImageStatistics();
303
- $image_statistics = $statistics->get();
304
- $backup_origin_images = WIO_Plugin::app()->getOption( 'backup_origin_images', false );
305
- $default_level = WIO_Plugin::app()->getOption( 'image_optimization_level' , 'normal' );
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( 'Images optimization', 'robin-image-optimizer' ); ?></h4>
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( $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>
317
- <div id="wio-overview-chart-percent" class="wio-chart-percent"><?php echo esc_attr( $image_statistics['optimized_percent'] ); ?><span>%</span></div>
 
318
  </div>
319
  <div id="wio-overview-chart-legend">
320
  <ul class="wio-doughnut-legend">
321
- <li><span style="background-color:#d6d6d6"></span><?php _e( 'Unoptimized', 'robin-image-optimizer' ); ?> - <span class="wio-num" id="wio-unoptimized-num"><?php echo esc_attr( $image_statistics['unoptimized'] ); ?></span></li>
322
- <li><span style="background-color:#8bc34a"></span><?php _e( 'Optimized', 'robin-image-optimizer' ); ?> - <span class="wio-num" id="wio-optimized-num"><?php echo esc_attr( $image_statistics['optimized'] ); ?></span></li>
323
- <li><span style="background-color:#f1b1b6"></span><?php _e( 'Error', 'robin-image-optimizer' ); ?> - <span class="wio-num" id="wio-error-num"><?php echo esc_attr( $image_statistics['error'] ); ?></span></li>
 
 
 
 
 
 
 
 
 
 
 
 
324
  </ul>
325
  </div>
326
  <div class="wio-bars">
327
- <p><?php _e( 'Original size', 'robin-image-optimizer' ); ?></p>
 
328
  <div class="wio-bar-negative base-transparent wio-right-outside-number">
329
- <div id="wio-original-bar" class="wio-progress" style="width: 100%"><span class="wio-barnb" id="wio-original-size"><?php echo esc_attr( $statistics->convertToReadableSize( $image_statistics['original_size'] ) ); ?></span></div>
 
 
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 ( $image_statistics['percent_line'] ) ? esc_attr( $image_statistics['percent_line'] ) : 100; ?>%"><span class="wio-barnb" id="wio-optimized-size"><?php echo esc_attr( $statistics->convertToReadableSize( $image_statistics['optimized_size'] ) ); ?></span></div>
 
 
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( 'wio-iph' ) ?>" id="wio-iph-nonce">
342
 
343
  <p>
344
  <?php $this->button(); ?>
345
- <span id="wio-start-msg-complete"><?php _e( 'All images from the media library are optimized.', 'robin-image-optimizer' ); ?></span>
 
 
 
 
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( 'Normal', 'robin-image-optimizer' ); ?></button>
354
- <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>
355
- <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>
356
  </div>
357
  </div>
358
  </li>
359
  </ul>
360
  </div>
361
  </div>
362
- </div>
363
- <?php
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( ! 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_Factory406_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_Factory406_Plugin {
26
 
27
  }
28
  }
29
  }
30
 
31
  class WIO_Plugin extends WIO_PluginFactory {
32
-
33
  /**
34
- * @var Wbcr_Factory406_Plugin
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( $plugin_path, $data ) {
79
- $this->as_addon = isset( $data['as_addon'] ) ? true : false;
 
80
 
81
  if( $this->as_addon ) {
82
- $plugin_parent = isset( $data['plugin_parent'] ) ? $data['plugin_parent'] : null;
83
 
84
- if( ! ( $plugin_parent instanceof Wbcr_Factory406_Plugin ) ) {
85
- throw new Exception( __( 'An invalid instance of the class was passed.', 'robin-image-optimizer' ) );
86
  }
87
 
88
  // Если плагин загружен, как аддон, то мы передаем в app ссылку на класс родителя
@@ -91,16 +63,43 @@
91
  // Если плагин самостоятельный, то записываем в app сслыку на текущий класс
92
  self::$app = $this;
93
 
94
- parent::__construct( $plugin_path, $data );
95
  }
 
 
 
96
 
97
  $this->init();
98
- $this->setTextDomain();
99
  $this->setModules();
100
 
101
  if( is_admin() ) {
 
 
 
 
 
 
 
 
102
  $this->initActivation();
103
- add_action('plugins_loaded', array($this, 'adminScripts'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  }
105
  }
106
 
@@ -109,20 +108,23 @@
109
  *
110
  * @return void
111
  */
112
- protected function init() {
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.image-processor-resmush.php' ); // resmush api
118
- require_once( WIO_PLUGIN_DIR . '/includes/classes/class.image-processor-smushpro.php' ); // smushpro api
119
- require_once( WIO_PLUGIN_DIR . '/includes/classes/class.cron.php' );
120
- require_once( WIO_PLUGIN_DIR . '/includes/classes/class.image-statistic.php' );
121
- require_once( WIO_PLUGIN_DIR . '/includes/classes/class.backup.php' );
122
- require_once( WIO_PLUGIN_DIR . '/includes/classes/class.logger.php' );
123
-
124
- $this->media_library = new WIO_Media_Library;
125
- $this->cron = new WIO_Cron;
 
 
 
126
  }
127
 
128
  /**
@@ -134,44 +136,29 @@
134
  * WIO_Plugin::app()->deleteOption()
135
  * WIO_Plugin::app()->getPluginName()
136
  *
137
- * @return Wbcr_Factory406_Plugin
138
  */
139
- public static function app() {
140
- return self::$app;
141
- }
142
-
143
- // todo: перенести этот медот в фреймворк
144
- protected function setTextDomain()
145
  {
146
- // Localization plugin
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
- if( ! $this->as_addon ) {
165
- self::app()->load( array(
 
166
  // Модуль отвечает за подключение скриптов и стилей для интерфейса
167
- array( 'libs/factory/bootstrap', 'factory_bootstrap_406', 'admin' ),
168
  // Модуль отвечает за создание форм и полей
169
- array( 'libs/factory/forms', 'factory_forms_407', 'admin' ),
170
  // Модуль отвечает за создание шаблонов страниц плагина
171
- array( 'libs/factory/pages', 'factory_pages_407', 'admin'),
172
  // Модуль в котором хранится общий функционал плагина Clearfy и его аддонов
173
- array( 'libs/factory/clearfy', 'factory_clearfy_203', 'all' )
174
- ) );
175
  }
176
  }
177
 
@@ -181,101 +168,26 @@
181
  protected function initActivation()
182
  {
183
  include_once(WIO_PLUGIN_DIR . '/admin/activation.php');
184
- $this->registerActivation('WIO_Activation');
185
  }
186
 
187
  /**
188
  * Регистрируем страницы плагина
189
  */
190
- private function registerPages() {
 
191
 
192
  $admin_path = WIO_PLUGIN_DIR . '/admin/pages';
193
 
194
  // Пример основной страницы настроек
195
- self::app()->registerPage( 'WIO_SettingsPage', $admin_path . '/settings.php' );
196
 
197
  // Пример внутренней страницы настроек
198
- self::app()->registerPage( 'WIO_StatisticPage', $admin_path . '/statistic.php' );
199
 
200
- if ( self::app()->getOption( 'error_log' , false ) ) {
201
- self::app()->registerPage( 'WIO_LogPage', $admin_path . '/log.php' );
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 = WIO_Plugin::app()->getLogger();
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
- clearstatcache(); // на всякий случай очистим кеш файловой статистики
 
111
  $original_main_size = filesize( $this->get( 'path' ) );
112
  // если файл большой - изменяем размер
113
  if ( $this->isNeedResize() ) {
114
  $this->resize();
115
  }
116
- $image_processor = WIO_Plugin::app()->getImageProcessor();
 
 
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 = WIO_Plugin::app()->getImageProcessor();
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 srting
337
  */
338
  public function getImageSizeUrl( $size = 'thumbnail' ) {
339
  if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
340
  return false;
341
  }
342
- $url = str_replace( basename( $this->url ), $this->attachment_meta['sizes'][ $size ]['file'], $this->url );
 
 
343
  return $url;
344
  }
345
 
@@ -347,13 +372,15 @@
347
  * Возвращает путь к изображению по указанному размеру
348
  *
349
  * @param string $size - размер изображения(thumbnail,medium,large...)
350
- * @return srting
351
  */
352
  public function getImageSizePath( $size = 'thumbnail' ) {
353
  if ( ! isset( $this->attachment_meta['sizes'][ $size ] ) ) {
354
  return false;
355
  }
356
- $path = str_replace( basename( $this->path ), $this->attachment_meta['sizes'][ $size ]['file'], $this->path );
 
 
357
  return $path;
358
  }
359
 
@@ -366,13 +393,19 @@
366
  if ( ! $resize_large_images ) {
367
  return false;
368
  }
 
 
369
 
370
- $file_size = filesize( $this->path );
371
- $max_size = 1024 * 1024 * 5; // 5 Мб
372
- if ( $file_size >= $max_size ) {
373
- return true;
374
  }
375
- return false;
 
 
 
 
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
- $image->resize( $new_width, $new_height, false );
398
- $image->save( $this->path );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 = WIO_Plugin::app()->getBackup();
414
  return $backup->backupAttachment( $this );
415
  }
416
-
417
  /**
418
  * Восстанавливает файлы из резервной копии
419
  *
420
  * @return true|WP_Error
421
  */
422
  public function restore() {
423
- $backup = WIO_Plugin::app()->getBackup();
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( ! defined( 'ABSPATH' ) ) {
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 ( is_dir( $upload_dir ) and is_writable( $upload_dir ) ) {
45
  return true;
46
  }
 
47
  return false;
48
  }
49
 
50
  /**
51
  * Проверка возможности записи в папку бекап
52
  */
53
- public function isBackupWritable() {
 
54
  $backup_dir = $this->getBackupDir();
55
- if ( is_wp_error( $backup_dir ) ) {
56
  return false;
57
  }
58
- if ( is_writable( $backup_dir ) ) {
59
  return true;
60
  }
 
61
  return false;
62
  }
63
 
64
  /**
65
  * Путь к папке с бекапами
66
- *
67
  * @return string|WP_Error
68
  */
69
- public function getBackupDir() {
70
- if ( $this->backup_dir ) {
 
71
  return $this->backup_dir;
72
  }
73
  $dir = $this->wp_upload_dir['basedir'] . '/' . $this->backup_dir_name . '/';
74
- if ( ! is_dir( $dir ) ) {
75
  // создаём
76
- if( ! mkdir( $dir ) ) {
77
- return new WP_Error( 'backup_dir_error', __( 'Unable to create backup folder.', 'robin-image-optimizer' ) );
78
  }
79
  }
 
80
  return $dir;
81
  }
82
 
83
  /**
84
  * Очищает папку с резервными копиями
85
- *
86
  */
87
- public function removeBackupDir() {
 
88
  $backup_dir = $this->getBackupDir();
89
- if ( is_dir( $backup_dir ) ) {
90
- $this->rmDir( $backup_dir );
91
  }
92
  }
93
 
94
  /**
95
  * Удаляет папку со всем содержимым
96
- *
97
  * @param string $dir папка
98
  */
99
- protected function rmDir( $dir ) {
100
- if ( is_dir( $dir ) ) {
101
- $scn = scandir( $dir );
102
- foreach ( $scn as $files ) {
103
- if ( $files !== '.' ) {
104
- if ( $files !== '..' ) {
105
- if ( ! is_dir( $dir . '/' . $files ) ) {
106
- unlink( $dir . '/' . $files );
 
107
  } else {
108
- $this->rmDir( $dir . '/' . $files );
109
- rmdir( $dir . '/' . $files );
 
 
110
  }
111
  }
112
  }
113
  }
114
- rmdir( $dir );
115
  }
116
  }
117
 
118
  /**
119
  * Получает путь к папке с резервными копиями
120
- *
121
  * @param array $attachment_meta метаданные аттачмента
122
  * @return string
123
  */
124
- public function getAttachmentBackupDir( $attachment_meta ) {
 
125
  $backup_dir = $this->getBackupDir();
126
- $file_subdirs = explode( '/', $attachment_meta['file'] );
127
- array_pop( $file_subdirs ); // убираем имя файла
128
- foreach ( $file_subdirs as $subdir_name ) {
129
  $backup_dir .= $subdir_name . '/';
130
- if ( ! is_dir( $backup_dir ) ) {
131
- if( ! mkdir( $backup_dir ) ) {
132
- return new WP_Error( 'backup_dir_subdir_error', __( 'Unable to create backup subfolder.', 'robin-image-optimizer' ) );
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
- $backup_origin_images = WIO_Plugin::app()->getOption( 'backup_origin_images' , false );
147
- if ( ! $backup_origin_images ) {
 
148
  return false; // если бекап не требуется
149
  }
150
- $backup_dir = $this->getAttachmentBackupDir( $wio_attachment->get( 'attachment_meta' ) );
151
- if ( is_wp_error( $backup_dir ) ) {
152
  return $backup_dir;
153
  }
154
- $full = $this->backupAttachmentSize( $wio_attachment );
155
- if ( is_wp_error( $full ) ) {
156
  return $full;
157
  }
158
  $allowed_sizes = $wio_attachment->getAllowedSizes();
159
- if ( $allowed_sizes ) {
160
- foreach ( $allowed_sizes as $image_size ) {
161
- $size_backup = $this->backupAttachmentSize( $wio_attachment, $image_size );
162
- if ( is_wp_error( $size_backup ) ) {
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
- $backup_dir = $this->getAttachmentBackupDir( $wio_attachment->get( 'attachment_meta' ) );
178
- if ( is_wp_error( $backup_dir ) ) {
 
179
  return $backup_dir;
180
  }
181
- $full = $this->restoreAttachmentSize( $wio_attachment );
182
- $attachment_meta = wp_get_attachment_metadata( $wio_attachment->get( 'id' ) );
183
- if ( isset( $attachment_meta['old_width'] ) and isset( $attachment_meta['old_width'] ) ) {
 
 
 
 
184
  $attachment_meta['width'] = $attachment_meta['old_width'];
185
  $attachment_meta['height'] = $attachment_meta['old_height'];
186
- wp_update_attachment_metadata( $wio_attachment->get( 'id' ), $attachment_meta );
187
- }
188
- if ( is_wp_error( $full ) ) {
189
- return $full;
190
  }
 
191
  $allowed_sizes = $wio_attachment->getAllowedSizes();
192
- if ( $allowed_sizes ) {
193
- foreach ( $allowed_sizes as $image_size ) {
194
- $size_backup = $this->restoreAttachmentSize( $wio_attachment, $image_size );
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
- if ( $image_size ) {
209
- $original_file = $wio_attachment->getImageSizePath( $image_size );
 
210
  } else {
211
- $original_file = $wio_attachment->get( 'path' );
212
  }
213
- $backup_dir = $this->getAttachmentBackupDir( $wio_attachment->get( 'attachment_meta' ) );
214
  // проверить запись в папку
215
- if ( is_wp_error( $backup_dir ) ) {
216
  return $backup_dir;
217
  }
218
- if ( ! $original_file ) {
219
  // бывает такое, что размера превьюшки нет в базе данных.
220
  // это не считается ошибкой, поэтому сразу пропускаем
221
  return false;
222
  }
223
- $backup_file = $backup_dir . basename( $original_file );
224
- if ( is_file( $original_file ) ) {
225
- $copy = copy( $original_file, $backup_file );
 
 
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
- if ( $image_size ) {
239
- $original_file = $wio_attachment->getImageSizePath( $image_size );
 
240
  } else {
241
- $original_file = $wio_attachment->get( 'path' );
242
  }
243
- $backup_dir = $this->getAttachmentBackupDir( $wio_attachment->get( 'attachment_meta' ) );
244
- if ( is_wp_error( $backup_dir ) ) {
245
  return $backup_dir;
246
  }
247
- if ( ! $original_file ) {
248
- // бывает такое, что размера превьюшки нет в базе данных.
249
- // это не считается ошибкой, поэтому сразу пропускаем
250
  return false;
251
  }
252
- $backup_file = $backup_dir . basename( $original_file );
253
- $backup_file_exists = is_file( $backup_file );
254
- if ( $backup_file_exists ) {
255
- $restored = copy( $backup_file, $original_file );
256
- unlink( $backup_file ); // удаляем файл из бекапа
 
 
257
  } else {
258
  $restored = false;
259
- $logger = WIO_Plugin::app()->getLogger();
260
- $error_msg = __( 'Unable to restore from a backup. There is no file.', 'robin-image-optimizer' );
261
- $logger->add( $error_msg . 'Attachment_id: ' . $wio_attachment->get( 'id' ) . ' file: ' . $backup_file );
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
- $this->hooks();
21
- $this->check();
22
- }
23
 
24
  /**
25
  * Подключение хуков
26
  */
27
- private function hooks() {
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
- private 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
  if ( $is_cron_mode and $cron_running ) {
40
- $this->start();
41
  } else {
42
- $this->stop();
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 = WIO_Plugin::app()->getMediaLibrary();
110
- $optimized_data = $media_library->processUnoptimizedAttachments( $max_process_per_request );
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 = 5;
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 92;
87
  }
88
  if ( $quality == 'aggresive' ) {
89
- return 60;
90
  }
91
  if ( $quality == 'ultra' ) {
92
- return 40;
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 WIO_Media_Library {
15
-
16
- /**
17
- * Инициализация
18
- */
19
- public function __construct()
20
- {
21
- $this->filters();
22
- }
23
-
24
  /**
25
  * Установка хуков
26
  */
27
- protected function filters()
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 = WIO_Plugin::app()->getBackup();
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 = WIO_Plugin::app()->getImageStatistics();
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 = WIO_Plugin::app()->getBackup();
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 = WIO_Plugin::app()->getImageStatistics();
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 = WIO_Plugin::app()->getImageStatistics();
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 = WIO_Plugin::app()->getBackup();
152
  $backup_origin_images = WIO_Plugin::app()->getOption('backup_origin_images', false);
153
- $optimization_level = WIO_Plugin::app()->getOption( 'image_optimization_level' , 'normal' );
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
- $image_processor = WIO_Plugin::app()->getImageProcessor();
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 = WIO_Plugin::app()->getImageStatistics();
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
- public function resetCurrentErrors() {
251
- global $wpdb;
252
- $wpdb->delete(
253
- $wpdb->postmeta,
254
- array(
255
  'meta_key' => 'wio_current_error',
256
- ),
257
- array( '%s' )
258
- );
259
- }
260
 
261
  /**
262
  * Восстановление из резервной копии
@@ -274,12 +263,8 @@
274
  'posts_per_page' => 1,
275
  'meta_query' => array(
276
  array(
277
- 'key' => 'wio_optimized',
278
- 'compare' => 'EXISTS',
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 = WIO_Plugin::app()->getImageStatistics();
295
- $logger = WIO_Plugin::app()->getLogger();
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 ( isset( $attach_meta['width'] ) and isset( $attach_meta['height'] ) ) {
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"><span class="data"><?php _e('New Filesize:', 'robin-image-optimizer'); ?></span>
 
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 ( ! $error_msg ) {
461
  if( $optimization_level == 'normal' ) {
462
- echo __('Normal', 'robin-image-optimizer');
463
  } else if( $optimization_level == 'aggresive' ) {
464
- echo __('Medium', 'robin-image-optimizer');
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('Normal', 'robin-image-optimizer'); ?>
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('Medium', 'robin-image-optimizer'); ?>
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
- ->getPluginVersion());
532
- wp_enqueue_script('wio-install-addons', WIO_PLUGIN_URL . '/admin/assets/js/single-optimization.js', array('jquery'), WIO_Plugin::app()
533
- ->getPluginVersion());
 
 
 
 
 
 
 
 
 
 
 
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 ( get_intermediate_image_sizes() as $_size ) {
16
- if ( in_array( $_size, array( 'thumbnail', 'medium', 'medium_large', 'large' ) ) ) {
17
- $sizes[ $_size ]['width'] = get_option( "{$_size}_size_w" );
18
- $sizes[ $_size ]['height'] = get_option( "{$_size}_size_h" );
19
- $sizes[ $_size ]['crop'] = (bool) get_option( "{$_size}_crop" );
20
- } elseif ( isset( $_wp_additional_image_sizes[ $_size ] ) ) {
21
- $sizes[ $_size ] = array(
22
- 'width' => $_wp_additional_image_sizes[ $_size ]['width'],
23
- 'height' => $_wp_additional_image_sizes[ $_size ]['height'],
24
- 'crop' => $_wp_additional_image_sizes[ $_size ]['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( $size ){
41
- if ( ! $size ) return 0;
42
- $base = log( $size ) / log( 1024 );
43
- $suffix = array( '', 'KB', 'MB', 'GB', 'TB' );
44
- $f_base = floor( $base );
45
- return round( pow( 1024, $base - floor( $base ) ), 2 ) . ' ' . $suffix[ $f_base ];
 
 
 
 
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-406 .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-406 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-406 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-406 .factory-accordion-item{display:none}.factory-bootstrap-406 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-406 .factory-accordion>h3.active:hover{cursor:default}
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-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .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-406 .btn-primary:disabled,.factory-bootstrap-406 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-406 .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-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{background-color:#e1a948;border-color:#d39323}
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-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .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-406 .btn-primary:disabled,.factory-bootstrap-406 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-406 .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-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{background-color:#c7a589;border-color:#b78a66}
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-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .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-406 .btn-primary:disabled,.factory-bootstrap-406 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-406 .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-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{background-color:#a3b745;border-color:#839237}
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-406 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-406 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-406 .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-406 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-406 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-406 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-406 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-406 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-406 .factory-form-group legend+.control-group{margin-top:0}
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-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .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-406 .btn-primary:disabled,.factory-bootstrap-406 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-406 .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-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{background-color:#04a4cc;border-color:#037c9a}
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-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .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-406 .btn-primary:disabled,.factory-bootstrap-406 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-406 .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-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{background-color:#e14d43;border-color:#d02a21}
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-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .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-406 .btn-primary:disabled,.factory-bootstrap-406 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-406 .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-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{background-color:#9ebaa0;border-color:#80a583}
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-406 .factory-separator{border-bottom:1px solid #f9f9f9;border-top:1px solid #d1d1d1;margin-bottom:25px}
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-406 .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-406 .btn-primary:focus,.factory-bootstrap-406 .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-406 .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-406 .btn-primary:disabled,.factory-bootstrap-406 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-406 .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-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{background-color:#dd823b;border-color:#c36822}
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-406 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-406 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-406 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-406 .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-406 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-406 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-406 .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-406 .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-406 .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-406 .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-406 .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-406 .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-406 .factory-buttons-way .factory-on.active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}
8
  */
9
 
10
 
11
+ #side-sortables .factory-bootstrap-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-406 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-406 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-406 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-406 .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-406 .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-406 .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-406 .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-406 .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-406 .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-406 .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-406 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-406 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-406 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-406 .factory-dropdown.factory-ddslick-way .dd-selected{padding:8px 12px 8px 11px!important}
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-406 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-406 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-406 .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-406 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-406 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-406 .factory-mtextbox-add-item{display:block;margin-top:10px}
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-406 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-406 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-406 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-406 .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-406 .factory-tab .factory-more-link-hide:hover{color:#999}
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.factoryBootstrap406_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.factoryBootstrap406_dropdown.Constructor=f,a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ +function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=factory-dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}},a.fn.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.factoryBootstrap406_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.factoryBootstrap406_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-406 .factory-checkbox.factory-buttons-way").factoryBootstrap406_checkboxControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){var b=function(b){var c=this;this.$element=a(b),this.$result=this.$element.find(".factory-result"),this.$on=this.$element.find(".factory-on"),this.$off=this.$element.find(".factory-off");var d=this.$element.is(".factory-tumbler"),e=this.$element.is(".factory-has-tumbler-hint"),f=this.$element.data("tumbler-function"),g=this.$element.data("tumbler-delay");g||(g=3e3),this.callByPath=function(a,b){for(var c=a.split("."),d=window,e=0;e<c.length;e++)d=d[c[e]];d.apply(d,b)},this.$on.click(function(){return c.$off.removeClass("active"),c.$on.addClass("active"),d?setTimeout(function(){c.$on.removeClass("active"),c.$off.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.attr("checked","checked"),c.$result.val(1),c.$result.trigger("change")),!1}),this.$off.click(function(){return c.$on.removeClass("active"),c.$off.addClass("active"),d?setTimeout(function(){c.$off.removeClass("active"),c.$on.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.removeAttr("checked"),c.$result.val(0),c.$result.trigger("change")),!1}),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){(void 0!==window.__factory_checkbox_control_events_off_data||void 0!==window.__factory_checkbox_control_events_on_data)&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.prop("checked"),f=window.__factory_checkbox_control_events_on_data[d],g=window.__factory_checkbox_control_events_off_data[d];if(f||g){var h,i;void 0===window.__factory_checkbox_control_detach_elements&&(window.__factory_checkbox_control_detach_elements={}),h=window.__factory_checkbox_control_detach_elements,i=e?f:g;for(var j in i)if(i.hasOwnProperty(j)){var k,l=i[j];a.isArray(l)||(k=c.hashCode(d+l));var m;switch(j){case"hide":"string"==typeof l&&a(l).hide(0);break;case"show":"string"==typeof l&&a(l).fadeIn(200);break;case"detach":"string"==typeof l&&a(l).each(function(b){h[k]||(h[k]={}),h[k][b]||(h[k][b]={}),h[k][b].recovery_contanier=a(this).parent(),h[k][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(h[k]){for(var n in h[k])h[k].hasOwnProperty(n)&&h[k][n].recovery_contanier&&h[k][n].element&&h[k][n].recovery_contanier.append(h[k][n].element);delete h[k]}break;case"removeClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).removeClass(l[m]);break;case"addClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).addClass(l[m]);break;case"setValue":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&void 0!==l[m]&&null!==l[m]&&(console.log(l[m]),a(m).val(l[m]))}}}},this.executeEvents(this.$result)};a.fn.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.factoryBootstrap406_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.factoryBootstrap406_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-406 .factory-dropdown").factoryBootstrap406_dropdownControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name")||this.$element.attr("name"),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){void 0!==window.factory_dropdown_control_events_data&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.val(),f=window.factory_dropdown_control_events_data[d];if(f&&f[e]){var g;void 0===window.__factory_dropdown_control_detach_elements&&(window.__factory_dropdown_control_detach_elements={}),g=window.__factory_dropdown_control_detach_elements;for(var h in f[e])if(f[e].hasOwnProperty(h)){var i,j=f[e][h];switch(a.isArray(j)||(i=c.hashCode(d+j)),h){case"hide":"string"==typeof j&&a(j).hide(0);break;case"show":"string"==typeof j&&a(j).fadeIn(200);break;case"detach":"string"==typeof j&&a(j).each(function(b){g[i]||(g[i]={}),g[i][b]||(g[i][b]={}),g[i][b].recovery_contanier=a(this).parent(),g[i][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(g[i]){for(var k in g[i])g[i].hasOwnProperty(k)&&g[i][k].recovery_contanier&&g[i][k].element&&g[i][k].recovery_contanier.append(g[i][k].element);delete g[i]}break;case"removeClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).removeClass(j[l]);break;case"addClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).addClass(j[l])}}}},"buttons"===this.way)this.$result=this.$element.find(".factory-result"),this.$hints=this.$element.find(".factory-hints"),this.$buttons=this.$element.find(".btn"),c.executeEvents(this.$result),this.$buttons.click(function(){var b=a(this).data("value");return c.$buttons.removeClass("active"),a(this).addClass("active"),c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+b).fadeIn(),c.$result.val(b),c.$result.trigger("change"),!1});else if("ddslick"===this.way){c.executeEvents(c.$element.find(".factory-result"));var d=window["factory_"+this.name+"_data"],e=this.$element.find(".factory-ddslick"),f=this.$element.data("width")||300,g=this.$element.data("align")||"right";a(d).each(function(){return this.imageHoverSrc?void(a("<img/>")[0].src=this.imageHoverSrc):!0}),e.ddslick({data:d,width:f,imagePosition:g,selectText:"- select -",onSelected:function(a){a.selectedData.imageHoverSrc&&c.$element.find(".dd-selected-image").attr("src",a.selectedData.imageHoverSrc);var b=c.$element.find(".factory-result").val(a.selectedData.value);b.change()}})}else{c.executeEvents(this.$element),this.$hints=this.$element.next(),this.$hints.hasClass("factory-hints")&&(this.$element.change(function(){return c.updateHints(),!1}),this.updateHints=function(){var a=c.$element.val();c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+a).show()},c.updateHints()),this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(a){console&&console.log&&console.log(a.responseText),c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length)for(var d in a){var e=a[d];c.addListItem(e)}else this.$element.append("<option>"+b.emptyList+"</li>");this.$element.trigger("factory-loaded")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<option />").attr("value",b.value).text(b.title).appendTo(this.$element),e=c.getAjaxData();e.selected&&e.selected==b.value&&d.attr("selected","selected")},this.showError=function(b){this.clearList();var d=a("<div class='factory-control-error'></div>").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),e=c.getAjaxData();this.$element.append("<option>"+e.emptyList+"</li>"),this.$element.after(d),this.$element.addClass("factory-has-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var h=this.$element.data("ajax");h&&this.loadData()}};a.fn.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.factoryBootstrap406_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.factoryBootstrap406_listControl.Constructor=b,a(function(){a(".factory-bootstrap-406 .factory-list").factoryBootstrap406_listControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name"),"checklist"===this.way){this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(){c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length){this.$element.removeClass("factory-empty");for(var d in a){var e=a[d];c.addListItem(e)}}else this.$element.addClass("factory-empty"),this.$element.append("<li>"+b.emptyList+"</li>")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<li>"),e=a("<label>").attr("for","factory-checklist-"+c.name+"-"+b.value).appendTo(d),f=a("<span>").appendTo(e),g=a("<input />").attr("type","checkbox").attr("name",c.name+"[]").val(b.value).attr("id","factory-checklist-"+c.name+"-"+b.value).appendTo(f),h=(a("<span>"+b.title+"</span>").appendTo(e),c.getAjaxData());h.selected.length&&a.inArray(b.value,h.selected)>=0&&g.attr("checked","checked"),this.$element.append(d)},this.showError=function(b){this.$element.html("").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),this.$element.addClass("factory-list-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var d=this.$element.data("ajax");d&&this.loadData()}};a.fn.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.factoryBootstrap406_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-406 .factory-multiple-textbox-group").factoryBootstrap406_MultipleTextboxControl()})}(jQuery);
7
  * Support: http://webcraftic.com/contact-us/
8
  */
9
 
10
+ !function(a){"use strict";var b=function(b){this.$element=a(b);var c=a(".factory-mtextbox-item",this.$element).eq(0).clone(!0);a(".factory-mtextbox-add-item",this.$element).on("click",function(){var b=a(this).closest(".factory-multiple-textbox-group").find(".factory-mtextbox-items"),d=c.clone(!0),e=a('<button class="btn btn-default btn-small factory-mtextbox-remove-item"><i class="fa fa-times" aria-hidden="true"></i></button>');return b.append(d.append(e)),d.find('input[type="text"]').val("").focus(),!1}),a(document).on("click",".factory-mtextbox-remove-item",function(){return a(this).closest(".factory-mtextbox-item").remove(),!1})};a.fn.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('FACTORY_BOOTSTRAP_406_LOADED') ) {
23
  return;
24
  }
25
- define('FACTORY_BOOTSTRAP_406_LOADED', true);
26
 
27
- define('FACTORY_BOOTSTRAP_406_DIR', dirname(__FILE__));
28
- define('FACTORY_BOOTSTRAP_406_URL', plugins_url(null, __FILE__));
29
 
30
  // sets version of admin interface
31
- define('FACTORY_BOOTSTRAP_406_VERSION', 'FACTORY_BOOTSTRAP_406');
32
 
33
  if( !defined('FACTORY_FLAT_ADMIN') ) {
34
  define('FACTORY_FLAT_ADMIN', true);
35
  }
36
 
37
- include_once(FACTORY_BOOTSTRAP_406_DIR . '/includes/functions.php');
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('wbcr_factory_bootstrap_406_plugin_created', 'wbcr_factory_bootstrap_406_plugin_created');
14
 
15
  /**
16
- * @param Wbcr_Factory406_Plugin $plugin
17
  */
18
- function wbcr_factory_bootstrap_406_plugin_created($plugin)
19
  {
20
- $manager = new Wbcr_FactoryBootstrap406_Manager($plugin);
21
  $plugin->setBootstap($manager);
22
  }
23
 
24
- if( !class_exists('Wbcr_FactoryBootstrap406_Manager') ) {
25
 
26
  /**
27
  * The Bootstrap Manager class.
28
  *
29
  * @since 3.2.0
30
  */
31
- class Wbcr_FactoryBootstrap406_Manager {
32
 
33
  /**
34
  * A plugin for which the manager was created.
35
  *
36
  * @since 3.2.0
37
- * @var Wbcr_Factory406_Plugin
38
  */
39
  public $plugin;
40
 
@@ -59,7 +59,7 @@
59
  *
60
  * @since 1.0.0
61
  */
62
- public function __construct(Wbcr_Factory406_Plugin $plugin)
63
  {
64
  $this->plugin = $plugin;
65
 
@@ -120,8 +120,8 @@
120
  public function loadAssets($hook)
121
  {
122
 
123
- do_action('wbcr_factory_406_bootstrap_enqueue_scripts', $hook);
124
- do_action('wbcr_factory_406_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook);
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(FACTORY_BOOTSTRAP_406_DIR . '/assets/flat/css/bootstrap.' . $color_name . '.css') ) {
155
- wp_enqueue_style('wbcr-factory-bootstrap-406-colors', FACTORY_BOOTSTRAP_406_URL . '/assets/flat/css/bootstrap.' . $color_name . '.css');
156
  }
157
  }
158
 
@@ -188,10 +188,10 @@
188
  if( !window.factory ) {
189
  window.factory = {};
190
  }
191
- if( !window.factory.factoryBootstrap406 ) {
192
- window.factory.factoryBootstrap406 = {};
193
  }
194
- window.factory.factoryBootstrap406.colors = {
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 = FACTORY_BOOTSTRAP_406_DIR . '/assets/cache/';
213
- $cache_dir_url = FACTORY_BOOTSTRAP_406_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,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 = FACTORY_BOOTSTRAP_406_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,11 +245,11 @@
245
  }
246
  } else {
247
  if( $type == 'js' ) {
248
- wp_enqueue_script(md5($script_to_load), FACTORY_BOOTSTRAP_406_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_406_URL . "/assets/$type-min/$script_to_load.min." . $type, array(), $this->plugin->getPluginVersion());
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('FACTORY_CLEARFY_203_LOADED') ) {
18
  return;
19
  }
20
- define('FACTORY_CLEARFY_203_LOADED', true);
21
 
22
- define('FACTORY_CLEARFY_203_DIR', dirname(__FILE__));
23
- define('FACTORY_CLEARFY_203_URL', plugins_url(null, __FILE__));
24
 
25
- load_plugin_textdomain('wbcr_factory_clearfy_203', false, dirname(plugin_basename(__FILE__)) . '/langs');
26
 
27
- require(FACTORY_CLEARFY_203_DIR . '/includes/class.helpers.php');
28
- require(FACTORY_CLEARFY_203_DIR . '/includes/class.configurate.php');
 
 
 
 
 
29
 
30
  // module provides function only for the admin area
31
- if( !is_admin() ) {
32
- return;
33
- }
 
 
 
 
 
34
 
35
- if( defined('FACTORY_PAGES_407_LOADED') ) {
36
- require(FACTORY_CLEARFY_203_DIR . '/pages/more-features.php');
 
 
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('Wbcr_FactoryClearfy203_Configurate') ) {
18
 
19
- abstract class Wbcr_FactoryClearfy203_Configurate {
20
 
21
  /**
22
- * @param Wbcr_Factory406_Plugin $plugin
23
  */
24
- public function __construct(Wbcr_Factory406_Plugin $plugin)
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('WbcrFactoryClearfy203_Helpers') ) {
19
- class WbcrFactoryClearfy203_Helpers {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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('Wbcr_FactoryClearfy203_MoreFeaturesPage') ) {
18
 
19
- class Wbcr_FactoryClearfy203_MoreFeaturesPage extends Wbcr_FactoryPages407_ImpressiveThemplate {
20
 
21
  public $id = "more_features";
22
 
@@ -26,9 +26,9 @@
26
 
27
  public $type = 'page';
28
 
29
- public function __construct(Wbcr_Factory406_Plugin $plugin)
30
  {
31
- $this->menu_title = __('More features (<b>free</b>)', 'wbcr_factory_clearfy_203');
32
 
33
  parent::__construct($plugin);
34
 
@@ -37,7 +37,7 @@
37
 
38
  public function getPageTitle()
39
  {
40
- return __('install the ultimate version of the plugin for free!', 'wbcr_factory_clearfy_203');
41
  }
42
 
43
  public function showPageContent()
@@ -48,83 +48,83 @@
48
  <div class="wbcr-factory-feature-box">
49
  <span class="dashicons dashicons-yes"></span>
50
 
51
- <h3><?php _e('Code cleaning', 'wbcr_factory_clearfy_203')?></h3>
52
 
53
- <p><?php _e('Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_203')?></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_203')?></h3>
61
 
62
- <p><?php _e('Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_203')?></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_203')?></h3>
70
 
71
- <p><?php _e('Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_203')?></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_203')?></h3>
79
 
80
- <p><?php _e('Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_203')?></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_203')?></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_203')?></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_203')?></h3>
98
 
99
- <p><?php _e('Allows you to remove unused widgets.', 'wbcr_factory_clearfy_203')?></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_203')?></h3>
107
 
108
- <p><?php _e('Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_203')?></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_203')?></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_203')?></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_203')?></h3>
126
 
127
- <p><?php _e('In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_203')?></p>
128
  </div>
129
  </div>
130
  </div>
@@ -139,7 +139,7 @@
139
  $url .= '?utm_source=wordpress.org&utm_campaign=' . $this->plugin->getPluginName();
140
  ?>
141
  <a href="<?= $url ?>" class="wbcr-factory-premium-button" target="_blank">
142
- <?php _e('Get the ultimate plugin 100% FREE', 'wbcr_factory_clearfy_203')?>
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('FACTORY_406_LOADED') ) {
18
  return;
19
  }
20
- define('FACTORY_406_LOADED', true);
21
 
22
- define('FACTORY_406_VERSION', '000');
23
 
24
- define('FACTORY_406_DIR', dirname(__FILE__));
25
- define('FACTORY_406_URL', plugins_url(null, __FILE__));
 
 
26
 
27
  #comp merge
28
- require_once(FACTORY_406_DIR . '/includes/functions.php');
29
- require_once(FACTORY_406_DIR . '/includes/request.class.php');
30
- require_once(FACTORY_406_DIR . '/includes/base.class.php');
31
 
32
- require_once(FACTORY_406_DIR . '/includes/assets-managment/assets-list.class.php');
33
- require_once(FACTORY_406_DIR . '/includes/assets-managment/script-list.class.php');
34
- require_once(FACTORY_406_DIR . '/includes/assets-managment/style-list.class.php');
35
 
36
- require_once(FACTORY_406_DIR . '/includes/plugin.class.php');
37
 
38
- require_once(FACTORY_406_DIR . '/includes/activation/activator.class.php');
39
- require_once(FACTORY_406_DIR . '/includes/activation/update.class.php');
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('Wbcr_Factory406_Activator') ) {
17
  /**
18
  * Plugin Activator
19
  *
20
  * @since 1.0.0
21
  */
22
- abstract class Wbcr_Factory406_Activator {
23
 
24
  /**
25
  * Curent plugin.
26
- * @var Wbcr_Factory406_Plugin
27
  */
28
  public $plugin;
29
 
30
- public function __construct(Wbcr_Factory406_Plugin $plugin)
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('Wbcr_Factory406_Update') ) {
18
  /**
19
  * Plugin Activator
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_Factory406_Update {
24
 
25
  /**
26
  * Current plugin
27
- * @var Factory406_Plugin
28
  */
29
  var $plugin;
30
 
31
- public function __construct(Wbcr_Factory406_Plugin $plugin)
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('Wbcr_Factory406_AssetsList') ) {
17
  /**
18
  * Assets List
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_Factory406_AssetsList {
23
 
24
  protected $all = array();
25
  public $header_place = array();
@@ -29,15 +29,15 @@
29
  protected $default_place;
30
 
31
  /**
32
- * @var Wbcr_Factory406_Plugin
33
  */
34
  protected $plugin;
35
 
36
  /**
37
- * @param Wbcr_Factory406_Plugin $plugin
38
  * @param bool $defaultIsFooter
39
  */
40
- public function __construct(Wbcr_Factory406_Plugin $plugin, $defaultIsFooter = true)
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('Wbcr_Factory406_ScriptList') ) {
18
 
19
  /**
20
  * Script List
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_Factory406_ScriptList extends Wbcr_Factory406_AssetsList {
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 $scriptPlace) {
55
- foreach($scriptPlace as $script) {
 
 
 
 
56
 
57
- wp_register_script($script, $script, array(), $this->plugin->getPluginVersion(), $is_footer);
 
 
 
 
58
 
59
  if( $is_first_script && $this->use_ajax ) {
60
- wp_localize_script($script, 'factory', array('ajaxurl' => admin_url('admin-ajax.php')));
61
  }
62
 
63
- if( !empty($this->localize_data[$script]) ) {
64
-
65
- wp_localize_script($script, $this->localize_data[$script][0], $this->localize_data[$script][1]);
66
  }
67
 
68
- wp_enqueue_script($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('Wbcr_Factory406_StyleList') ) {
18
 
19
  /**
20
  * Style List
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_Factory406_StyleList extends Wbcr_Factory406_AssetsList {
25
 
26
- public function connect($source = 'wordpress')
 
 
 
 
 
 
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
- wp_enqueue_style(md5($style), $style, array(), $this->plugin->getPluginVersion());
 
 
 
 
 
 
 
 
 
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('Wbcr_Factory406_Base') ) {
8
- class Wbcr_Factory406_Base {
9
 
10
  /**
11
- * Буферизуем опции плагинов в этот атрибут, для быстрого доступа
12
  *
13
- * @var array
 
14
  */
15
- private static $_opt_buffer = array();
 
 
 
 
 
 
 
16
 
17
  /**
18
  * Префикс для пространства имен среди опций Wordpress
@@ -22,357 +30,495 @@
22
  protected $prefix;
23
 
24
  /**
25
- * Экзамеляр класса Wbcr_Factory406_Request, необходим управляет http запросами
26
  *
27
- * @var Wbcr_Factory406_Request
28
  */
29
- public $request;
30
 
31
- public function __construct($plugin_path, $data)
32
- {
33
- $this->prefix = isset($data['prefix'])
34
- ? $data['prefix']
35
- : null;
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
- * @param string $option_name
61
- * @param bool $default
62
- * @return mixed|void
63
  */
64
- public function getOption($option_name, $default = false)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  {
66
- if( $option_name == 'cache_options' ) {
67
- return $default;
68
- }
69
 
70
- $get_cache_option = $this->getOptionFromCache($option_name);
 
 
 
 
71
 
72
- if( !is_null($get_cache_option) ) {
73
- return $get_cache_option === false
74
- ? $default
75
- : $get_cache_option;
76
  }
77
 
78
- $option_value = get_option($this->prefix . $option_name);
 
 
 
 
79
 
80
- if( $this->isCacheable($option_value) ) {
81
- $this->setCacheOption($option_name, $this->normalizeValue($option_value));
82
- }
83
 
84
- return $option_value === false
85
- ? $default
86
- : $this->normalizeValue($option_value);
 
87
  }
88
 
89
  /**
90
- * Обновляет опцию в базе данных и в кеше, кеш обновляется только кешируемых опций.
91
- * Не кешируемые опции это массивы, сериализованные массивы, строки больше 150 символов
92
- *
93
- * @param string $option_name
94
- * @param string $value
95
- * @return void
96
  */
97
- public function updateOption($option_name, $value)
98
  {
99
- if( $this->isCacheable($value) ) {
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
- * @param array $options
118
  * @return bool
119
  */
120
- public function updateOptions($options)
121
  {
122
- if( empty($options) ) {
123
- return false;
124
- }
125
 
126
- foreach((array)$options as $option_name => $option_value) {
127
- $this->updateOption($option_name, $option_value);
 
 
 
 
128
  }
129
 
130
- $this->updateCacheOptions($options);
131
-
132
- return true;
133
  }
134
 
135
  /**
136
- * Удаляет опцию из базы данных, если опция есть в кеше,
137
- * индивидуально удаляет опцию из кеша.
138
  *
139
- * @param string $option_name
140
- * @return void
141
  */
142
- public function deleteOption($option_name)
143
  {
144
- if( isset(self::$_opt_buffer[$this->prefix][$option_name]) ) {
145
- unset(self::$_opt_buffer[$this->prefix][$option_name]);
 
 
 
 
 
 
 
 
 
 
146
 
147
- $this->updateOption('cache_options', self::$_opt_buffer[$this->prefix]);
 
 
 
 
 
 
 
 
148
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
150
- delete_option($this->prefix . $option_name . '_is_active');
151
- delete_option($this->prefix . $option_name);
 
 
 
 
152
  }
153
 
154
  /**
155
- * Пакетное удаление опций, после удаления опции происходит очистка кеша и буфера опций
156
  *
157
- * @param array $options
158
  * @return void
159
  */
160
- public function deleteOptions($options)
161
  {
162
- if( !empty($options) ) {
163
- foreach((array)$options as $option_name) {
164
- if( isset(self::$_opt_buffer[$this->prefix]) ) {
165
- unset(self::$_opt_buffer[$this->prefix]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  }
167
 
168
- delete_option($this->prefix . $option_name . '_is_active');
169
- delete_option($this->prefix . $option_name);
 
 
170
  }
171
-
172
- $this->updateOption('cache_options', self::$_opt_buffer[$this->prefix]);
173
  }
174
  }
175
 
176
  /**
177
- * Сбрасывает кеш опций, удаляет кеш из базы данных и буфер опций
 
178
  *
179
- * @return bool
 
 
 
180
  */
181
- public function flushOptionsCache()
182
  {
183
- if( isset(self::$_opt_buffer[$this->prefix]) ) {
184
- unset(self::$_opt_buffer[$this->prefix]);
185
- self::$_opt_buffer[$this->prefix] = array();
 
186
  }
187
 
188
- $this->deleteOption('cache_options');
189
  }
190
 
191
  /**
192
- * Получает все опций текущего плагина
193
  *
194
- * @param bool $is_cacheable - только кешируемые опции, кешируемые опции это массивы,
195
- * сериализованные массивы, строки больше 150 символов
196
- * @return array
197
  */
198
- protected function getAllPluginOptions($is_cacheable = true)
199
  {
200
- global $wpdb;
201
- $options = array();
 
202
 
203
- $request = $wpdb->get_results($wpdb->prepare("
204
- SELECT option_name, option_value
205
- FROM {$wpdb->prefix}options
206
- WHERE option_name
207
- LIKE '%s'", $this->prefix . "%"));
208
 
209
- if( !empty($request) ) {
210
- foreach((array)$request as $option) {
211
- if( $is_cacheable && !$this->isCacheable($option->option_value) ) {
212
- continue;
213
- }
214
- $options[$option->option_name] = $this->normalizeValue($option->option_value);
215
- }
216
  }
217
 
218
- return $options;
 
 
 
 
 
 
 
 
219
  }
220
 
221
-
222
  /**
223
- * Записывает только одну опцию в кеш базы данных и в буфер
224
  *
 
 
225
  * @param string $option_name
226
- * @param string $value
227
- * @return void
228
- * @throws Exception
229
  */
230
- protected function setCacheOption($option_name, $value)
231
  {
232
- $this->setBufferOption($option_name, $value);
 
 
 
 
 
 
233
 
234
- if( !empty(self::$_opt_buffer[$this->prefix]) ) {
235
- $this->updateOption('cache_options', self::$_opt_buffer[$this->prefix]);
236
  }
 
 
 
 
 
 
 
 
 
237
  }
238
 
239
  /**
240
- * Пакетное обновление опций в кеше и буфер опций,
241
- * все записываемые опции приводятся к регламентированному типу данных
242
- *
243
- * @param array $options
244
  * @return bool
245
- * @throws Exception
246
  */
247
- protected function updateCacheOptions($options)
248
  {
249
- foreach((array)$options as $option_name => $value) {
250
- $option_name = str_replace($this->prefix, '', $option_name);
251
- $this->setBufferOption($option_name, $this->normalizeValue($value));
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
- * @return null
267
- * @throws Exception
268
  */
269
- protected function getOptionFromCache($option_name)
270
  {
271
- if( empty(self::$_opt_buffer[$this->prefix]) ) {
272
- $all_options = $this->getAllPluginOptions();
273
-
274
- if( !empty($all_options) ) {
275
- $this->updateCacheOptions($all_options);
276
- }
277
- }
278
 
279
- $buffer_option = $this->getBufferOption($option_name);
280
 
281
- if( !is_null($buffer_option) ) {
282
- return $buffer_option;
283
- }
 
 
 
284
 
285
- return null;
286
  }
287
 
288
  /**
289
- * Получает опцию из буфера опций
290
  *
 
 
291
  * @param string $option_name
292
- * @return null|mixed
 
293
  */
294
- private function getBufferOption($option_name)
295
  {
296
- if( isset(self::$_opt_buffer[$this->prefix][$option_name]) ) {
297
- return self::$_opt_buffer[$this->prefix][$option_name];
298
- }
 
 
 
 
 
 
299
 
300
- return null;
301
  }
302
 
303
  /**
304
- * Записывает опции в буфер опций, если опция уже есть в буфере и их значения не совпадают,
305
- * то новое значение перезаписывает старое
306
  *
307
  * @param string $option_name
308
- * @param string $option_value
309
  */
310
- private function setBufferOption($option_name, $option_value)
311
  {
312
- if( !isset(self::$_opt_buffer[$this->prefix][$option_name]) ) {
313
- self::$_opt_buffer[$this->prefix][$option_name] = $option_value;
314
  } else {
315
- if( self::$_opt_buffer[$this->prefix][$option_name] !== $option_value ) {
316
- self::$_opt_buffer[$this->prefix][$option_name] = $option_value;
317
- }
318
  }
319
  }
320
 
321
  /**
322
- * Возвращает название опции в пространстве имен плагина
 
323
  *
324
  * @param string $option_name
325
- * @return null|string
326
  */
327
- public function getOptionName($option_name)
328
  {
329
- $option_name = trim(rtrim($option_name));
330
- if( empty($option_name) || !is_string($option_name) ) {
331
- return null;
332
- }
333
 
334
- return $this->prefix . $option_name;
 
 
335
  }
336
 
337
  /**
338
- * Проверяет является ли опция кешируемой. Кешируемые опции это массивы,
339
- * сериализованные массивы, строки больше 150 символов.
340
  *
341
- * @param string $data - переданое значение опции
342
  * @return bool
343
  */
344
- public function isCacheable($data)
345
  {
346
- if( (is_string($data) && (is_serialized($data) || strlen($data) > 150)) || is_array($data) ) {
347
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
348
  }
349
 
350
- return true;
351
  }
352
 
353
  /**
354
  * Приведение значений опций к строгому типу данных
355
  *
356
- * @param $string
357
  * @return bool|int
358
  */
359
- public function normalizeValue($string)
360
  {
361
- if( is_numeric($string) ) {
362
- $number = intval($string);
363
 
364
- if( strlen($number) != strlen($string) ) {
365
- throw new Exception('Error converting data type to a number.');
 
 
 
 
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 $string;
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('wbcr_factory_406_set_lazy_redirect') ) {
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
- $url = get_option('wbcr_factory_406_lazy_redirect', null);
34
-
35
- if( empty($url) ) {
36
- return;
 
 
 
37
  }
38
-
39
- delete_option('wbcr_factory_406_lazy_redirect');
40
- wp_redirect($url);
 
 
 
 
 
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 wbcr_factory_406_deprecated_hook()
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 wbcr_factory_406_apply_filters_deprecated($tag, $args, $version, $replacement = false, $message = null)
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
- wbcr_factory_406_deprecated_hook($tag, $version, $replacement, $message);
76
 
77
  return apply_filters_ref_array($tag, $args);
78
  }
@@ -98,7 +91,7 @@
98
  *
99
  * @return void
100
  */
101
- function wbcr_factory_406_do_action_deprecated($tag, $args, $version, $replacement = false, $message = null)
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
- wbcr_factory_406_deprecated_hook($tag, $version, $replacement, $message);
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 'wbcr_factory_406_deprecated_hook_run' action to get the backtrace describing where 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 wbcr_factory_406_deprecated_hook($hook, $version, $replacement = null, $message = null)
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", "&lt;\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('Wbcr_Factory406_Plugin') ) {
18
 
19
- abstract class Wbcr_Factory406_Plugin extends Wbcr_Factory406_Base {
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 Wbcr_FactoryBootstrap406_Manager
33
  */
34
  public $bootstrap;
35
 
36
  /**
37
  * The Bootstrap Manager class.n.
38
  *
39
- * @var Wbcr_FactoryForms407_Manager
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[] Wbcr_Factory406_Plugin
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
- * @param Wbcr_FactoryBootstrap406_Manager $bootstrap
 
 
 
 
268
  */
269
- public function setBootstap(Wbcr_FactoryBootstrap406_Manager $bootstrap)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  {
271
  $this->bootstrap = $bootstrap;
272
  }
273
 
274
  /**
275
- * @param Wbcr_FactoryForms407_Manager $forms
276
  */
277
- public function setForms(Wbcr_FactoryForms407_Manager $forms)
278
  {
279
  $this->forms = $forms;
280
  }
281
 
282
  /**
283
- * @param string $class_name
284
- * @param string $path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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('Wbcr_FactoryPages407') ) {
300
- throw new Exception('The factory_pages_407 module is not included.');
301
  }
302
 
303
- Wbcr_FactoryPages407::register($this, $class_name);
304
  }
305
 
306
  /**
@@ -340,7 +289,7 @@
340
  $this->loadModule($module);
341
  }
342
 
343
- do_action('wbcr_factory_406_core_modules_loaded-' . $this->plugin_name);
344
  }
345
 
346
  /**
@@ -395,7 +344,7 @@
395
  *
396
  * @since 3.2.0
397
  * @param array $module - массив с информацией о загружаемом модуле,
398
- * пример array('libs/factory/bootstrap', 'factory_bootstrap_406', 'admin'),
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( $this->is_admin ) {
446
- add_action('admin_init', array($this, 'customizePluginRow'), 20);
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( $this->is_admin ) {
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
- $plugin_versions = get_option('factory_plugin_versions', array());
485
- $plugin_version = isset ($plugin_versions[$this->plugin_name])
486
- ? $plugin_versions[$this->plugin_name]
487
- : null;
 
 
 
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
- $plugin_versions = get_option('factory_plugin_versions', array());
 
 
 
 
 
501
  $plugin_versions[$this->plugin_name] = $this->plugin_build . '-' . $this->plugin_version;
502
- update_option('factory_plugin_versions', $plugin_versions);
503
- }
504
-
505
- /**
506
- * Customize the plugin row (on the page plugins.php).
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('wbcr_factory_406_plugin_activation_or_update_' . $this->plugin_name, $force_activation, $db_version, $this);
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('wbcr_factory_406_cancel_plugin_activation_' . $this->plugin_name, false);
601
 
602
  if( $cancelled ) {
603
  return;
@@ -610,14 +555,14 @@
610
  }
611
  }
612
 
613
- do_action('wbcr_factory_406_plugin_activation', $this);
614
- do_action('wbcr_factory_406_plugin_activation_' . $this->plugin_name, $this);
615
-
616
  // just time to know when the plugin was activated the first time
617
- $activated = $this->getOption('factory_406_plugin_activated_' . $this->plugin_name, 0);
618
-
619
  if( !$activated ) {
620
- $this->updateOption('factory_406_plugin_activated_' . $this->plugin_name, time());
621
  }
622
  }
623
 
@@ -629,14 +574,14 @@
629
  */
630
  public function deactivationHook()
631
  {
632
- $cancelled = apply_filters('wbcr_factory_406_cancel_plugin_deactivation_' . $this->plugin_name, false);
633
 
634
  if( $cancelled ) {
635
  return;
636
  }
637
 
638
- do_action('wbcr_factory_406_plugin_deactivation', $this);
639
- do_action('wbcr_factory_406_plugin_deactivation_' . $this->plugin_name, $this);
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
- ? '0' . $matches[1]
743
- : $matches[1];
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 Wbcr_Factory406_ScriptList($this);
906
  }
907
 
908
  public function newStyleList()
909
  {
910
- return new Wbcr_Factory406_StyleList($this);
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('Wbcr_Factory406_Request') ) {
8
- class Wbcr_Factory406_Request {
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
- ? array_map($sanitize_function_name, $method)
60
- : $method;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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('FACTORY_FORMS_407_LOADED') ) {
26
  return;
27
  }
28
 
29
- define('FACTORY_FORMS_407_LOADED', true);
 
 
30
 
31
  // absolute path and URL to the files and resources of the module.
32
- define('FACTORY_FORMS_407_DIR', dirname(__FILE__));
33
- define('FACTORY_FORMS_407_URL', plugins_url(null, __FILE__));
34
 
35
  #comp merge
36
- require_once(FACTORY_FORMS_407_DIR . '/includes/providers/value-provider.interface.php');
37
- require_once(FACTORY_FORMS_407_DIR . '/includes/providers/meta-value-provider.class.php');
38
- require_once(FACTORY_FORMS_407_DIR . '/includes/providers/options-value-provider.class.php');
39
 
40
- require_once(FACTORY_FORMS_407_DIR . '/includes/form.class.php');
41
  #endcomp
42
 
43
- load_plugin_textdomain('wbcr_factory_forms_407', false, dirname(plugin_basename(__FILE__)) . '/langs');
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 'wbcr_factory_forms_407_register_controls' hook
50
  *
51
  * @since 3.0.7
52
  */
53
- if( !function_exists('wbcr_factory_forms_407_register_default_controls') ) {
54
 
55
  /**
56
- * @param Wbcr_Factory406_Plugin $plugin
57
  * @throws Exception
58
  */
59
- function wbcr_factory_forms_407_register_default_controls(Wbcr_Factory406_Plugin $plugin)
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(FACTORY_FORMS_407_DIR . '/includes/html-builder.class.php');
67
- require_once(FACTORY_FORMS_407_DIR . '/includes/form-element.class.php');
68
- require_once(FACTORY_FORMS_407_DIR . '/includes/control.class.php');
69
- require_once(FACTORY_FORMS_407_DIR . '/includes/complex-control.class.php');
70
- require_once(FACTORY_FORMS_407_DIR . '/includes/holder.class.php');
71
- require_once(FACTORY_FORMS_407_DIR . '/includes/control-holder.class.php');
72
- require_once(FACTORY_FORMS_407_DIR . '/includes/custom-element.class.php');
73
- require_once(FACTORY_FORMS_407_DIR . '/includes/form-layout.class.php');
74
 
75
  // registration of controls
76
  $plugin->forms->registerControls(array(
77
  array(
78
  'type' => 'checkbox',
79
- 'class' => 'Wbcr_FactoryForms407_CheckboxControl',
80
- 'include' => FACTORY_FORMS_407_DIR . '/controls/checkbox.php'
81
  ),
82
  array(
83
  'type' => 'list',
84
- 'class' => 'Wbcr_FactoryForms407_ListControl',
85
- 'include' => FACTORY_FORMS_407_DIR . '/controls/list.php'
86
  ),
87
  array(
88
  'type' => 'dropdown',
89
- 'class' => 'Wbcr_FactoryForms407_DropdownControl',
90
- 'include' => FACTORY_FORMS_407_DIR . '/controls/dropdown.php'
91
  ),
92
  array(
93
  'type' => 'dropdown-and-colors',
94
- 'class' => 'Wbcr_FactoryForms407_DropdownAndColorsControl',
95
- 'include' => FACTORY_FORMS_407_DIR . '/controls/dropdown-and-colors.php'
96
  ),
97
  array(
98
  'type' => 'hidden',
99
- 'class' => 'Wbcr_FactoryForms407_HiddenControl',
100
- 'include' => FACTORY_FORMS_407_DIR . '/controls/hidden.php'
101
  ),
102
  array(
103
  'type' => 'hidden',
104
- 'class' => 'Wbcr_FactoryForms407_HiddenControl',
105
- 'include' => FACTORY_FORMS_407_DIR . '/controls/hidden.php'
106
  ),
107
  array(
108
  'type' => 'radio',
109
- 'class' => 'Wbcr_FactoryForms407_RadioControl',
110
- 'include' => FACTORY_FORMS_407_DIR . '/controls/radio.php'
111
  ),
112
  array(
113
  'type' => 'radio-colors',
114
- 'class' => 'Wbcr_FactoryForms407_RadioColorsControl',
115
- 'include' => FACTORY_FORMS_407_DIR . '/controls/radio-colors.php'
116
  ),
117
  array(
118
  'type' => 'textarea',
119
- 'class' => 'Wbcr_FactoryForms407_TextareaControl',
120
- 'include' => FACTORY_FORMS_407_DIR . '/controls/textarea.php'
121
  ),
122
  array(
123
  'type' => 'textbox',
124
- 'class' => 'Wbcr_FactoryForms407_TextboxControl',
125
- 'include' => FACTORY_FORMS_407_DIR . '/controls/textbox.php'
126
  ),
127
  array(
128
  'type' => 'multiple-textbox',
129
- 'class' => 'Wbcr_FactoryForms407_MultipleTextboxControl',
130
- 'include' => FACTORY_FORMS_407_DIR . '/controls/multiple-textbox.php'
131
  ),
132
  array(
133
  'type' => 'datetimepicker-range',
134
- 'class' => 'Wbcr_FactoryForms407_DatepickerRangeControl',
135
- 'include' => FACTORY_FORMS_407_DIR . '/controls/datepicker-range.php'
136
  ),
137
  array(
138
  'type' => 'url',
139
- 'class' => 'Wbcr_FactoryForms407_UrlControl',
140
- 'include' => FACTORY_FORMS_407_DIR . '/controls/url.php'
141
  ),
142
  array(
143
  'type' => 'wp-editor',
144
- 'class' => 'Wbcr_FactoryForms407_WpEditorControl',
145
- 'include' => FACTORY_FORMS_407_DIR . '/controls/wp-editor.php'
146
  ),
147
  array(
148
  'type' => 'color',
149
- 'class' => 'Wbcr_FactoryForms407_ColorControl',
150
- 'include' => FACTORY_FORMS_407_DIR . '/controls/color.php'
151
  ),
152
  array(
153
  'type' => 'color-and-opacity',
154
- 'class' => 'Wbcr_FactoryForms407_ColorAndOpacityControl',
155
- 'include' => FACTORY_FORMS_407_DIR . '/controls/color-and-opacity.php'
156
  ),
157
  array(
158
  'type' => 'gradient',
159
- 'class' => 'Wbcr_FactoryForms407_GradientControl',
160
- 'include' => FACTORY_FORMS_407_DIR . '/controls/gradient.php'
161
  ),
162
  array(
163
  'type' => 'font',
164
- 'class' => 'Wbcr_FactoryForms407_FontControl',
165
- 'include' => FACTORY_FORMS_407_DIR . '/controls/font.php'
166
  ),
167
  array(
168
  'type' => 'google-font',
169
- 'class' => 'Wbcr_FactoryForms407_GoogleFontControl',
170
- 'include' => FACTORY_FORMS_407_DIR . '/controls/google-font.php'
171
  ),
172
  array(
173
  'type' => 'pattern',
174
- 'class' => 'Wbcr_FactoryForms407_PatternControl',
175
- 'include' => FACTORY_FORMS_407_DIR . '/controls/pattern.php'
176
  ),
177
  array(
178
  'type' => 'integer',
179
- 'class' => 'Wbcr_FactoryForms407_IntegerControl',
180
- 'include' => FACTORY_FORMS_407_DIR . '/controls/integer.php'
181
  ),
182
  array(
183
  'type' => 'control-group',
184
- 'class' => 'Wbcr_FactoryForms407_ControlGroupHolder',
185
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/control-group.php'
186
  ),
187
  array(
188
  'type' => 'paddings-editor',
189
- 'class' => 'Wbcr_FactoryForms407_PaddingsEditorControl',
190
- 'include' => FACTORY_FORMS_407_DIR . '/controls/paddings-editor.php'
191
  ),
192
  ));
193
 
@@ -195,53 +197,53 @@
195
  $plugin->forms->registerHolders(array(
196
  array(
197
  'type' => 'tab',
198
- 'class' => 'Wbcr_FactoryForms407_TabHolder',
199
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/tab.php'
200
  ),
201
  array(
202
  'type' => 'tab-item',
203
- 'class' => 'Wbcr_FactoryForms407_TabItemHolder',
204
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/tab-item.php'
205
  ),
206
  array(
207
  'type' => 'accordion',
208
- 'class' => 'Wbcr_FactoryForms407_AccordionHolder',
209
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/accordion.php'
210
  ),
211
  array(
212
  'type' => 'accordion-item',
213
- 'class' => 'Wbcr_FactoryForms407_AccordionItemHolder',
214
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/accordion-item.php'
215
  ),
216
  array(
217
  'type' => 'control-group',
218
- 'class' => 'Wbcr_FactoryForms407_ControlGroupHolder',
219
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/control-group.php'
220
  ),
221
  array(
222
  'type' => 'control-group-item',
223
- 'class' => 'Wbcr_FactoryForms407_ControlGroupItem',
224
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/control-group-item.php'
225
  ),
226
  array(
227
  'type' => 'form-group',
228
- 'class' => 'Wbcr_FactoryForms407_FormGroupHolder',
229
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/form-group.php'
230
  ),
231
  array(
232
  'type' => 'more-link',
233
- 'class' => 'Wbcr_FactoryForms407_MoreLinkHolder',
234
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/more-link.php'
235
  ),
236
  array(
237
  'type' => 'div',
238
- 'class' => 'Wbcr_FactoryForms407_DivHolder',
239
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/div.php'
240
  ),
241
  array(
242
  'type' => 'columns',
243
- 'class' => 'Wbcr_FactoryForms407_ColumnsHolder',
244
- 'include' => FACTORY_FORMS_407_DIR . '/controls/holders/columns.php'
245
  )
246
  ));
247
 
@@ -249,23 +251,23 @@
249
  $plugin->forms->registerCustomElements(array(
250
  array(
251
  'type' => 'html',
252
- 'class' => 'Wbcr_FactoryForms407_Html',
253
- 'include' => FACTORY_FORMS_407_DIR . '/controls/customs/html.php',
254
  ),
255
  array(
256
  'type' => 'separator',
257
- 'class' => 'Wbcr_FactoryForms407_Separator',
258
- 'include' => FACTORY_FORMS_407_DIR . '/controls/customs/separator.php',
259
  ),
260
  ));
261
 
262
  // registration of form layouts
263
  $plugin->forms->registerFormLayout(array(
264
  'name' => 'bootstrap-3',
265
- 'class' => 'Wbcr_FactoryForms407_Bootstrap3FormLayout',
266
- 'include' => FACTORY_FORMS_407_DIR . '/layouts/bootstrap-3/bootstrap-3.php'
267
  ));
268
  }
269
 
270
- add_action('wbcr_factory_forms_407_register_controls', 'wbcr_factory_forms_407_register_default_controls');
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('Wbcr_FactoryForms407_CheckboxControl') ) {
24
 
25
- class Wbcr_FactoryForms407_CheckboxControl extends Wbcr_FactoryForms407_Control {
26
 
27
  public $type = 'checkbox';
28
 
@@ -130,10 +130,10 @@
130
  <div <?php $this->attrs() ?>>
131
  <button type="button" class="btn btn-default btn-small btn-sm factory-on <?php if( $value ) {
132
  echo 'active';
133
- } ?>"><?php _e('On', 'wbcr_factory_forms_407') ?></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_407') ?></button>
137
  <input type="checkbox" style="display: none" id="<?php echo $name_on_form ?>" class="factory-result" name="<?php echo $name_on_form ?>" value="<?= $value ?>" <?php if( $value ) {
138
  echo 'checked="checked"';
139
  } ?>" />
20
  exit;
21
  }
22
 
23
+ if( !class_exists('Wbcr_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('Wbcr_FactoryForms407_ColorAndOpacityControl') ) {
24
  }
25
 
26
- class Wbcr_FactoryForms407_ColorAndOpacityControl extends Wbcr_FactoryForms407_ComplexControl {
27
 
28
  public $type = 'color-and-opacity';
29
 
@@ -57,8 +57,8 @@
57
  'way' => 'slider'
58
  ));
59
 
60
- $this->color = new Wbcr_FactoryForms407_ColorControl($options['color'], $form, $provider);
61
- $this->opacity = new Wbcr_FactoryForms407_IntegerControl($options['opacity'], $form, $provider);
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('Wbcr_FactoryForms407_ColorControl') ) {
24
 
25
- class Wbcr_FactoryForms407_ColorControl extends Wbcr_FactoryForms407_Control {
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('Wbcr_FactoryForms407_Html') ) {
18
 
19
- class Wbcr_FactoryForms407_Html extends Wbcr_FactoryForms407_CustomElement {
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('Wbcr_FactoryForms407_Separator') ) {
18
- class Wbcr_FactoryForms407_Separator extends Wbcr_FactoryForms407_CustomElement {
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('Wbcr_FactoryForms407_DatepickerRangeControl') ) {
33
 
34
- class Wbcr_FactoryForms407_DatepickerRangeControl extends Wbcr_FactoryForms407_ComplexControl {
35
 
36
  public $type = 'datetimepicker-range';
37
 
@@ -65,8 +65,8 @@
65
  'default' => date('Y/m/d H:i', strtotime("+1 month"))
66
  ), $options['range_2']);
67
 
68
- $this->range_1 = new Wbcr_FactoryForms407_TextboxControl($options['range_1'], $form, $provider);
69
- $this->range_2 = new Wbcr_FactoryForms407_TextboxControl($options['range_2'], $form, $provider);
70
  $this->inner_controls = array($this->range_1, $this->range_2);
71
 
72
  foreach($this->inner_controls as $key => $control) {
29
  exit;
30
  }
31
 
32
+ if( !class_exists('Wbcr_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 FactoryForms407_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 FactoryForms407_RadioColorsControl
16
  * 'colors' => array(
17
  * // a callback to return items or an array of items to select
18
  * 'data' => array(
@@ -37,9 +37,9 @@
37
  exit;
38
  }
39
 
40
- if( !class_exists('Wbcr_FactoryForms407_DropdownAndColorsControl') ) {
41
 
42
- class Wbcr_FactoryForms407_DropdownAndColorsControl extends Wbcr_FactoryForms407_ComplexControl {
43
 
44
  public $type = 'dropdown-and-colors';
45
 
@@ -69,8 +69,8 @@
69
  'name' => $this->options['name'] . '__colors',
70
  ));
71
 
72
- $this->dropdown = new Wbcr_FactoryForms407_DropdownControl($options['dropdown'], $form, $provider);
73
- $this->colors = new Wbcr_FactoryForms407_RadioColorsControl($options['colors'], $form, $provider);
74
  $this->inner_controls = array($this->dropdown, $this->colors);
75
 
76
  $colors = $this->colors->getOption('data');
5
  *
6
  * Main options:
7
  * name => a name of the control
8
+ * // see 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('Wbcr_FactoryForms407_DropdownControl') ) {
25
 
26
- class Wbcr_FactoryForms407_DropdownControl extends Wbcr_FactoryForms407_Control {
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.', 'wbcr_factory_forms_407') ) ?>'
131
  };
132
  </script>
133
  <?php
@@ -259,7 +259,7 @@
259
  }
260
 
261
  $isEmpty = $this->isAjax() || empty($items);
262
- $emptyList = $this->getOption('empty', __('- empty -', 'wbcr_factory_forms_407'));
263
 
264
  ?>
265
 
@@ -334,7 +334,7 @@
334
  : '';
335
  $title = isset($item['title'])
336
  ? $item['title']
337
- : __('- empty -', 'wbcr_factory_forms_407');
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('Wbcr_FactoryForms407_FontControl') ) {
24
 
25
- class Wbcr_FactoryForms407_FontControl extends Wbcr_FactoryForms407_ComplexControl {
26
 
27
  public $type = 'font';
28
 
@@ -54,9 +54,9 @@
54
  'pickerTarget' => '.factory-control-' . $this->options['name'] . ' .factory-picker-target'
55
  );
56
 
57
- $this->size = new Wbcr_FactoryForms407_IntegerControl($option_font_size, $form, $provider);
58
- $this->family = new Wbcr_FactoryForms407_DropdownControl($option_font_family, $form, $provider);
59
- $this->color = new Wbcr_FactoryForms407_ColorControl($optionFontColor, $form, $provider);
60
 
61
  $this->innerControls = array($this->family, $this->size, $this->color);
62
  }
@@ -66,8 +66,8 @@
66
 
67
  $fonts = $this->getDefaultFonts();
68
 
69
- $fonts = apply_filters('wbcr_factory_forms_407_fonts', $fonts);
70
- $fonts = apply_filters('wbcr_factory_forms_407_fonts-' . $this->options['name'], $fonts);
71
 
72
  return $fonts;
73
  }
@@ -77,10 +77,10 @@
77
 
78
  $fonts = array(
79
 
80
- array('inherit', __('(use default website font)', 'wbcr_factory_forms_407')),
81
  array(
82
  'group',
83
- __('Sans Serif:', 'wbcr_factory_forms_407'),
84
  array(
85
  array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
86
  array('"Arial Black", "Arial Bold", Gadget, sans-serif', 'Arial Black'),
@@ -131,7 +131,7 @@
131
  ),
132
  array(
133
  'group',
134
- __('Serif:', 'wbcr_factory_forms_407'),
135
  array(
136
  array(
137
  'Baskerville, "Baskerville Old Face", "Hoefler Text", Garamond, "Times New Roman", serif',
@@ -187,7 +187,7 @@
187
  ),
188
  array(
189
  'group',
190
- __('Monospaced:', 'wbcr_factory_forms_407'),
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 Wbcr_FactoryForms407_GoogleFontControl extends Wbcr_FactoryForms407_FontControl {
19
 
20
  public $type = 'google-font';
21
  const APIKEY = 'AIzaSyB-3vazYv7Q-5QZA04bmSKFrWcw_VhC40w';
@@ -30,7 +30,7 @@
30
  'cssClass' => 'factory-google-font-data'
31
  );
32
 
33
- $this->google_font_data = new Wbcr_FactoryForms407_HiddenControl($option_google_font_data, $form, $provider);
34
  $this->inner_controls[] = $this->google_font_data;
35
  }
36
 
@@ -49,12 +49,12 @@
49
  $google_fonts = $this->getGoogleFonts();
50
 
51
  $fonts = array(
52
- array('inherit', __('(use default website font)', 'wbcr_factory_forms_407'))
53
  );
54
 
55
  $fontsCommon = array(
56
  'group',
57
- __('Standard:', 'wbcr_factory_forms_407'),
58
  array(
59
 
60
  array('Arial, "Helvetica Neue", Helvetica, sans-serif', 'Arial'),
@@ -65,7 +65,7 @@
65
  )
66
  );
67
 
68
- $fontsGoogleFonts = array('group', __('Google Fonts:', 'wbcr_factory_forms_407'), array());
69
 
70
  foreach($google_fonts->items as $item) {
71
 
@@ -115,7 +115,7 @@
115
 
116
  if( is_wp_error($response) ) {
117
 
118
- $this->error = __('Unable to retrieve the list of Google Fonts.', 'wbcr_factory_forms_407');
119
  $this->defailed_error = $response->get_error_message();
120
 
121
  return $body;
@@ -123,7 +123,7 @@
123
 
124
  if( !isset($response['body']) ) {
125
 
126
- $this->error = __('Invalide response from the Google Fonts API.', 'wbcr_factory_forms_407');
127
  $this->defailed_error = $response['body'];
128
 
129
  return $body;
@@ -133,7 +133,7 @@
133
 
134
  if( empty($body->items) ) {
135
 
136
- $this->error = __('Unexpected error. The list of Google Fonts are empty.', 'wbcr_factory_forms_407');
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('Wbcr_FactoryForms407_GradientControl') ) {
29
- class Wbcr_FactoryForms407_GradientControl extends Wbcr_FactoryForms407_Control {
30
 
31
  public $type = 'gradient';
32
 
@@ -66,8 +66,8 @@
66
  if( !window.factory.res ) {
67
  window.factory.res = {};
68
  }
69
- factory.res.resVertical = '<?php _e( 'vertical', 'wbcr_factory_forms_407' ) ?>';
70
- factory.res.resHorizontal = '<?php _e( 'horizontal', 'wbcr_factory_forms_407' ) ?>';
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('Wbcr_FactoryForms407_HiddenControl') ) {
24
 
25
- class Wbcr_FactoryForms407_HiddenControl extends Wbcr_FactoryForms407_Control {
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('Wbcr_FactoryForms407_AccordionItemHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms407_AccordionItemHolder extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_AccordionHolder') ) {
17
  /**
18
  * Tab Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_FactoryForms407_AccordionHolder extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_ColumnsHolder') ) {
18
  /**
19
  * Columns Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms407_ColumnsHolder extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_ControlGroupItem') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms407_ControlGroupItem extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_ControlGroupHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms407_ControlGroupHolder extends Wbcr_FactoryForms407_ControlHolder {
25
 
26
  /**
27
  * A holder type.
@@ -61,7 +61,7 @@
61
  continue;
62
  }
63
 
64
- $builder = new Wbcr_FactoryForms407_HtmlAttributeBuilder();
65
 
66
  $builder->addCssClass('factory-control-group-nav-label');
67
  $builder->addCssClass('factory-control-group-nav-label-' . $element->getOption('name'));
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_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('Wbcr_FactoryForms407_DivHolder') ) {
18
  /**
19
  * Div Control Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms407_DivHolder extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_FormGroupHolder') ) {
18
  /**
19
  * Group Holder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms407_FormGroupHolder extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_MoreLinkHolder') ) {
18
 
19
  /**
20
  * Collapsed Group Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms407_MoreLinkHolder extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_TabItemHolder') ) {
17
  /**
18
  * Tab Item Control Holder
19
  *
20
  * @since 1.0.0
21
  */
22
- class Wbcr_FactoryForms407_TabItemHolder extends Wbcr_FactoryForms407_Holder {
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('Wbcr_FactoryForms407_TabHolder') ) {
18
 
19
  /**
20
  * Tab Control Holder
21
  *
22
  * @since 1.0.0
23
  */
24
- class Wbcr_FactoryForms407_TabHolder extends Wbcr_FactoryForms407_Holder {
25
 
26
  /**
27
  * A holder type.
@@ -44,7 +44,7 @@
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
- * @param FactoryForms407_Form $form A parent form.
48
  */
49
  public function __construct($options, $form)
50
  {
@@ -88,7 +88,7 @@
88
  $tab_icon = $element->options['icon'];
89
  }
90
 
91
- $builder = new Wbcr_FactoryForms407_HtmlAttributeBuilder();
92
 
93
  $builder->addCssClass('factory-tab-item-header');
94
  $builder->addCssClass('factory-tab-item-header-' . $element->getName());
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_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('Wbcr_FactoryForms407_IntegerControl') ) {
36
 
37
- class Wbcr_FactoryForms407_IntegerControl extends Wbcr_FactoryForms407_Control {
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('Wbcr_FactoryForms407_ListControl') ) {
25
 
26
- class Wbcr_FactoryForms407_ListControl extends Wbcr_FactoryForms407_Control {
27
 
28
  public $type = 'list';
29
 
@@ -93,7 +93,7 @@
93
  'url': '<?php echo $data['url'] ?>',
94
  'data': <?php echo json_encode( $data['data'] ) ?>,
95
  'selected': <?php echo json_encode( $value ) ?>,
96
- 'emptyList': '<?php echo $this->getOption('empty', __('The list is empty.', 'wbcr_factory_forms_407') ) ?>'
97
  };
98
  </script>
99
  <?php
@@ -136,7 +136,7 @@
136
  : array();
137
 
138
  $is_empty = $this->isAjax() || empty($items);
139
- $emptyList = $this->getOption('empty', __('The list is empty.', 'wbcr_factory_forms_407'));
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('Wbcr_FactoryForms407_MultipleTextboxControl') ) {
19
 
20
- class Wbcr_FactoryForms407_MultipleTextboxControl extends Wbcr_FactoryForms407_Control {
21
 
22
  public $type = 'multiple-textbox';
23
 
@@ -86,7 +86,7 @@
86
  <?php endif; ?>
87
  </div>
88
  <button class="btn btn-default btn-small factory-mtextbox-add-item">
89
- <i class="fa fa-plus" aria-hidden="true"></i> <?php _e('Add new', 'wbcr_factory_forms_407') ?>
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('Wbcr_FactoryForms407_PaddingsEditorControl') ) {
18
 
19
- class Wbcr_FactoryForms407_PaddingsEditorControl extends Wbcr_FactoryForms407_Control {
20
 
21
  public $type = 'paddings-editor';
22
 
@@ -67,7 +67,7 @@
67
  </div>
68
  <div class="factory-slider-container">
69
  <label class="factory-title">
70
- <?php _e('Select a side and move the slider to set up:', 'wbcr_factory_forms_407') ?>
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('Wbcr_FactoryForms407_PatternControl') ) {
19
 
20
- class Wbcr_FactoryForms407_PatternControl extends Wbcr_FactoryForms407_Control {
21
 
22
  public $type = 'pattern';
23
 
@@ -52,12 +52,12 @@
52
  $name = $this->getOption('name');
53
 
54
  // filters to get available patterns for the given background contols
55
- $this->patterns = apply_filters('wbcr_factory_forms_407_patterns', array());
56
- $this->patterns = apply_filters('wbcr_factory_forms_407_patterns-' . $name, $this->patterns);
57
 
58
  $this->custom_patterns = $this->getOption('patterns', array());
59
 
60
- $this->color = new Wbcr_FactoryForms407_ColorControl($options['color'], $form, $provider);
61
  }
62
 
63
  /**
@@ -102,19 +102,19 @@
102
  </div>
103
  <a href="#" class="button button-default factory-button factory-change-color-btn <?php if( $hasColor ) {
104
  echo 'button-active';
105
- } ?>" title="<?php _e('Change color', 'wbcr_factory_forms_407') ?>">
106
  <i class="fa fa-flask"></i>
107
- <span><?php _e('re-color', 'wbcr_factory_forms_407') ?></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_407') ?></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_407') ?></i>
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('Wbcr_FactoryForms407_RadioColorsControl') ) {
31
 
32
- class Wbcr_FactoryForms407_RadioColorsControl extends Wbcr_FactoryForms407_Control {
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('Wbcr_FactoryForms407_RadioControl') ) {
25
 
26
- class Wbcr_FactoryForms407_RadioControl extends Wbcr_FactoryForms407_Control {
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('Wbcr_FactoryForms407_TextareaControl') ) {
24
 
25
- class Wbcr_FactoryForms407_TextareaControl extends Wbcr_FactoryForms407_Control {
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('Wbcr_FactoryForms407_TextboxControl') ) {
33
 
34
- class Wbcr_FactoryForms407_TextboxControl extends Wbcr_FactoryForms407_Control {
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 FactoryForms407_TextboxControl
8
  *
9
  * @author Alex Kovalev <alex.kovalevv@gmail.com>
10
  * @copyright (c) 2018, Webcraftic Ltd
@@ -18,9 +18,9 @@
18
  exit;
19
  }
20
 
21
- if( !class_exists('Wbcr_FactoryForms407_UrlControl') ) {
22
 
23
- class Wbcr_FactoryForms407_UrlControl extends Wbcr_FactoryForms407_TextboxControl {
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('Wbcr_FactoryForms407_WpEditorControl') ) {
26
 
27
- class Wbcr_FactoryForms407_WpEditorControl extends Wbcr_FactoryForms407_Control {
28
 
29
  public $type = 'wp-editor';
30
 
@@ -42,7 +42,7 @@
42
  }
43
 
44
  if( !isset($this->options['tinymce']['content_css']) ) {
45
- $this->options['tinymce']['content_css'] = FACTORY_FORMS_407_URL . '/assets/css/editor.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('Wbcr_FactoryForms407_ComplexControl') ) {
17
  /**
18
  * The base class for all controls.
19
  *
20
  * @since 1.0.0
21
  */
22
- abstract class Wbcr_FactoryForms407_ComplexControl extends Wbcr_FactoryForms407_Control {
23
 
24
  /**
25
  * Is this element a complex control?
@@ -33,7 +33,7 @@
33
  * Contains a set of internal controls.
34
  *
35
  * @since 1.0.0
36
- * @var Wbcr_FactoryForms407_Control[]
37
  */
38
  public $inner_controls = array();
39
 
@@ -41,7 +41,7 @@
41
  * Sets a provider for the control.
42
  *
43
  * @since 1.0.0
44
- * @param Wbcr_IFactoryForms407_ValueProvider $provider
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('Wbcr_FactoryForms407_ControlHolder') ) {
18
  /**
19
  * The base class for control holders.
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_FactoryForms407_ControlHolder extends Wbcr_FactoryForms407_Control {
24
 
25
  /**
26
  * Holder Elements.
27
  *
28
  * @since 1.0.0
29
- * @var Wbcr_FactoryForms407_Control[]
30
  */
31
  protected $elements = array();
32
 
@@ -43,7 +43,7 @@
43
  *
44
  * @since 1.0.0
45
  * @param mixed[] $options A holder options.
46
- * @param Wbcr_FactoryForms407_Form $form A parent form.
47
  */
48
  public function __construct($options, $form)
49
  {
@@ -60,7 +60,7 @@
60
  * Returns holder elements.
61
  *
62
  * @since 1.0.0
63
- * @return Wbcr_FactoryForms407_FormElement[].
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('Wbcr_FactoryForms407_Control') ) {
18
 
19
  /**
20
  * The base class for all controls.
21
  *
22
  * @since 1.0.0
23
  */
24
- abstract class Wbcr_FactoryForms407_Control extends Wbcr_FactoryForms407_FormElement {
25
 
26
  /**
27
  * Is this element a control?
@@ -43,7 +43,7 @@
43
  * A provider that is used to get values.
44
  *
45
  * @since 1.0.0
46
- * @var Wbcr_IFactoryForms407_ValueProvider
47
  */
48
  protected $provider = null;
49
 
@@ -51,7 +51,7 @@
51
  * Create a new instance of the control.
52
  *
53
  * @param mixed[] $options
54
- * @param FactoryForms407_Form $form
55
  * @param null $provider
56
  * @since 1.0.0
57
  * @return void
@@ -66,7 +66,7 @@
66
  * Sets a provider for the control.
67
  *
68
  * @since 1.0.0
69
- * @param IFactoryForms407_ValueProvider $provider
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('Wbcr_FactoryForms407_CustomElement') ) {
18
  /**
19
  * The base class for all controls.
20
  *
21
  * @since 1.0.0
22
  */
23
- abstract class Wbcr_FactoryForms407_CustomElement extends Wbcr_FactoryForms407_FormElement {
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('Wbcr_FactoryForms407_FormElement') ) {
18
 
19
  /**
20
  * The base class for all form element (controls, holders).
@@ -23,7 +23,7 @@
23
  *
24
  * @since 1.0.0
25
  */
26
- abstract class Wbcr_FactoryForms407_FormElement {
27
 
28
  /**
29
  * A type of an elemnt.
@@ -37,7 +37,7 @@
37
  * An html attribute builder.
38
  *
39
  * @since 1.0.0
40
- * @var Wbcr_FactoryForms407_HtmlAttributeBuilder
41
  */
42
  private $html_builder;
43
 
@@ -53,7 +53,7 @@
53
  * A parent form.
54
  *
55
  * @since 1.0.0
56
- * @var Wbcr_FactoryForms407_Form
57
  */
58
  protected $form;
59
 
@@ -61,7 +61,7 @@
61
  * A form layout.
62
  *
63
  * @since 1.0.0
64
- * @var Wbcr_FactoryForms407_FormLayout
65
  */
66
  protected $layout;
67
 
@@ -94,7 +94,7 @@
94
  *
95
  * @since 1.0.0
96
  * @param mixed[] $options A holder options.
97
- * @param Wbcr_FactoryForms407_Form $form A parent form.
98
  */
99
  public function __construct($options, $form)
100
  {
@@ -102,7 +102,7 @@
102
  $this->form = $form;
103
  $this->layout = $form->layout;
104
 
105
- $this->html_builder = new Wbcr_FactoryForms407_HtmlAttributeBuilder();
106
 
107
  if( isset($this->options['cssClass']) ) {
108
  $this->html_builder->addCssClass($this->options['cssClass']);
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_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('Wbcr_FactoryForms407_FormLayout') ) {
18
 
19
  /**
20
  * The base class for all form layouts.
21
  */
22
- abstract class Wbcr_FactoryForms407_FormLayout extends Wbcr_FactoryForms407_Holder {
23
 
24
  /**
25
  * A form layout name.
@@ -42,7 +42,7 @@
42
  *
43
  * @since 1.0.0
44
  * @param mixed[] $options A holder options.
45
- * @param Wbcr_FactoryForms407_Form $form A parent form.
46
  */
47
  public function __construct($options, $form)
48
  {
@@ -52,8 +52,8 @@
52
 
53
  parent::__construct($options, $form);
54
 
55
- $this->addCssClass('factory-forms-407-' . $this->type);
56
- $this->addCssClass('factory-forms-407-' . $this->name);
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('wbcr_factory_forms_407_plugin_created', 'wbcr_factory_forms_407_plugin_created');
19
 
20
- function wbcr_factory_forms_407_plugin_created($plugin)
21
  {
22
- $plugin->forms = new Wbcr_FactoryForms407_Manager($plugin);
23
  }
24
 
25
- if( !class_exists('Wbcr_FactoryForms407_Manager') ) {
26
 
27
- class Wbcr_FactoryForms407_Manager {
28
 
29
  // ----------------------------------------------------
30
  // Static fields and methods
@@ -57,7 +57,7 @@
57
  /**
58
  * Registers a set of new controls.
59
  *
60
- * @see FactoryForms407_Form::registerControl()
61
  *
62
  * @since 1.0.0
63
  * @return void
@@ -95,7 +95,7 @@
95
  /**
96
  * Registers a set of new holder controls.
97
  *
98
- * @see FactoryForms407_Form::registerHolder()
99
  *
100
  * @since 1.0.0
101
  * @return void
@@ -129,7 +129,7 @@
129
  /**
130
  * Registers a set of new custom form elements.
131
  *
132
- * @see FactoryForms407_Form::registerCustomElement()
133
  *
134
  * @since 1.0.0
135
  * @return void
@@ -180,11 +180,11 @@
180
  public static $controls_registered = false;
181
  }
182
  }
183
- if( !class_exists('Wbcr_FactoryForms407_Form') ) {
184
  /**
185
  * An abstraction for forms.
186
  */
187
- class Wbcr_FactoryForms407_Form {
188
 
189
  // ----------------------------------------------------
190
  // Object fields and methods
@@ -194,7 +194,7 @@
194
  * A value provider of the form that is used to save and load values.
195
  *
196
  * @since 1.0.0
197
- * @var Wbcr_IFactoryForms407_ValueProvider
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 FactoryForms407_FormLayout
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 Wbcr_Factory406_Plugin $plugin
266
  */
267
- public function __construct(array $options = array(), Wbcr_Factory406_Plugin $plugin)
268
  {
269
  // register controls once, when the first form is created
270
- if( !Wbcr_FactoryForms407_Manager::$controls_registered ) {
271
 
272
- do_action('wbcr_factory_forms_407_register_controls', $plugin);
273
 
274
  //if( !empty($plugin) ) {
275
- do_action('wbcr_factory_forms_407_register_controls_' . $plugin->getPluginName(), $plugin);
276
  //}
277
 
278
- Wbcr_FactoryForms407_Manager::$controls_registered = true;
279
  }
280
 
281
- $this->scope = isset($options['scope'])
282
- ? $options['scope']
283
- : null;
284
- $this->name = isset($options['name'])
285
- ? $options['name']
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
- Wbcr_FactoryForms407_Manager::$temper = 'flat';
295
  }
296
 
297
  /**
298
  * Sets a provider for the control.
299
  *
300
  * @since 1.0.0
301
- * @param Wbcr_IFactoryForms407_ValueProvider $provider
302
  * @return void
303
  */
304
  public function setProvider($provider)
@@ -334,14 +332,14 @@
334
  */
335
  public function getItems()
336
  {
337
- return apply_filters('wbcr_factory_406_form_items', $this->items, $this->name);
338
  }
339
 
340
  /**
341
  * Returns form controls (control objects).
342
  *
343
  * @since 1.0.0
344
- * @return Wbcr_FactoryForms407_Control[]
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 Wbcr_FactoryForms407_Control[]
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 Wbcr_FactoryForms407_FormElement|null A form element.
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 Wbcr_FactoryForms407_FormElement[] Created elements.
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 Wbcr_FactoryForms407_Control A control object.
441
  */
442
  public function createControl($item)
443
  {
@@ -445,7 +441,7 @@
445
 
446
  if( is_array($item) ) {
447
 
448
- $control_data = Wbcr_FactoryForms407_Manager::$registered_controls[$item['type']];
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 Wbcr_FactoryForms407_Holder A control holder object.
473
  */
474
  public function createHolder($item)
475
  {
@@ -477,7 +473,7 @@
477
 
478
  if( is_array($item) ) {
479
 
480
- $holderData = Wbcr_FactoryForms407_Manager::$registered_holders[$item['type']];
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 FactoryForms407_FormElement A custom form element object.
499
  */
500
  public function createCustomElement($item)
501
  {
@@ -503,7 +499,7 @@
503
 
504
  if( is_array($item) ) {
505
 
506
- $data = Wbcr_FactoryForms407_Manager::$registered_custom_elements[$item['type']];
507
  require_once($data['include']);
508
 
509
  $options = $item;
@@ -527,12 +523,12 @@
527
  public function html($options = array())
528
  {
529
 
530
- if( !isset(Wbcr_FactoryForms407_Manager::$form_layouts[$this->form_layout]) ) {
531
  die(sprintf('[ERROR] The form layout %s was not found.', $this->form_layout));
532
  }
533
 
534
  // include a render code
535
- $layout_data = Wbcr_FactoryForms407_Manager::$form_layouts[$this->form_layout];
536
  require_once($layout_data['include']);
537
 
538
  $this->connectAssets();
@@ -556,7 +552,7 @@
556
  {
557
 
558
  $this->connectAssetsForItems();
559
- $layout_data = Wbcr_FactoryForms407_Manager::$form_layouts[$this->form_layout];
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 = Wbcr_FactoryForms407_Manager::$registered_controls;
610
  } elseif( self::isControlHolder($type) ) {
611
- $haystack = Wbcr_FactoryForms407_Manager::$registered_holders;
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
- foreach($values as $keyToSave => $valueToSave) {
651
- $this->provider->setValue($keyToSave, $valueToSave);
 
652
  }
653
  }
654
 
@@ -664,7 +660,7 @@
664
  */
665
  public static function isControl($item)
666
  {
667
- return isset(Wbcr_FactoryForms407_Manager::$registered_controls[$item['type']]);
668
  }
669
 
670
  /**
@@ -676,7 +672,7 @@
676
  */
677
  public static function isControlHolder($item)
678
  {
679
- return isset(Wbcr_FactoryForms407_Manager::$registered_holders[$item['type']]);
680
  }
681
 
682
  /**
@@ -688,7 +684,7 @@
688
  */
689
  public static function isCustomElement($item)
690
  {
691
- return isset(Wbcr_FactoryForms407_Manager::$registered_custom_elements[$item['type']]);
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('Wbcr_FactoryForms407_Holder') ) {
18
 
19
  /**
20
  * The base class for control holders.
21
  *
22
  * @since 1.0.0
23
  */
24
- abstract class Wbcr_FactoryForms407_Holder extends Wbcr_FactoryForms407_FormElement {
25
 
26
  /**
27
  * Holder Elements.
28
  *
29
  * @since 1.0.0
30
- * @var Wbcr_FactoryForms407_Control[]
31
  */
32
  protected $elements = array();
33
 
@@ -44,7 +44,7 @@
44
  *
45
  * @since 1.0.0
46
  * @param mixed[] $options A holder options.
47
- * @param Wbcr_FactoryForms407_Form $form A parent form.
48
  */
49
  public function __construct($options, $form)
50
  {
@@ -56,7 +56,7 @@
56
  * Returns holder elements.
57
  *
58
  * @since 1.0.0
59
- * @return Wbcr_FactoryForms407_Control[].
60
  */
61
  public function getElements()
62
  {
@@ -84,7 +84,7 @@
84
  $is_first_item = false;
85
  }
86
 
87
- do_action('wbcr_factory_406_form_before_element_' . $element->getOption('name'));
88
 
89
  // if a current item is a control holder
90
  if( $element->is_holder ) {
14
  exit;
15
  }
16
 
17
+ if( !class_exists('Wbcr_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('Wbcr_FactoryForms407_HtmlAttributeBuilder') ) {
18
  /**
19
  * Html Attribute Builder
20
  *
21
  * @since 1.0.0
22
  */
23
- class Wbcr_FactoryForms407_HtmlAttributeBuilder {
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('Wbcr_FactoryForms407_OptionsValueProvider') ) {
18
 
19
  /**
20
  * Factory Meta Value Provider
@@ -24,7 +24,7 @@
24
  *
25
  * @since 1.0.0
26
  */
27
- class Wbcr_FactoryForms407_MetaValueProvider implements Wbcr_IFactoryForms407_ValueProvider {
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('Wbcr_FactoryForms407_OptionsValueProvider') ) {
17
 
18
  /**
19
  * Factory Options Value Provider
@@ -22,28 +22,28 @@
22
  *
23
  * @since 1.0.0
24
  */
25
- class Wbcr_FactoryForms407_OptionsValueProvider implements Wbcr_IFactoryForms407_ValueProvider {
26
 
27
  /**
28
- * Values to save $optionName => $optionValue
29
  *
30
  * @since 1.0.0
31
- * @var mixed[]
32
  */
33
- private $values = array();
34
 
35
  /**
36
- * A prefix that will be added to all option names.
37
  *
38
  * @since 1.0.0
39
- * @var string
40
  */
41
- public $scope;
42
 
43
  /**
44
  * Creates a new instance of an options value provider.
45
  */
46
- public function __construct(Wbcr_Factory406_Plugin $plugin)
47
  {
48
  $this->plugin = $plugin;
49
  }
@@ -61,12 +61,14 @@
61
  */
62
  public function saveChanges()
63
  {
64
- $this->plugin->updateOptions($this->values);
 
 
65
  }
66
 
67
  public function getValue($name, $default = null, $multiple = false)
68
  {
69
- $value = $this->plugin->getOption($name, $default);
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('Wbcr_IFactoryForms407_ValueProvider') ) {
18
  /**
19
  * The interface for all value provides.
20
  *
21
  * @since 1.0.0
22
  */
23
- interface Wbcr_IFactoryForms407_ValueProvider {
24
 
25
  /**
26
  * Inits a form a provider to get data from a storage.
14
  if( !defined('ABSPATH') ) {
15
  exit;
16
  }
17
+ if( !class_exists('Wbcr_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('Wbcr_FactoryForms407_Bootstrap3FormLayout') ) {
18
  /**
19
  * A form layout based on Twitter Bootstrap 3
20
  */
21
- class Wbcr_FactoryForms407_Bootstrap3FormLayout extends Wbcr_FactoryForms407_FormLayout {
22
 
23
  public $name = 'default';
24
 
@@ -27,7 +27,7 @@
27
  *
28
  * @since 1.0.0
29
  * @param array $options A holder options.
30
- * @param Wbcr_FactoryForms407_Form $form A parent form.
31
  */
32
  public function __construct($options, $form)
33
  {
@@ -68,7 +68,7 @@
68
  }
69
 
70
  /**
71
- * @param Wbcr_FactoryForms407_Control $control
72
  */
73
  public function beforeControl($control)
74
  {
@@ -116,7 +116,7 @@
116
  }
117
 
118
  /**
119
- * @param Wbcr_FactoryForms407_Control $control
120
  */
121
  public function afterControl($control)
122
  {
@@ -168,7 +168,7 @@
168
  }
169
 
170
  /**
171
- * @param Wbcr_FactoryForms407_Control $control
172
  * @param int $index
173
  * @param int $total
174
  */
@@ -193,7 +193,7 @@
193
  }
194
 
195
  /**
196
- * @param Wbcr_FactoryForms407_Control $control
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('FACTORY_PAGES_407_LOADED') ) {
23
  return;
24
  }
25
- define('FACTORY_PAGES_407_LOADED', true);
26
 
27
- define('FACTORY_PAGES_407_DIR', dirname(__FILE__));
28
- define('FACTORY_PAGES_407_URL', plugins_url(null, __FILE__));
 
 
 
 
29
 
30
  if( !defined('FACTORY_FLAT_ADMIN') ) {
31
  define('FACTORY_FLAT_ADMIN', true);
32
  }
33
 
34
- load_plugin_textdomain('wbcr_factory_pages_407', false, dirname(plugin_basename(__FILE__)) . '/langs');
35
 
36
- require(FACTORY_PAGES_407_DIR . '/pages.php');
37
- require(FACTORY_PAGES_407_DIR . '/includes/page.class.php');
38
- require(FACTORY_PAGES_407_DIR . '/includes/admin-page.class.php');
39
- require(FACTORY_PAGES_407_DIR . '/templates/impressive-page.class.php');
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('Wbcr_FactoryPages407_AdminPage') ) {
18
 
19
- class Wbcr_FactoryPages407_AdminPage extends Wbcr_FactoryPages407_Page {
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(Wbcr_Factory406_Plugin $plugin)
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
- // plugin settings link
124
- add_filter("plugin_action_links_" . $plugin_path_info->relative_path, array(
125
- $this,
126
- 'addLinkToPluginActions'
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('wbcr_factory_406_page_is_hidden_' . $result_id, $this->hidden);
195
 
196
  if( $this->hidden ) {
197
  return;
198
  }
199
 
200
- $this->internal = apply_filters('wbcr_factory_406_page_is_internal_' . $result_id, $this->internal);
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('wbcr_factory_406_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), array(
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
- $baseUrl = $this->getBaseUrl();
351
-
352
  if( !empty($action) ) {
353
- $query_args['action'] = $action;
354
  }
355
- $url = add_query_arg($query_args, $baseUrl);
356
-
357
  return $url;
358
  }
359
-
360
  /**
361
  * @return string
362
  */
363
- protected function getBaseUrl()
364
  {
365
- $result_id = $this->getResultId();
366
-
367
  if( $this->menu_target ) {
368
- if( $this->custom_target ) {
369
- return admin_url('admin.php') . '?page=' . $result_id;
370
- }
371
-
372
- return $this->menu_target . '&page=' . $result_id;
373
  } else {
374
- return 'admin.php?&page=' . $result_id;
 
 
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('Wbcr_FactoryPages407_Page') ) {
18
 
19
- class Wbcr_FactoryPages407_Page {
20
 
21
  /**
22
  * Page id used to call.
@@ -26,7 +26,7 @@
26
 
27
  /**
28
  * Current Factory Plugin.
29
- * @var Wbcr_Factory406_Plugin
30
  */
31
  public $plugin;
32
 
@@ -35,12 +35,13 @@
35
  */
36
  public $result;
37
 
 
38
 
39
  /**
40
- * @param Wbcr_Factory406_Plugin $plugin
41
  * @throws Exception
42
  */
43
- public function __construct(Wbcr_Factory406_Plugin $plugin)
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', 'Wbcr_FactoryPages407::actionAdminMenu');
 
18
 
19
- if( !class_exists('Wbcr_FactoryPages407') ) {
20
  /**
21
  * A base class to manage pages.
22
  *
23
  * @since 1.0.0
24
  */
25
- class Wbcr_FactoryPages407 {
26
 
27
  /**
28
- * @var Wbcr_FactoryPages407_Page[]
29
  */
30
  private static $pages = array();
31
 
32
  /**
33
- * @param Wbcr_Factory406_Plugin $plugin
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
- self::$pages[$plugin->getPluginName()][] = new $class_name($plugin);
 
 
 
 
42
  }
43
 
44
  public static function actionAdminMenu()
@@ -54,8 +59,23 @@
54
  }
55
  }
56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  /**
58
- * @param Wbcr_Factory406_Plugin $plugin
59
  * @return array
60
  */
61
  public static function getIds($plugin)
@@ -73,14 +93,14 @@
73
  }
74
  }
75
 
76
- if( !function_exists('wbcr_factory_pages_407_get_page_id') ) {
77
  /**
78
  *
79
- * @param Wbcr_Factory406_Plugin $plugin
80
  * @param string $page_id
81
  * @return string
82
  */
83
- function wbcr_factory_pages_407_get_page_id($plugin, $page_id)
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-407-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-407-impressive-page-template .wbcr-factory-color-grey {
21
- color: #9a9a9a;
22
- }
23
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-orange-color {
24
- color: #ffc107;
25
- }
26
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-light-orange-color {
27
- color: #ffeb3b;
28
- }
29
- #WBCR .wbcr-factory-pages-407-impressive-page-template .form-group {
30
- padding: 0 20px;
31
- }
32
- #WBCR .wbcr-factory-pages-407-impressive-page-template .form-group label {
33
- font-weight: normal;
34
- }
35
- #WBCR .wbcr-factory-pages-407-impressive-page-template .form-horizontal .control-label {
36
- max-width: 300px;
37
- }
38
- #WBCR .wbcr-factory-pages-407-impressive-page-template .factory-control-buttons {
39
- text-align: right;
40
- padding-right: 20px;
41
- }
42
- #WBCR .wbcr-factory-pages-407-impressive-page-template .factory-from-control-list label span {
43
- display: inline-block;
44
- vertical-align: bottom;
45
- }
46
- #WBCR .wbcr-factory-pages-407-impressive-page-template .factory-from-control-list label span input[type="checkbox"],
47
- #WBCR .wbcr-factory-pages-407-impressive-page-template .factory-from-control-list label span input[type="checkbox"]:focus {
48
- outline: none;
49
- }
50
- #WBCR .wbcr-factory-pages-407-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-407-impressive-page-template .alert + .wbcr-factory-page-group-header {
58
- margin-top: 0 !important;
59
- }
60
- #WBCR .wbcr-factory-pages-407-impressive-page-template .alert.alert-warning {
61
- background: #fff3d0;
62
- }
63
- #WBCR .wbcr-factory-pages-407-impressive-page-template .alert.alert-warning:nth-child(2n+1) {
64
- background: #fffde9;
65
- }
66
- #WBCR .wbcr-factory-pages-407-impressive-page-template .alert.alert-danger {
67
- background: #de716d;
68
- }
69
- #WBCR .wbcr-factory-pages-407-impressive-page-template .alert.alert-danger:nth-child(2n+1) {
70
- background: #ec8c89;
71
- }
72
- #WBCR .wbcr-factory-pages-407-impressive-page-template .alert.alert-success {
73
- background: #d0ecc4;
74
- }
75
- #WBCR .wbcr-factory-pages-407-impressive-page-template .alert.alert-success:nth-child(2n+1) {
76
- background: #e0eadb;
77
- }
78
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-header {
79
- padding: 20px 20px 40px;
80
- }
81
- #WBCR .wbcr-factory-pages-407-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-407-impressive-page-template .wbcr-factory-options,
88
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page {
89
- position: relative;
90
- background: #e6e6e6;
91
- overflow: hidden;
92
- }
93
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-options:after,
94
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page:after {
95
- display: block;
96
- content: '';
97
- clear: both;
98
- }
99
- #WBCR .wbcr-factory-pages-407-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-407-impressive-page-template .wbcr-factory-page-group-header:first-child {
106
- margin-top: 0;
107
- }
108
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-group-header strong {
109
- font-size: 15px;
110
- }
111
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-group-header p {
112
- color: #8c8888;
113
- font-size: 12px;
114
- }
115
- #WBCR .wbcr-factory-pages-407-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-407-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-wrapper,
122
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap h2.nav-tab-wrapper,
123
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap h1.nav-tab-wrapper {
124
- border: 0;
125
- }
126
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab-active {
127
- background: #efefef;
128
- }
129
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:first-child {
130
- margin-left: 80px !important;
131
- }
132
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:hover {
133
- background: #f7f7f7;
134
- }
135
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:active,
136
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap .nav-tab:focus {
137
- box-shadow: none;
138
- outline: none;
139
- }
140
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header {
141
- position: absolute;
142
- z-index: 13;
143
- top: 0;
144
- left: 0;
145
- right: 0;
146
- overflow: hidden;
147
- background-color: #32373c;
148
- color: #fff;
149
- border-radius: 5px 5px 0 0;
150
- }
151
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-logo {
152
- float: left;
153
- padding: 25px 0;
154
- font-size: 20px;
155
- line-height: 30px;
156
- font-weight: 400;
157
- text-align: center;
158
- background-color: #464b50;
159
- color: #ccc;
160
- padding-left: 25px;
161
- margin-right: 10px;
162
- background: none;
163
- }
164
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-title {
165
- display: inline-block;
166
- vertical-align: middle;
167
- }
168
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-header-title h2 {
169
- font-size: 18px;
170
- line-height: 30px;
171
- font-weight: 300;
172
- margin-top: 26px;
173
- padding: 0 !important;
174
- overflow: hidden;
175
- white-space: nowrap;
176
- text-overflow: ellipsis;
177
- color: #fff;
178
- }
179
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-control {
180
- position: relative;
181
- float: right;
182
- margin: 12px;
183
- }
184
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-control input[type="submit"] {
185
- display: inline-block;
186
- vertical-align: top;
187
- font-size: 13px;
188
- font-weight: 600;
189
- line-height: 20px;
190
- text-transform: uppercase;
191
- margin: 10px 0 0;
192
- padding: 8px 30px;
193
- cursor: pointer;
194
- position: relative;
195
- overflow: hidden;
196
- border: none;
197
- border-radius: 50px;
198
- box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.08) inset;
199
- background-color: #f1f1f1;
200
- color: inherit;
201
- transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
202
- text-align: center;
203
- outline: none;
204
- z-index: 3;
205
- }
206
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-control input[type="submit"].wbcr-factory-type-save {
207
- box-shadow: none;
208
- min-width: 200px;
209
- background-color: #8bc34a;
210
- color: #fff;
211
- }
212
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-control input[type="submit"].wbcr-factory-type-save:hover {
213
- background: #9dbb7b;
214
- color: #fff;
215
- }
216
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-header .wbcr-factory-control input[type="submit"].wbcr-factory-type-save:active {
217
- box-shadow: inset -1px 1px 1px rgba(0, 0, 0, 0.3);
218
- }
219
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar {
220
- float: left;
221
- vertical-align: top;
222
- width: 230px;
223
- background: #e6e6e6;
224
- }
225
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul {
226
- padding: 0;
227
- margin-bottom: 0;
228
- margin-top: 80px;
229
- }
230
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab {
231
- display: block;
232
- background: #efefef;
233
- margin: 1px 0;
234
- }
235
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a {
236
- display: block;
237
- width: 100%;
238
- padding: 20px 20px;
239
- font-size: 12px;
240
- color: #9a9a9a;
241
- text-decoration: none;
242
- text-transform: uppercase;
243
- }
244
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a:hover {
245
- background: #f7f6f6;
246
- }
247
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a,
248
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a:active,
249
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a:hover,
250
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a:active,
251
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a:focus {
252
- outline: 0 !important;
253
- box-shadow: none !important;
254
- }
255
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab {
256
- background: #fff;
257
- }
258
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab.wbcr-factory-active-tab a {
259
- color: #222;
260
- }
261
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-content-section,
262
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-right-sidebar-section {
263
- display: inline-block;
264
- vertical-align: top;
265
- }
266
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-content-section {
267
- width: 59%;
268
- }
269
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-content-section.wbcr-fullwidth {
270
- width: 100%;
271
- }
272
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-content-section .nav-tab-wrapper {
273
- margin-top: 15px;
274
- }
275
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content {
276
- background: #f7f7f7;
277
- padding: 0 0 20px 0;
278
- border: 1px solid #dad8d8;
279
- box-shadow: -1px 0px 1px rgba(0, 0, 0, 0.1);
280
- }
281
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-content-section .wbcr-factory-content > form {
282
- padding-top: 0 !important;
283
- }
284
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-right-sidebar-section {
285
- width: 40%;
286
- padding: 20px;
287
- margin: -40px 0 -20px;
288
- background-color: #f9f9f9;
289
- box-shadow: -1px 1px 5px rgba(0, 0, 0, 0.1);
290
- }
291
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-sidebar-widget {
292
- margin: 0 0 20px;
293
- }
294
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget {
295
- display: inline-block;
296
- min-height: 230px;
297
- width: 100%;
298
- margin-top: 20px;
299
- background-color: #fff;
300
- padding: 20px 15px;
301
- vertical-align: top;
302
- }
303
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-hide {
304
- display: none;
305
- }
306
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-warning {
307
- background: #fff4d0;
308
- }
309
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-danger {
310
- background: #e2ffc0;
311
- }
312
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget.wbcr-factory-success {
313
- background: #ffebe9;
314
- }
315
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-hint-icon-simple {
316
- display: inline-block;
317
- width: 16px;
318
- height: 16px;
319
- line-height: 13px;
320
- padding: 0;
321
- font-size: 11px;
322
- text-align: center;
323
- color: #fff;
324
- background: #E91E63;
325
- border-radius: 3px;
326
- }
327
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-grey {
328
- background: #E91E63;
329
- }
330
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-red {
331
- background: #9e9e9e;
332
- }
333
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-simple-green {
334
- background: #8bc34a;
335
- }
336
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget .wbcr-factory-icon-5stars {
337
- display: block;
338
- width: 80px;
339
- height: 17px;
340
- background: url('../img/5-stars22.png') no-repeat;
341
- vertical-align: middle;
342
- margin-bottom: 5px;
343
- }
344
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] {
345
- display: block;
346
- margin: 30px auto 0;
347
- outline: none;
348
- }
349
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :focus,
350
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form input[type="image"] :active {
351
- box-shadow: none;
352
- }
353
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-sidebar-widget #wbcr-factory-paypal-donation-form .wbcr-factory-donation-price {
354
- font-size: 50px;
355
- margin-top: 30px;
356
- text-align: center;
357
- font-weight: 600;
358
- color: #8BC34A;
359
- }
360
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box {
361
- min-height: 240px;
362
- margin-bottom: 20px;
363
- text-align: center;
364
- background: #fdfcf7;
365
- padding: 30px;
366
- border: 1px solid #f3f1e7;
367
- }
368
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box .dashicons {
369
- width: 50px;
370
- height: 50px;
371
- font-size: 50px;
372
- color: #FFC107;
373
- line-height: normal;
374
- }
375
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box h3 {
376
- color: #7b6111;
377
- }
378
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-feature-box p {
379
- color: #9e9e9e;
380
- }
381
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-buttons-wrap {
382
- margin-top: 20px;
383
- text-align: center;
384
- }
385
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button {
386
- display: inline-block;
387
- padding: 20px 60px;
388
- background-color: #FFC107;
389
- color: #866605;
390
- text-decoration: none;
391
- text-transform: uppercase;
392
- font-weight: bold;
393
- transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
394
- }
395
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-more_features .wbcr-factory-premium-button:hover {
396
- background-color: #ffce3a;
397
- }
398
- #WBCR .wbcr-factory-pages-407-impressive-page-template #wbcr-factory-confirm-dialog {
399
- padding: 20px;
400
- background: #ffffff;
401
- }
402
- #WBCR .wbcr-factory-pages-407-impressive-page-template #wbcr-factory-confirm-dialog .updated,
403
- #WBCR .wbcr-factory-pages-407-impressive-page-template #wbcr-factory-confirm-dialog .alert {
404
- display: none;
405
- }
406
- #WBCR .wbcr-factory-pages-407-impressive-page-template #wbcr-factory-confirm-dialog h2 {
407
- font-size: 18px;
408
- margin-top: 10px;
409
- }
410
- #WBCR .wbcr-factory-pages-407-impressive-page-template #wbcr-factory-confirm-dialog .wbcr-factory-confirm-description {
411
- padding: 10px;
412
- background: #ffedeb;
413
- border: 1px solid #ffdfdc;
414
- margin: 15px 0;
415
- }
416
- #WBCR .wbcr-factory-pages-407-impressive-page-template #wbcr-factory-confirm-dialog .wbcr-factory-confirm-hint {
417
- margin-bottom: 15px;
418
- color: #7b7b7b;
419
- }
420
- @media screen and (max-width: 950px) {
421
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar {
422
- width: 70px;
423
- }
424
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-left-navigation-bar ul .wbcr-factory-nav-tab a {
425
- font-size: 0;
426
- }
427
- #WBCR .wbcr-factory-pages-407-impressive-page-template .wbcr-factory-page-inner-wrap {
428
- margin-left: 70px;
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-left: 80px !important;
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
- input[type="submit"] {
222
- display: inline-block;
223
- vertical-align: top;
224
- font-size: 13px;
225
- font-weight: 600;
226
- line-height: 20px;
227
- text-transform: uppercase;
228
- margin: 10px 0 0;
229
- padding: 8px 30px;
230
- cursor: pointer;
231
- position: relative;
232
- overflow: hidden;
233
- border: none;
234
- border-radius: 50px;
235
- box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.08) inset;
236
- background-color: #f1f1f1;
237
- color: inherit;
238
- transition: background-color 0.3s, border-color 0.3s, color 0.3s, opacity 0.3s;
239
- text-align: center;
240
- outline: none;
241
- z-index: 3;
 
242
 
243
- &.wbcr-factory-type-save {
244
- box-shadow: none;
245
- min-width: 200px;
246
- background-color: #8bc34a;
 
 
 
247
  color: #fff;
248
- &:hover {
249
- background: #9dbb7b;
250
- color: #fff;
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
- a {
278
  display: block;
279
  width: 100%;
280
  padding: 20px 20px;
281
  font-size: 12px;
282
- color: #9a9a9a;
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: #222;
 
 
 
 
 
298
  }
299
  }
300
  }
@@ -310,7 +363,7 @@
310
  }
311
 
312
  .wbcr-factory-content-section {
313
- width: 59%;
314
  &.wbcr-fullwidth {
315
  width: 100%;
316
  }
@@ -329,9 +382,9 @@
329
  }
330
 
331
  .wbcr-factory-right-sidebar-section {
332
- width: 40%;
333
- padding: 20px;
334
- margin: -40px 0 -20px;
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('Wbcr_FactoryPages407_ImpressiveThemplate') ) {
18
  /**
19
- * Class Wbcr_FactoryPages407_ImpressiveThemplate
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 Wbcr_FactoryPages407_ImpressiveThemplate extends Wbcr_FactoryPages407_AdminPage {
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 Wbcr_Factory406_Plugin $plugin
92
  */
93
- public function __construct(Wbcr_Factory406_Plugin $plugin)
94
  {
95
- $this->menuIcon = FACTORY_PAGES_407_URL . '/templates/assets/img/webcraftic-plugin-icon.png';
96
- $this->plugin = $plugin;
 
 
 
 
 
 
97
 
98
  parent::__construct($plugin);
99
 
 
 
 
 
 
 
 
 
 
 
100
  global $factory_impressive_page_menu;
101
-
102
- $dashicon = (!empty($this->page_menu_dashicon))
103
- ? ' ' . $this->page_menu_dashicon
104
- : '';
105
-
106
- $this->title_plugin_action_link = __('Settings', 'wbcr_factory_pages_407');
107
-
108
- //if( $this->type == 'options' ) {
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> ' . $this->getMenuTitle(),
 
117
  'position' => $this->page_menu_position,
118
  'parent' => $this->page_parent_page
119
  );
120
  }
121
-
122
- public function __call($name, $arguments)
 
 
 
 
 
123
  {
124
- if( substr($name, 0, 3) == 'get' ) {
125
- $called_method_name = 'show' . substr($name, 3);
126
- if( method_exists($this, $called_method_name) ) {
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 FactoryPages407_AdminPage
144
  *
145
  * @since 1.0.0
146
  * @return void
@@ -164,40 +193,58 @@
164
  'control.checkbox'
165
  ), 'bootstrap');
166
 
167
- $this->styles->add(FACTORY_PAGES_407_URL . '/templates/assets/css/impressive.page.template.css');
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 getMenuTitle()
175
  {
176
- return $this->menu_title;
177
- }
 
 
 
 
 
 
178
 
179
- /**
180
- * @return string
181
- */
182
- public function getPageTitle()
183
- {
184
- return $this->getMenuTitle();
185
  }
186
 
187
  /**
 
 
188
  * @return string
189
  */
190
- public function getPluginTitle()
191
  {
192
- return $this->plugin->getPluginTitle();
 
 
 
193
  }
194
 
195
  /**
 
 
 
196
  * @return string
197
  */
198
- public function getPageUrl()
199
  {
200
- return $this->getBaseUrl();
 
 
 
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
- global $factory_impressive_page_menu;
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
- // todo: test cache control
256
- if( function_exists('w3tc_pgcache_flush') ) {
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
- wbcr_factory_406_do_action_deprecated('wbcr_factory_406_imppage_flush_cache', array(
 
 
 
267
  $this->plugin->getPluginName(),
268
  $this->getResultId()
269
- ), '4.0.1', 'wbcr_factory_406_imppage_after_form_save');
 
 
 
 
 
 
 
 
270
 
271
  /**
272
- * @since 4.0.1
 
273
  */
274
- do_action('wbcr_factory_406_imppage_after_form_save', $this->plugin, $this);
275
 
276
  $this->afterFormSave();
277
 
278
- $this->redirectToAction('index', apply_filters('wbcr_factory_406_imppage_after_form_save_redirect_args', array(
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.", 'wbcr_factory_pages_407'));
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.1
 
 
 
 
 
 
 
 
 
363
  */
364
- do_action('wbcr_factory_pages_407_imppage_print_all_notices', $this->plugin, $this);
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!', 'wbcr_factory_pages_407') . (WP_CACHE
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
- $notices = apply_filters('wbcr_factory_pages_407_imppage_actions_notice', $notices, $this->plugin, $this->id);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- global $factory_impressive_page_menu;
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
- ? $page_menu[$self_page_id]
424
- : null;
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
- <?php echo $page['title'] ?>
 
 
 
 
 
 
 
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 = $factory_impressive_page_menu[$this->getMenuScope()];
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
- <?php if( $this->type == 'options' ): ?>
543
- <div class="wbcr-factory-control">
544
- <input name="<?= $this->plugin->getPluginName() ?>_save_action" class="wbcr-factory-type-save" type="submit" value="<?php _e('Save settings', 'wbcr_factory_pages_407'); ?>">
545
- <?php wp_nonce_field('wbcr_factory_' . $this->getResultId() . '_save_action'); ?>
546
- </div><?php endif; ?>
 
 
 
 
 
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
- wbcr_factory_406_apply_filters_deprecated('wbcr_factory_pages_407_imppage_right_sidebar_widgets', array(
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
- wbcr_factory_406_apply_filters_deprecated('wbcr_factory_pages_407_imppage_bottom_sidebar_widgets', array(
595
- array(
596
- 'info_widget' => $this->getInfoWidget(),
597
- 'rating_widget' => $this->getRatingWidget(),
598
- 'donate_widget' => $this->getDonateWidget()
599
- ),
600
- $this->getResultId()
601
- ), '4.0.1', 'wbcr_factory_pages_407_imppage_get_widgets');
 
602
 
603
- return apply_filters('wbcr_factory_pages_407_imppage_get_widgets', array(
604
- 'info_widget' => $this->getInfoWidget(),
605
- 'rating_widget' => $this->getRatingWidget(),
606
- 'donate_widget' => $this->getDonateWidget()
607
- ), $position, $this->plugin, $this);
 
 
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 Wbcr_FactoryForms407_OptionsValueProvider($this->plugin));
624
 
625
- $options = $this->getOptions();
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'] = '6';
640
- $options[0]['items'][$key]['items'][$group_key]['layout']['column-right'] = '6';
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'] = '6';
656
- $options[0]['items'][$key]['layout']['column-right'] = '6';
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.', 'wbcr_factory_pages_407'));
669
  exit;
670
  }
671
 
672
- wbcr_factory_406_do_action_deprecated('wbcr_factory_406_imppage_before_save', array(
 
 
 
673
  $form,
674
- $this->plugin->getPluginName()
675
- ), '4.0.1', 'wbcr_factory_406_imppage_before_form_save');
 
676
 
677
- do_action('wbcr_factory_406_imppage_before_form_save', $form, $this->plugin, $this);
 
 
 
 
678
 
679
  $this->beforeFormSave();
680
 
681
  $form->save();
682
 
683
- wbcr_factory_406_do_action_deprecated('wbcr_factory_406_imppage_saved', array(
 
 
 
684
  $form,
685
- $this->plugin->getPluginName()
686
- ), '4.0.1', 'wbcr_factory_406_imppage_form_saved');
687
-
688
- do_action('wbcr_factory_406_imppage_form_saved', $form, $this->plugin, $this);
 
 
 
 
 
689
 
690
  $this->formSaved();
691
 
@@ -696,21 +788,21 @@
696
 
697
  ?>
698
  <div id="WBCR" class="wrap">
699
- <div class="wbcr-factory-pages-407-impressive-page-template factory-bootstrap-406 factory-fontawesome-000">
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($factory_impressive_page_menu[$this->getMenuScope()] as $page) {
707
  if( !isset($page['parent']) || empty($page['parent']) ) {
708
- $min_height += 61;
709
  }
710
  }
711
  ?>
712
  <div class="wbcr-factory-page-inner-wrap">
713
- <div class="wbcr-factory-content-section<?php if( !$this->show_right_sidebar_in_options ): echo ' wbcr-fullwidth'; endif ?>">
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->show_right_sidebar_in_options ): ?>
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-407-impressive-page-template factory-bootstrap-406 factory-fontawesome-000">
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($factory_impressive_page_menu[$this->getMenuScope()] as $page) {
759
  if( !isset($page['parent']) || empty($page['parent']) ) {
760
- $min_height += 61;
761
  }
762
  }
763
  ?>
764
  <div class="wbcr-factory-page-inner-wrap">
765
- <div class="wbcr-factory-content-section<?php if( !$this->show_right_sidebar_in_options ): echo ' wbcr-fullwidth'; endif ?>">
766
  <?php $this->showPageSubMenu() ?>
767
  <div class="wbcr-factory-content" style="min-height:<?= $min_height ?>px">
768
  <?php $this->printAllNotices(); ?>
769
- <?php $this->showPageContent() ?>
 
 
 
 
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 void
783
  */
784
- public function showPageContent()
785
  {
786
  // используется в классе потомке
787
  }
788
 
789
-
790
- public function showInfoWidget()
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-407-impressive-page-template factory-bootstrap-406 factory-fontawesome-000">
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: 4.9
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.0.8
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
- * Уведомление о том, что этот плагин используется уже в составе плагина Clearfy, как его компонент.
20
- * Мы блокируем работу этого плагина, чтобы не вызывать конфликт.
21
  */
22
- if( defined('WIO_PLUGIN_ACTIVE') || (defined('WCL_PLUGIN_ACTIVE') && !defined('LOADING_ROBIN_IMAGE_OPTIMIZER_AS_ADDON')) ) {
23
- function wbcr_wio_admin_notice_error()
24
- {
25
- ?>
26
- <div class="notice notice-error">
27
- <p><?php _e('We found that you have the "Clearfy - wordpress optimization plugin" plugin installed, this plugin already has disable comments functions, so you can deactivate plugin "Image optimizer"!', 'robin-image-optimizer'); ?></p>
28
- </div>
29
- <?php
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 WIOUpdate010008 extends Wbcr_Factory406_Update {
8
 
9
  public function install()
10
  {
11
- WIO_Plugin::app()->updateOption('image_optimization_server', 'resmush');
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
  }