Version Description
Release Date - 10 July 2018
- Fixed above thumbnail hook priority on a product listing page
- Fixed an issue when "Add to Cart" button displayed for products without selected variations in a Wishlist table
- Added a notice with instructions if Setup Wizard was skipped
Download this release
Release Info
Developer | templateinvaders |
Plugin | WooCommerce Wishlist Plugin |
Version | 1.8.4 |
Comparing to | |
See all releases |
Code changes from version 1.8.3 to 1.8.4
- admin/base.helper.php +118 -118
- admin/basesection.helper.php +224 -224
- admin/basestyle.helper.php +1 -1
- admin/settings/general.class.php +1 -1
- admin/tinvwl.class.php +27 -23
- assets/css/admin-form.min.css +2 -2
- assets/css/admin-setup.min.css +2 -2
- assets/css/admin.min.css +2 -2
- assets/css/bootstrap.min.css +5 -1
- assets/css/public.min.css +2 -2
- assets/css/theme.css +5 -0
- assets/css/theme.min.css +2 -2
- assets/js/admin.min.js +1 -1
- assets/js/public.min.js +1 -1
- includes/activator.class.php +800 -800
- includes/api/yoasti18n/i18n-module.php +351 -351
- includes/form.helper.php +20 -20
- includes/notice.helper.php +396 -379
- includes/pluginextend.helper.php +567 -567
- includes/product.helper.php +3 -3
- includes/product/legacy.class.php +2 -2
- includes/tinvwl.class.php +17 -17
- includes/update.helper.php +7 -7
- includes/view.helper.php +7 -7
- includes/viewsection.helper.php +548 -548
- includes/wishlist.class.php +3 -3
- includes/wizard.class.php +14 -14
- includes/wizardsetup.helper.php +86 -86
- languages/ti-woocommerce-wishlist.pot +35 -17
- public/addtowishlist.class.php +10 -10
- public/cart.class.php +3 -3
- public/tinvwl.class.php +29 -29
- public/topwishlist.class.php +167 -167
- public/wishlist/buttons.class.php +17 -17
- public/wishlist/view.class.php +24 -5
- readme.txt +8 -1
- ti-woocommerce-wishlist.php +2 -2
- tinv-wishlists-function-integration.php +22 -9
- views/admin/templates-status.php +1 -1
- views/general.php +19 -19
- views/header.php +44 -44
admin/base.helper.php
CHANGED
@@ -1,118 +1,118 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Basic admin helper class
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist\Admin\Helper
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Basic admin helper class
|
16 |
-
*/
|
17 |
-
abstract class TInvWL_Admin_Base {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Plugin name
|
21 |
-
*
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
public $
|
25 |
-
/**
|
26 |
-
* Plugin version
|
27 |
-
*
|
28 |
-
* @var string
|
29 |
-
*/
|
30 |
-
public $
|
31 |
-
|
32 |
-
/**
|
33 |
-
* Constructor
|
34 |
-
*
|
35 |
-
* @param string $plugin_name Plugin name.
|
36 |
-
* @param string $version Plugin version.
|
37 |
-
*/
|
38 |
-
function __construct( $plugin_name, $version ) {
|
39 |
-
$this->
|
40 |
-
$this->
|
41 |
-
$this->load_function();
|
42 |
-
}
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Load function
|
46 |
-
*/
|
47 |
-
function load_function() {
|
48 |
-
|
49 |
-
}
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Formatted admin url.
|
53 |
-
*
|
54 |
-
* @param string $page Page title.
|
55 |
-
* @param string $cat Category title.
|
56 |
-
* @param array $arg Arguments array.
|
57 |
-
*
|
58 |
-
* @return string
|
59 |
-
*/
|
60 |
-
public function admin_url( $page, $cat = '', $arg = array() ) {
|
61 |
-
$protocol = is_ssl() ? 'https' : 'http';
|
62 |
-
$glue = '-';
|
63 |
-
$params = array(
|
64 |
-
'page' => implode( $glue, array_filter( array( $this->
|
65 |
-
'cat' => $cat,
|
66 |
-
);
|
67 |
-
if ( is_array( $arg ) ) {
|
68 |
-
$params = array_merge( $params, $arg );
|
69 |
-
}
|
70 |
-
$params = array_filter( $params );
|
71 |
-
$params = http_build_query( $params );
|
72 |
-
if ( is_string( $arg ) ) {
|
73 |
-
$params = $params . '&' . $arg;
|
74 |
-
}
|
75 |
-
|
76 |
-
return admin_url( sprintf( 'admin.php?%s', $params ), $protocol );
|
77 |
-
}
|
78 |
-
|
79 |
-
/**
|
80 |
-
* Basic print admin page. By attributes page and cat, determined sub function for print
|
81 |
-
*
|
82 |
-
* @return boolean
|
83 |
-
*/
|
84 |
-
public function _print_() {
|
85 |
-
|
86 |
-
$default = 'general';
|
87 |
-
$params = filter_input_array( INPUT_GET, array(
|
88 |
-
'page' => FILTER_SANITIZE_STRING,
|
89 |
-
'cat' => FILTER_SANITIZE_STRING,
|
90 |
-
'id' => FILTER_VALIDATE_INT,
|
91 |
-
) );
|
92 |
-
extract( $params ); // @codingStandardsIgnoreLine WordPress.VIP.RestrictedFunctions.extract
|
93 |
-
|
94 |
-
$glue = '-';
|
95 |
-
$page = explode( $glue, $page );
|
96 |
-
$page_last = array_shift( $page );
|
97 |
-
if ( $this->
|
98 |
-
return false;
|
99 |
-
}
|
100 |
-
|
101 |
-
$cat = empty( $cat ) ? $default : $cat;
|
102 |
-
$glue = '_';
|
103 |
-
array_push( $page, $cat );
|
104 |
-
$cat = implode( $glue, $page );
|
105 |
-
$function_name = __FUNCTION__ . $cat;
|
106 |
-
|
107 |
-
if ( method_exists( $this, $function_name ) && __FUNCTION__ != $function_name ) { // WPCS: loose comparison ok.
|
108 |
-
return $this->$function_name();
|
109 |
-
} else {
|
110 |
-
$function_name = __FUNCTION__ . $default;
|
111 |
-
if ( method_exists( $this, $function_name ) ) {
|
112 |
-
return $this->$function_name( $cat );
|
113 |
-
}
|
114 |
-
}
|
115 |
-
|
116 |
-
return false;
|
117 |
-
}
|
118 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Basic admin helper class
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist\Admin\Helper
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Basic admin helper class
|
16 |
+
*/
|
17 |
+
abstract class TInvWL_Admin_Base {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Plugin name
|
21 |
+
*
|
22 |
+
* @var string
|
23 |
+
*/
|
24 |
+
public $_name;
|
25 |
+
/**
|
26 |
+
* Plugin version
|
27 |
+
*
|
28 |
+
* @var string
|
29 |
+
*/
|
30 |
+
public $_version;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Constructor
|
34 |
+
*
|
35 |
+
* @param string $plugin_name Plugin name.
|
36 |
+
* @param string $version Plugin version.
|
37 |
+
*/
|
38 |
+
function __construct( $plugin_name, $version ) {
|
39 |
+
$this->_name = $plugin_name;
|
40 |
+
$this->_version = $version;
|
41 |
+
$this->load_function();
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Load function
|
46 |
+
*/
|
47 |
+
function load_function() {
|
48 |
+
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Formatted admin url.
|
53 |
+
*
|
54 |
+
* @param string $page Page title.
|
55 |
+
* @param string $cat Category title.
|
56 |
+
* @param array $arg Arguments array.
|
57 |
+
*
|
58 |
+
* @return string
|
59 |
+
*/
|
60 |
+
public function admin_url( $page, $cat = '', $arg = array() ) {
|
61 |
+
$protocol = is_ssl() ? 'https' : 'http';
|
62 |
+
$glue = '-';
|
63 |
+
$params = array(
|
64 |
+
'page' => implode( $glue, array_filter( array( $this->_name, $page ) ) ),
|
65 |
+
'cat' => $cat,
|
66 |
+
);
|
67 |
+
if ( is_array( $arg ) ) {
|
68 |
+
$params = array_merge( $params, $arg );
|
69 |
+
}
|
70 |
+
$params = array_filter( $params );
|
71 |
+
$params = http_build_query( $params );
|
72 |
+
if ( is_string( $arg ) ) {
|
73 |
+
$params = $params . '&' . $arg;
|
74 |
+
}
|
75 |
+
|
76 |
+
return admin_url( sprintf( 'admin.php?%s', $params ), $protocol );
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Basic print admin page. By attributes page and cat, determined sub function for print
|
81 |
+
*
|
82 |
+
* @return boolean
|
83 |
+
*/
|
84 |
+
public function _print_() {
|
85 |
+
|
86 |
+
$default = 'general';
|
87 |
+
$params = filter_input_array( INPUT_GET, array(
|
88 |
+
'page' => FILTER_SANITIZE_STRING,
|
89 |
+
'cat' => FILTER_SANITIZE_STRING,
|
90 |
+
'id' => FILTER_VALIDATE_INT,
|
91 |
+
) );
|
92 |
+
extract( $params ); // @codingStandardsIgnoreLine WordPress.VIP.RestrictedFunctions.extract
|
93 |
+
|
94 |
+
$glue = '-';
|
95 |
+
$page = explode( $glue, $page );
|
96 |
+
$page_last = array_shift( $page );
|
97 |
+
if ( $this->_name != $page_last ) { // WPCS: loose comparison ok.
|
98 |
+
return false;
|
99 |
+
}
|
100 |
+
|
101 |
+
$cat = empty( $cat ) ? $default : $cat;
|
102 |
+
$glue = '_';
|
103 |
+
array_push( $page, $cat );
|
104 |
+
$cat = implode( $glue, $page );
|
105 |
+
$function_name = __FUNCTION__ . $cat;
|
106 |
+
|
107 |
+
if ( method_exists( $this, $function_name ) && __FUNCTION__ != $function_name ) { // WPCS: loose comparison ok.
|
108 |
+
return $this->$function_name();
|
109 |
+
} else {
|
110 |
+
$function_name = __FUNCTION__ . $default;
|
111 |
+
if ( method_exists( $this, $function_name ) ) {
|
112 |
+
return $this->$function_name( $cat );
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
return false;
|
117 |
+
}
|
118 |
+
}
|
admin/basesection.helper.php
CHANGED
@@ -1,224 +1,224 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Basic admin section helper class
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist\Admin\Helper
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Basic admin section helper class
|
16 |
-
*/
|
17 |
-
abstract class TInvWL_Admin_BaseSection extends TInvWL_Admin_Base {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Priority for admin menu
|
21 |
-
*
|
22 |
-
* @var integer
|
23 |
-
*/
|
24 |
-
public $priority = 10;
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Constructor
|
28 |
-
*
|
29 |
-
* @param string $plugin_name Plugin name.
|
30 |
-
* @param string $version Plugin version.
|
31 |
-
*/
|
32 |
-
function __construct( $plugin_name, $version ) {
|
33 |
-
$this->
|
34 |
-
$this->
|
35 |
-
$menu = $this->menu();
|
36 |
-
if ( ! empty( $menu ) ) {
|
37 |
-
add_action( $this->
|
38 |
-
}
|
39 |
-
$this->load_function();
|
40 |
-
}
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Add item to admin menu
|
44 |
-
*
|
45 |
-
* @param array $data Menu.
|
46 |
-
*
|
47 |
-
* @return array
|
48 |
-
*/
|
49 |
-
function adminmenu( $data ) {
|
50 |
-
|
51 |
-
if ( ! is_array( $data ) ) {
|
52 |
-
$data = array();
|
53 |
-
}
|
54 |
-
|
55 |
-
$data[] = $this->menu();
|
56 |
-
|
57 |
-
return $data;
|
58 |
-
}
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Menu array
|
62 |
-
*/
|
63 |
-
function menu() {
|
64 |
-
|
65 |
-
}
|
66 |
-
|
67 |
-
/**
|
68 |
-
* Load function. Default load form for sections
|
69 |
-
*/
|
70 |
-
function load_function() {
|
71 |
-
$this->form();
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* General print
|
76 |
-
*
|
77 |
-
* @param integer $id Id parameter.
|
78 |
-
* @param string $cat Category parameter.
|
79 |
-
*/
|
80 |
-
function _print_general( $id = 0, $cat = '' ) {
|
81 |
-
$title = $this->menu();
|
82 |
-
$slug = $title['slug'];
|
83 |
-
$title = isset( $title['page_title'] ) ? $title['page_title'] : $title['title'];
|
84 |
-
$data = array(
|
85 |
-
'_header' => $title,
|
86 |
-
);
|
87 |
-
$method = $cat . '_data';
|
88 |
-
if ( ! method_exists( $this, $method ) ) {
|
89 |
-
$method = 'constructor_data';
|
90 |
-
}
|
91 |
-
|
92 |
-
$data = apply_filters( "{$this->
|
93 |
-
if ( method_exists( $this, $method ) ) {
|
94 |
-
$sections = apply_filters( 'tinwl_prepare_admsections_' . $method, $this->$method() );
|
95 |
-
$sections = apply_filters( 'tinwl_prepare_admsections', $sections );
|
96 |
-
$view = new TInvWL_ViewSection( $this->
|
97 |
-
$view->load_data( $sections );
|
98 |
-
$method = $cat . '_save';
|
99 |
-
if ( ! method_exists( $this, $method ) ) {
|
100 |
-
$method = 'constructor_save';
|
101 |
-
}
|
102 |
-
if ( method_exists( $this, $method ) ) {
|
103 |
-
$this->$method( apply_filters( 'tinwl_prepare_admsections_' . $method, $view->post_form() ) );
|
104 |
-
}
|
105 |
-
$method = $cat . '_load';
|
106 |
-
if ( ! method_exists( $this, $method ) ) {
|
107 |
-
$method = 'constructor_load';
|
108 |
-
}
|
109 |
-
if ( method_exists( $this, $method ) ) {
|
110 |
-
$view->load_value( apply_filters( 'tinwl_prepare_admsections_' . $method, $this->$method( $sections ) ) );
|
111 |
-
}
|
112 |
-
TInvWL_View::render( $view, $view->form_data( $data ) );
|
113 |
-
} else {
|
114 |
-
TInvWL_View::render( $slug, $data );
|
115 |
-
}
|
116 |
-
}
|
117 |
-
|
118 |
-
/**
|
119 |
-
* Method for default settings array
|
120 |
-
*
|
121 |
-
* @param array $sections Sections array.
|
122 |
-
*
|
123 |
-
* @return array
|
124 |
-
*/
|
125 |
-
function get_defaults( $sections ) {
|
126 |
-
$defaults = array();
|
127 |
-
if ( ! is_array( $sections ) ) {
|
128 |
-
return $defaults;
|
129 |
-
}
|
130 |
-
$sections = apply_filters( 'tinwl_prepare_admsections', $sections );
|
131 |
-
foreach ( $sections as $section ) {
|
132 |
-
if ( array_key_exists( 'noform', $section ) && $section['noform'] ) {
|
133 |
-
continue;
|
134 |
-
}
|
135 |
-
|
136 |
-
if ( array_key_exists( 'fields', $section ) ) {
|
137 |
-
$fields = $section['fields'];
|
138 |
-
} else {
|
139 |
-
continue;
|
140 |
-
}
|
141 |
-
$id = array_key_exists( 'id', $section ) ? $section['id'] : '';
|
142 |
-
if ( ! array_key_exists( $id, $defaults ) ) {
|
143 |
-
$defaults[ $id ] = array();
|
144 |
-
}
|
145 |
-
foreach ( $fields as $field ) {
|
146 |
-
$name = array_key_exists( 'name', $field ) ? $field['name'] : '';
|
147 |
-
$std = array_key_exists( 'std', $field ) ? $field['std'] : '';
|
148 |
-
|
149 |
-
$defaults[ $id ][ $name ] = $std;
|
150 |
-
}
|
151 |
-
if ( array_key_exists( '', $defaults[ $id ] ) ) {
|
152 |
-
unset( $defaults[ $id ][''] );
|
153 |
-
}
|
154 |
-
}
|
155 |
-
|
156 |
-
return $defaults;
|
157 |
-
}
|
158 |
-
|
159 |
-
/**
|
160 |
-
* Form for section
|
161 |
-
*/
|
162 |
-
function form() {
|
163 |
-
add_filter( $this->
|
164 |
-
add_filter( $this->
|
165 |
-
}
|
166 |
-
|
167 |
-
/**
|
168 |
-
* Form start for section
|
169 |
-
*
|
170 |
-
* @param string $content Sections content.
|
171 |
-
*
|
172 |
-
* @return string
|
173 |
-
*/
|
174 |
-
function start_form( $content ) {
|
175 |
-
$content .= '<form method="POST" autocomplete="off">';
|
176 |
-
|
177 |
-
return $content;
|
178 |
-
}
|
179 |
-
|
180 |
-
/**
|
181 |
-
* Form end for section
|
182 |
-
*
|
183 |
-
* @param string $content Sections content.
|
184 |
-
*
|
185 |
-
* @return string
|
186 |
-
*/
|
187 |
-
function end_form( $content ) {
|
188 |
-
$content .= '</form>';
|
189 |
-
|
190 |
-
return $content;
|
191 |
-
}
|
192 |
-
|
193 |
-
/**
|
194 |
-
* Load value from database
|
195 |
-
*
|
196 |
-
* @param array $sections Sections array.
|
197 |
-
*
|
198 |
-
* @return array
|
199 |
-
*/
|
200 |
-
function constructor_load( $sections ) {
|
201 |
-
$sections = $this->get_defaults( $sections );
|
202 |
-
$sections = array_keys( $sections );
|
203 |
-
$data = array();
|
204 |
-
foreach ( $sections as $section ) {
|
205 |
-
$data[ $section ] = tinv_get_option( $section );
|
206 |
-
}
|
207 |
-
|
208 |
-
return $data;
|
209 |
-
}
|
210 |
-
|
211 |
-
/**
|
212 |
-
* Save value to database
|
213 |
-
*
|
214 |
-
* @param array $data Post section data.
|
215 |
-
*/
|
216 |
-
function constructor_save( $data ) {
|
217 |
-
if ( empty( $data ) || ! is_array( $data ) ) {
|
218 |
-
return false;
|
219 |
-
}
|
220 |
-
foreach ( $data as $key => $value ) {
|
221 |
-
tinv_update_option( $key, '', $value );
|
222 |
-
}
|
223 |
-
}
|
224 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Basic admin section helper class
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist\Admin\Helper
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Basic admin section helper class
|
16 |
+
*/
|
17 |
+
abstract class TInvWL_Admin_BaseSection extends TInvWL_Admin_Base {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Priority for admin menu
|
21 |
+
*
|
22 |
+
* @var integer
|
23 |
+
*/
|
24 |
+
public $priority = 10;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Constructor
|
28 |
+
*
|
29 |
+
* @param string $plugin_name Plugin name.
|
30 |
+
* @param string $version Plugin version.
|
31 |
+
*/
|
32 |
+
function __construct( $plugin_name, $version ) {
|
33 |
+
$this->_name = $plugin_name;
|
34 |
+
$this->_version = $version;
|
35 |
+
$menu = $this->menu();
|
36 |
+
if ( ! empty( $menu ) ) {
|
37 |
+
add_action( $this->_name . '_admin_menu', array( $this, 'adminmenu' ), $this->priority );
|
38 |
+
}
|
39 |
+
$this->load_function();
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Add item to admin menu
|
44 |
+
*
|
45 |
+
* @param array $data Menu.
|
46 |
+
*
|
47 |
+
* @return array
|
48 |
+
*/
|
49 |
+
function adminmenu( $data ) {
|
50 |
+
|
51 |
+
if ( ! is_array( $data ) ) {
|
52 |
+
$data = array();
|
53 |
+
}
|
54 |
+
|
55 |
+
$data[] = $this->menu();
|
56 |
+
|
57 |
+
return $data;
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Menu array
|
62 |
+
*/
|
63 |
+
function menu() {
|
64 |
+
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Load function. Default load form for sections
|
69 |
+
*/
|
70 |
+
function load_function() {
|
71 |
+
$this->form();
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* General print
|
76 |
+
*
|
77 |
+
* @param integer $id Id parameter.
|
78 |
+
* @param string $cat Category parameter.
|
79 |
+
*/
|
80 |
+
function _print_general( $id = 0, $cat = '' ) {
|
81 |
+
$title = $this->menu();
|
82 |
+
$slug = $title['slug'];
|
83 |
+
$title = isset( $title['page_title'] ) ? $title['page_title'] : $title['title'];
|
84 |
+
$data = array(
|
85 |
+
'_header' => $title,
|
86 |
+
);
|
87 |
+
$method = $cat . '_data';
|
88 |
+
if ( ! method_exists( $this, $method ) ) {
|
89 |
+
$method = 'constructor_data';
|
90 |
+
}
|
91 |
+
|
92 |
+
$data = apply_filters( "{$this->_name}_{$cat}_data", $data );
|
93 |
+
if ( method_exists( $this, $method ) ) {
|
94 |
+
$sections = apply_filters( 'tinwl_prepare_admsections_' . $method, $this->$method() );
|
95 |
+
$sections = apply_filters( 'tinwl_prepare_admsections', $sections );
|
96 |
+
$view = new TInvWL_ViewSection( $this->_name, $this->_version );
|
97 |
+
$view->load_data( $sections );
|
98 |
+
$method = $cat . '_save';
|
99 |
+
if ( ! method_exists( $this, $method ) ) {
|
100 |
+
$method = 'constructor_save';
|
101 |
+
}
|
102 |
+
if ( method_exists( $this, $method ) ) {
|
103 |
+
$this->$method( apply_filters( 'tinwl_prepare_admsections_' . $method, $view->post_form() ) );
|
104 |
+
}
|
105 |
+
$method = $cat . '_load';
|
106 |
+
if ( ! method_exists( $this, $method ) ) {
|
107 |
+
$method = 'constructor_load';
|
108 |
+
}
|
109 |
+
if ( method_exists( $this, $method ) ) {
|
110 |
+
$view->load_value( apply_filters( 'tinwl_prepare_admsections_' . $method, $this->$method( $sections ) ) );
|
111 |
+
}
|
112 |
+
TInvWL_View::render( $view, $view->form_data( $data ) );
|
113 |
+
} else {
|
114 |
+
TInvWL_View::render( $slug, $data );
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Method for default settings array
|
120 |
+
*
|
121 |
+
* @param array $sections Sections array.
|
122 |
+
*
|
123 |
+
* @return array
|
124 |
+
*/
|
125 |
+
function get_defaults( $sections ) {
|
126 |
+
$defaults = array();
|
127 |
+
if ( ! is_array( $sections ) ) {
|
128 |
+
return $defaults;
|
129 |
+
}
|
130 |
+
$sections = apply_filters( 'tinwl_prepare_admsections', $sections );
|
131 |
+
foreach ( $sections as $section ) {
|
132 |
+
if ( array_key_exists( 'noform', $section ) && $section['noform'] ) {
|
133 |
+
continue;
|
134 |
+
}
|
135 |
+
|
136 |
+
if ( array_key_exists( 'fields', $section ) ) {
|
137 |
+
$fields = $section['fields'];
|
138 |
+
} else {
|
139 |
+
continue;
|
140 |
+
}
|
141 |
+
$id = array_key_exists( 'id', $section ) ? $section['id'] : '';
|
142 |
+
if ( ! array_key_exists( $id, $defaults ) ) {
|
143 |
+
$defaults[ $id ] = array();
|
144 |
+
}
|
145 |
+
foreach ( $fields as $field ) {
|
146 |
+
$name = array_key_exists( 'name', $field ) ? $field['name'] : '';
|
147 |
+
$std = array_key_exists( 'std', $field ) ? $field['std'] : '';
|
148 |
+
|
149 |
+
$defaults[ $id ][ $name ] = $std;
|
150 |
+
}
|
151 |
+
if ( array_key_exists( '', $defaults[ $id ] ) ) {
|
152 |
+
unset( $defaults[ $id ][''] );
|
153 |
+
}
|
154 |
+
}
|
155 |
+
|
156 |
+
return $defaults;
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Form for section
|
161 |
+
*/
|
162 |
+
function form() {
|
163 |
+
add_filter( $this->_name . '_section_before', array( $this, 'start_form' ) );
|
164 |
+
add_filter( $this->_name . '_section_after', array( $this, 'end_form' ) );
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Form start for section
|
169 |
+
*
|
170 |
+
* @param string $content Sections content.
|
171 |
+
*
|
172 |
+
* @return string
|
173 |
+
*/
|
174 |
+
function start_form( $content ) {
|
175 |
+
$content .= '<form method="POST" autocomplete="off">';
|
176 |
+
|
177 |
+
return $content;
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Form end for section
|
182 |
+
*
|
183 |
+
* @param string $content Sections content.
|
184 |
+
*
|
185 |
+
* @return string
|
186 |
+
*/
|
187 |
+
function end_form( $content ) {
|
188 |
+
$content .= '</form>';
|
189 |
+
|
190 |
+
return $content;
|
191 |
+
}
|
192 |
+
|
193 |
+
/**
|
194 |
+
* Load value from database
|
195 |
+
*
|
196 |
+
* @param array $sections Sections array.
|
197 |
+
*
|
198 |
+
* @return array
|
199 |
+
*/
|
200 |
+
function constructor_load( $sections ) {
|
201 |
+
$sections = $this->get_defaults( $sections );
|
202 |
+
$sections = array_keys( $sections );
|
203 |
+
$data = array();
|
204 |
+
foreach ( $sections as $section ) {
|
205 |
+
$data[ $section ] = tinv_get_option( $section );
|
206 |
+
}
|
207 |
+
|
208 |
+
return $data;
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Save value to database
|
213 |
+
*
|
214 |
+
* @param array $data Post section data.
|
215 |
+
*/
|
216 |
+
function constructor_save( $data ) {
|
217 |
+
if ( empty( $data ) || ! is_array( $data ) ) {
|
218 |
+
return false;
|
219 |
+
}
|
220 |
+
foreach ( $data as $key => $value ) {
|
221 |
+
tinv_update_option( $key, '', $value );
|
222 |
+
}
|
223 |
+
}
|
224 |
+
}
|
admin/basestyle.helper.php
CHANGED
@@ -192,7 +192,7 @@ abstract class TInvWL_Admin_BaseStyle extends TInvWL_Admin_BaseSection {
|
|
192 |
} else {
|
193 |
// $data['style_options'] = array();
|
194 |
}
|
195 |
-
delete_transient( $this->
|
196 |
}
|
197 |
if ( array_key_exists( 'style_plain', (array) $data ) ) {
|
198 |
if ( ! $data['style_plain']['allow'] ) {
|
192 |
} else {
|
193 |
// $data['style_options'] = array();
|
194 |
}
|
195 |
+
delete_transient( $this->_name . '_dynamic_' );
|
196 |
}
|
197 |
if ( array_key_exists( 'style_plain', (array) $data ) ) {
|
198 |
if ( ! $data['style_plain']['allow'] ) {
|
admin/settings/general.class.php
CHANGED
@@ -43,7 +43,7 @@ class TInvWL_Admin_Settings_General extends TInvWL_Admin_BaseSection {
|
|
43 |
* @return array
|
44 |
*/
|
45 |
function constructor_data() {
|
46 |
-
add_action( $this->
|
47 |
$lists = get_pages( array( 'number' => 999999 ) ); // @codingStandardsIgnoreLine WordPress.VIP.RestrictedFunctions.get_pages
|
48 |
$page_list = array( '' => '' );
|
49 |
foreach ( $lists as $list ) {
|
43 |
* @return array
|
44 |
*/
|
45 |
function constructor_data() {
|
46 |
+
add_action( $this->_name . '_section_general_before', array( $this, 'premium_features' ) );
|
47 |
$lists = get_pages( array( 'number' => 999999 ) ); // @codingStandardsIgnoreLine WordPress.VIP.RestrictedFunctions.get_pages
|
48 |
$page_list = array( '' => '' );
|
49 |
foreach ( $lists as $list ) {
|
admin/tinvwl.class.php
CHANGED
@@ -23,8 +23,8 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
23 |
* @param string $version Plugin version.
|
24 |
*/
|
25 |
function __construct( $plugin_name, $version ) {
|
26 |
-
$this->
|
27 |
-
$this->
|
28 |
}
|
29 |
|
30 |
/**
|
@@ -55,7 +55,7 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
55 |
if ( preg_match( '/\.class\.php$/i', $value ) ) {
|
56 |
$file = preg_replace( '/\.class\.php$/i', '', $value );
|
57 |
$class = 'TInvWL_Admin_Settings_' . ucfirst( $file );
|
58 |
-
$settings = new $class( $this->
|
59 |
}
|
60 |
}
|
61 |
|
@@ -67,10 +67,10 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
67 |
*/
|
68 |
function define_hooks() {
|
69 |
add_action( 'admin_menu', array( $this, 'action_menu' ) );
|
70 |
-
if ( 'skip' === filter_input( INPUT_GET, $this->
|
71 |
-
update_option( $this->
|
72 |
}
|
73 |
-
if ( ! get_option( $this->
|
74 |
add_action( 'admin_notices', array( $this, 'wizard_run_admin_notice' ) );
|
75 |
} elseif ( ! tinv_get_option( 'page', 'wishlist' ) ) {
|
76 |
add_action( 'admin_notices', array( $this, 'empty_page_admin_notice' ) );
|
@@ -93,7 +93,7 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
93 |
__( '<strong>Welcome to WooCommerce Wishlist Plugin<strong> – You‘re almost ready to start :)', 'ti-woocommerce-wishlist' ), // @codingStandardsIgnoreLine WordPress.XSS.EscapeOutput.OutputNotEscaped
|
94 |
esc_url( admin_url( 'index.php?page=tinvwl-wizard' ) ),
|
95 |
esc_html__( 'Run the Setup Wizard', 'ti-woocommerce-wishlist' ),
|
96 |
-
esc_url( admin_url( 'index.php?page=' . $this->
|
97 |
esc_html__( 'Skip Setup', 'ti-woocommerce-wishlist' )
|
98 |
);
|
99 |
}
|
@@ -102,8 +102,12 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
102 |
* Error notice if wishlist page not set.
|
103 |
*/
|
104 |
function empty_page_admin_notice() {
|
105 |
-
printf( '<div class="notice notice-error is-dismissible" style="position: relative;"><
|
106 |
-
esc_html__( '
|
|
|
|
|
|
|
|
|
107 |
esc_url( $this->admin_url( '' ) . '#general' ),
|
108 |
esc_html__( 'Please apply the Wishlist page', 'ti-woocommerce-wishlist' ),
|
109 |
esc_html__( ' or ', 'ti-woocommerce-wishlist' ),
|
@@ -116,20 +120,20 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
116 |
* Creation mune and sub-menu
|
117 |
*/
|
118 |
function action_menu() {
|
119 |
-
$page = add_menu_page( 'TI Wishlist', 'TI Wishlist', 'manage_options', $this->
|
120 |
add_action( "load-$page", array( $this, 'onload' ) );
|
121 |
-
$menu = apply_filters( $this->
|
122 |
foreach ( $menu as $item ) {
|
123 |
if ( ! array_key_exists( 'page_title', $item ) ) {
|
124 |
$item['page_title'] = $item['title'];
|
125 |
}
|
126 |
if ( ! array_key_exists( 'parent', $item ) ) {
|
127 |
-
$item['parent'] = $this->
|
128 |
}
|
129 |
if ( ! array_key_exists( 'capability', $item ) ) {
|
130 |
$item['capability'] = 'manage_options';
|
131 |
}
|
132 |
-
$item['slug'] = implode( '-', array_filter( array( $this->
|
133 |
|
134 |
$page = add_submenu_page( $item['parent'], $item['page_title'], $item['title'], $item['capability'], $item['slug'], $item['method'] );
|
135 |
add_action( "load-$page", array( $this, 'onload' ) );
|
@@ -145,7 +149,7 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
145 |
add_filter( 'admin_footer_text', array( $this, 'footer_admin' ) );
|
146 |
add_filter( 'screen_options_show_screen', array( $this, 'screen_options_hide_screen' ), 10, 2 );
|
147 |
|
148 |
-
add_filter( $this->
|
149 |
}
|
150 |
|
151 |
/**
|
@@ -153,8 +157,8 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
153 |
*/
|
154 |
function enqueue_styles() {
|
155 |
wp_enqueue_style( 'gfonts', ( is_ssl() ? 'https' : 'http' ) . '://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800', '', null, 'all' );
|
156 |
-
wp_enqueue_style( $this->
|
157 |
-
wp_enqueue_style( $this->
|
158 |
}
|
159 |
|
160 |
/**
|
@@ -162,20 +166,20 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
162 |
*/
|
163 |
function enqueue_scripts() {
|
164 |
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
165 |
-
wp_enqueue_script( $this->
|
166 |
-
wp_register_script( $this->
|
167 |
'jquery',
|
168 |
'wp-color-picker'
|
169 |
-
), $this->
|
170 |
-
wp_localize_script( $this->
|
171 |
'text_comfirm_reset' => __( 'Are you sure you want to reset the settings?', 'ti-woocommerce-wishlist' ),
|
172 |
) );
|
173 |
-
wp_enqueue_script( $this->
|
174 |
|
175 |
$user_id = get_current_user_id();
|
176 |
$user_info = get_userdata( $user_id );
|
177 |
|
178 |
-
wp_add_inline_script( $this->
|
179 |
app_id: "zyh6v0pc",
|
180 |
"Website": "' . get_site_url() . '",
|
181 |
"Plugin name": "WooCommerce Wishlist Plugin",
|
@@ -288,7 +292,7 @@ class TInvWL_Admin_TInvWL extends TInvWL_Admin_Base {
|
|
288 |
* @return boolean
|
289 |
*/
|
290 |
function screen_options_hide_screen( $show_screen, $_this ) {
|
291 |
-
if ( $this->
|
292 |
return false;
|
293 |
}
|
294 |
|
23 |
* @param string $version Plugin version.
|
24 |
*/
|
25 |
function __construct( $plugin_name, $version ) {
|
26 |
+
$this->_name = $plugin_name;
|
27 |
+
$this->_version = $version;
|
28 |
}
|
29 |
|
30 |
/**
|
55 |
if ( preg_match( '/\.class\.php$/i', $value ) ) {
|
56 |
$file = preg_replace( '/\.class\.php$/i', '', $value );
|
57 |
$class = 'TInvWL_Admin_Settings_' . ucfirst( $file );
|
58 |
+
$settings = new $class( $this->_name, $this->_version );
|
59 |
}
|
60 |
}
|
61 |
|
67 |
*/
|
68 |
function define_hooks() {
|
69 |
add_action( 'admin_menu', array( $this, 'action_menu' ) );
|
70 |
+
if ( 'skip' === filter_input( INPUT_GET, $this->_name . '-wizard' ) ) {
|
71 |
+
update_option( $this->_name . '_wizard', true );
|
72 |
}
|
73 |
+
if ( ! get_option( $this->_name . '_wizard' ) ) {
|
74 |
add_action( 'admin_notices', array( $this, 'wizard_run_admin_notice' ) );
|
75 |
} elseif ( ! tinv_get_option( 'page', 'wishlist' ) ) {
|
76 |
add_action( 'admin_notices', array( $this, 'empty_page_admin_notice' ) );
|
93 |
__( '<strong>Welcome to WooCommerce Wishlist Plugin<strong> – You‘re almost ready to start :)', 'ti-woocommerce-wishlist' ), // @codingStandardsIgnoreLine WordPress.XSS.EscapeOutput.OutputNotEscaped
|
94 |
esc_url( admin_url( 'index.php?page=tinvwl-wizard' ) ),
|
95 |
esc_html__( 'Run the Setup Wizard', 'ti-woocommerce-wishlist' ),
|
96 |
+
esc_url( admin_url( 'index.php?page=' . $this->_name . '&' . $this->_name . '-wizard=skip' ) ),
|
97 |
esc_html__( 'Skip Setup', 'ti-woocommerce-wishlist' )
|
98 |
);
|
99 |
}
|
102 |
* Error notice if wishlist page not set.
|
103 |
*/
|
104 |
function empty_page_admin_notice() {
|
105 |
+
printf( '<div class="notice notice-error is-dismissible" style="position: relative;"><h4>%1$s</h4><p>%2$s</p><ol><li>%3$s</li><li>%4$s</li><li>%5$s</li></ol><p><a href="%6$s">%7$s</a>%8$s<a href="%9$s">%10$s</a></p><button type="button" class="notice-dismiss"><span class="screen-reader-text">' . __( 'Dismiss', 'ti-woocommerce-wishlist' ) . '</span></button></div>', // @codingStandardsIgnoreLine WordPress.XSS.EscapeOutput.OutputNotEscaped
|
106 |
+
esc_html__( 'WooCommerce Wishlist Plugin is misconfigured!', 'ti-woocommerce-wishlist' ),
|
107 |
+
esc_html__( 'Since the Setup Wizard was skipped, the Wishlist may function improperly.', 'ti-woocommerce-wishlist' ),
|
108 |
+
esc_html__( 'Create a New Page or open to edit a page where the Wishlist should be displayed.', 'ti-woocommerce-wishlist' ),
|
109 |
+
__( 'Add <code>[ti_wishlistsview]</code> shortcode into a page content.', 'ti-woocommerce-wishlist' ),
|
110 |
+
esc_html__( 'In a plugin General Settings section apply this page as a "Wishlist" page.', 'ti-woocommerce-wishlist' ),
|
111 |
esc_url( $this->admin_url( '' ) . '#general' ),
|
112 |
esc_html__( 'Please apply the Wishlist page', 'ti-woocommerce-wishlist' ),
|
113 |
esc_html__( ' or ', 'ti-woocommerce-wishlist' ),
|
120 |
* Creation mune and sub-menu
|
121 |
*/
|
122 |
function action_menu() {
|
123 |
+
$page = add_menu_page( 'TI Wishlist', 'TI Wishlist', 'manage_options', $this->_name, null, TINVWL_URL . 'assets/img/icon_menu.png', 56 );
|
124 |
add_action( "load-$page", array( $this, 'onload' ) );
|
125 |
+
$menu = apply_filters( $this->_name . '_admin_menu', array() );
|
126 |
foreach ( $menu as $item ) {
|
127 |
if ( ! array_key_exists( 'page_title', $item ) ) {
|
128 |
$item['page_title'] = $item['title'];
|
129 |
}
|
130 |
if ( ! array_key_exists( 'parent', $item ) ) {
|
131 |
+
$item['parent'] = $this->_name;
|
132 |
}
|
133 |
if ( ! array_key_exists( 'capability', $item ) ) {
|
134 |
$item['capability'] = 'manage_options';
|
135 |
}
|
136 |
+
$item['slug'] = implode( '-', array_filter( array( $this->_name, $item['slug'] ) ) );
|
137 |
|
138 |
$page = add_submenu_page( $item['parent'], $item['page_title'], $item['title'], $item['capability'], $item['slug'], $item['method'] );
|
139 |
add_action( "load-$page", array( $this, 'onload' ) );
|
149 |
add_filter( 'admin_footer_text', array( $this, 'footer_admin' ) );
|
150 |
add_filter( 'screen_options_show_screen', array( $this, 'screen_options_hide_screen' ), 10, 2 );
|
151 |
|
152 |
+
add_filter( $this->_name . '_view_panelstatus', array( $this, 'status_panel' ), 9999 );
|
153 |
}
|
154 |
|
155 |
/**
|
157 |
*/
|
158 |
function enqueue_styles() {
|
159 |
wp_enqueue_style( 'gfonts', ( is_ssl() ? 'https' : 'http' ) . '://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800', '', null, 'all' );
|
160 |
+
wp_enqueue_style( $this->_name, TINVWL_URL . 'assets/css/admin.css', array(), $this->_version, 'all' );
|
161 |
+
wp_enqueue_style( $this->_name . '-form', TINVWL_URL . 'assets/css/admin-form.css', array(), $this->_version, 'all' );
|
162 |
}
|
163 |
|
164 |
/**
|
166 |
*/
|
167 |
function enqueue_scripts() {
|
168 |
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
169 |
+
wp_enqueue_script( $this->_name . '-bootstrap', TINVWL_URL . 'assets/js/bootstrap' . $suffix . '.js', array( 'jquery' ), $this->_version, 'all' );
|
170 |
+
wp_register_script( $this->_name, TINVWL_URL . 'assets/js/admin' . $suffix . '.js', array(
|
171 |
'jquery',
|
172 |
'wp-color-picker'
|
173 |
+
), $this->_version, 'all' );
|
174 |
+
wp_localize_script( $this->_name, 'tinvwl_comfirm', array(
|
175 |
'text_comfirm_reset' => __( 'Are you sure you want to reset the settings?', 'ti-woocommerce-wishlist' ),
|
176 |
) );
|
177 |
+
wp_enqueue_script( $this->_name );
|
178 |
|
179 |
$user_id = get_current_user_id();
|
180 |
$user_info = get_userdata( $user_id );
|
181 |
|
182 |
+
wp_add_inline_script( $this->_name, 'window.intercomSettings = {
|
183 |
app_id: "zyh6v0pc",
|
184 |
"Website": "' . get_site_url() . '",
|
185 |
"Plugin name": "WooCommerce Wishlist Plugin",
|
292 |
* @return boolean
|
293 |
*/
|
294 |
function screen_options_hide_screen( $show_screen, $_this ) {
|
295 |
+
if ( $this->_name === $_this->parent_base || $this->_name === $_this->parent_file ) {
|
296 |
return false;
|
297 |
}
|
298 |
|
assets/css/admin-form.min.css
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
/*! WooCommerce Wishlist Plugin - version 1.8.
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
-
.tiwlform-number-container{display:inline-block;margin:2px;position:relative;vertical-align:middle}.tiwlform-number-container button,.tiwlform-number-container input{margin:0;font-weight:800;display:inline-block;font-size:14px}.tiwlform-number-container input[type=text]{width:50px;height:36px;text-align:right;border-radius:5px;line-height:26px;margin:0}.tiwlform-number-container button{width:20px;height:38px;line-height:38px;text-align:center;border-radius:5px;margin:0 2px;background-color:#f1eee8;border:0;color:#000;padding:0;cursor:pointer}.tiwlform-number-container button:hover{background-color:#96b100;color:#
|
1 |
+
/*! WooCommerce Wishlist Plugin - version 1.8.4
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
+
.tiwlform-number-container{display:inline-block;margin:2px;position:relative;vertical-align:middle}.tiwlform-number-container button,.tiwlform-number-container input{margin:0;font-weight:800;display:inline-block;font-size:14px}.tiwlform-number-container input[type=text]{width:50px;height:36px;text-align:right;border-radius:5px;line-height:26px;margin:0}.tiwlform-number-container button{width:20px;height:38px;line-height:38px;text-align:center;border-radius:5px;margin:0 2px;background-color:#f1eee8;border:0;color:#000;padding:0;cursor:pointer}.tiwlform-number-container button:hover{background-color:#96b100;color:#fff}.tiwlform-onoff-container{cursor:pointer;position:relative;display:inline-block;height:36px;width:132px;margin:0;border-radius:3px;box-shadow:inset 1px 1px 6px 0 rgba(170,157,137,.16);transition:all .3s ease-in-out;border:1px solid #eae6df;background:#f1eee8}.tiwlform-onoff-container.disabled.checked{border-color:rgba(0,0,0,.4);background-color:rgba(0,0,0,.4)}.tiwlform-onoff-container.disabled .tiwlform-onoff-button{color:rgba(0,0,0,.4)!important}.tiwlform-onoff-container.checked{background:#96b100;border-color:#96b100}.tiwlform-onoff-container.checked .tiwlform-onoff-button{left:4px;color:#96b100}.tiwlform-onoff-container .tiwlform-onoff-button{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:3px;left:66px;width:59px;height:27px;line-height:18px;padding:4px;text-align:center;border-radius:3px;box-shadow:1px 1px 4px 0 rgba(2,2,2,.21);transition:all 350ms cubic-bezier(0,.89,.44,1);color:#6b625a;background:#fff}.tiwlform-onoff-container .tiwlform-onoff-button:before{content:"\e91e";font-size:11px;font-family:tinvwl-webfont}.tiwlform-onoff-container.checked .tiwlform-onoff-button:before{content:"\e91e";font-family:tinvwl-webfont}.tiwlform-onoff-container.disabled{background-color:rgba(0,0,0,.4)}.tiwlform-range-container{padding-top:25px;height:50px}.tiwlform-range-container .range{width:100%;position:relative}.tiwlform-range-container input[type=text]{display:none}.tiwlform-range-container .line{margin:0 5%;width:90%;height:4px;top:-14px;background-color:#ede8df;position:absolute}.tiwlform-range-container .line .selector{position:absolute;z-index:100;width:15px;height:15px;background:#fff;border:5px solid #96b100;border-radius:50%;top:-10px;right:-12.5px;cursor:pointer}.tiwlform-range-container .line-selector{width:0;background-color:#96b100;height:6px;top:-15px}.tiwlform-range-container .label{display:-ms-flexbox;display:-webkit-flex;display:flex;list-style:outside none none;padding:0}.tiwlform-range-container .label li{-moz-flex:1 1;-webkit-flex:1 1;-ms-flex:1 1;flex:1 1;position:relative;float:left;text-align:center;color:#000;padding:10px 0;font-size:14px;line-height:14px;cursor:pointer;margin:0}.tiwlform-range-container .label li.active{font-weight:600}.tiwlform-range-container .label li.preactive::before{background:#96b100;width:25px;height:25px;top:-25px}.tiwlform-range-container .label li::before{position:absolute;top:-20px;right:0;left:0;content:"";margin:0 auto;width:15px;height:15px;background:#ede8df;border-radius:50%}.tiwlform-multirbox input{display:none}.tiwlform-multirbox{border-radius:3px;border:1px solid #eae6df;box-shadow:0 0 10px rgba(0,0,0,.1) inset;display:inline-block;margin:2px;position:relative}.tiwlform-multirbox label{display:inline-block;font-weight:400;color:#948d84;margin:0;line-height:26px;vertical-align:middle;padding:5px 10px;height:26px}.tiwlform-multirbox label.checked{box-shadow:inset 0 0 0 36px #96b100;color:#fff;border-radius:3px}.tiwlform-multirbox label .dashicons{line-height:26px}.tinvwl-multicheckbox{border:1px solid #dbdbdb;border-radius:3px;box-shadow:0 0 10px rgba(0,0,0,.1) inset;margin:2px}.tinvwl-multicheckbox ul{height:208px;overflow:auto;margin:0;padding:0 12px}.tinvwl-multicheckbox li{height:30px}.tinvwl-multicheckbox label{width:100%;display:inline-block;font-weight:400}.tinvwl-multicheckbox input{margin-right:13px}.tinvwl-multicheckbox>.tinvwl-before{background-color:#fbfaf9;border-bottom:1px solid #dbdbdb;padding:7px}.tinvwl-multicheckbox>.tinvwl-after{background-color:#fbfaf9;border-top:1px solid #dbdbdb;padding:7px}.tinvwl-targeting-box{display:-ms-flexbox;display:-webkit-flex;display:flex;padding-top:28px}.tinvwl-targeting-box-action{display:none}.tinvwl-targeting-box .selector{-moz-flex:1 1 50%;-webkit-flex:1 1 50%;-ms-flex:1 1 50%;flex:1 1 50%;padding-right:20px}.tinvwl-targeting-box .selector div+div{margin-top:6px}.tinvwl-targeting-box .zone{-moz-flex:1 1 50%;-webkit-flex:1 1 50%;-ms-flex:1 1 50%;flex:1 1 50%;background-color:#fbfaf9;border-radius:3px;position:relative;margin:2px;padding:0}.tinvwl-targeting-box .inner{margin:0;padding:20px;overflow:auto;border-radius:3px;min-height:42px}.tinvwl-targeting-box .filter-field,.tinvwl-targeting-box .tinvwl-multicheckbox{width:100%}.tinvwl-targeting-box .zone>.tinvwl-after{background-color:#f4f2ee;border-top:1px solid #fbfaf9;padding:7px;margin:0;position:absolute;border-radius:0 0 3px 3px;bottom:0;left:0;right:0}.tinvwl-targeting-box .action-bth{background-color:#fff;color:#000;border:1px solid #dbdbdb;font-weight:400;text-align:center}.tinvwl-targeting-box .action-bth:hover{background-color:#96b100;color:#fff}.tinvwl-numberrange{width:100%}.tinvwl-numberrange .range{position:relative;width:100%;height:5px}
|
assets/css/admin-setup.min.css
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
/*! WooCommerce Wishlist Plugin - version 1.8.
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
-
|
1 |
+
/*! WooCommerce Wishlist Plugin - version 1.8.4
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
+
html{background:#f6f3ed}.tinvwl-wizard{max-width:886px;margin:107px auto;padding:0;box-shadow:none;background:0 0}.tinvwl-wizard .tinvwl-logo{text-align:center;margin-bottom:10px}.tinvwl-wizard .tinvwl-logo h2,.tinvwl-wizard .tinvwl-logo img{display:inline-block;vertical-align:middle}.tinvwl-wizard .tinvwl-logo img+h2{margin-left:15px}.tinvwl-wizard .tinvwl-logo h2{font-size:18px;font-weight:700;text-transform:uppercase;line-height:1.333;color:#3e3e3e}.tinvwl-wizard .tinvwl-progress{text-align:center}.tinvwl-wizard .tinvwl-progress ul{list-style:none;padding:0;margin:0}.tinvwl-wizard .tinvwl-progress li{position:relative;display:inline-block;font-family:"Open Sans",Arial,sans-serif;font-size:14px;font-weight:700;line-height:1.714;text-transform:uppercase;padding:0 0 4px;margin-top:20px;margin-right:40px;color:rgba(62,62,62,.4)}.tinvwl-wizard .tinvwl-progress li:before{content:'';position:absolute;left:0;bottom:-2px;width:calc(100% + 50px);height:2px;background:#e6e6e6}.tinvwl-wizard .tinvwl-progress li:last-child:before{width:100%}.tinvwl-wizard .tinvwl-progress li.active{padding-right:40px;margin-right:0;color:#3e3e3e}.tinvwl-wizard .tinvwl-progress li.active.last{padding-right:0;margin-right:40px}.tinvwl-wizard .tinvwl-progress li:last-child.last.active{color:#869a00}.tinvwl-wizard .tinvwl-progress li.active:after{content:'';position:absolute;left:0;bottom:-2px;width:calc(100% + 10px);height:2px;background:#a9c203}.tinvwl-wizard .tinvwl-progress li.last.active:after{width:100%}.tinvwl-wizard .tinvwl-progress li:last-child{padding-right:0!important;margin-right:0!important}.tinvwl-wizard .tinvwl-content{font-family:Arial,sans-serif;font-size:14px;line-height:1.71428571;color:#4f4639}.tinvwl-wizard .tinvwl-content .tinwl-inner{padding:34px 42px 42px;margin-top:36px;border-radius:5px;background:#fff;box-shadow:0 14px 29px 0 rgba(170,150,137,.38)}.tinvwl-wizard .tinvwl-content .tinwl-intro.tinwl-inner{padding:40px 121px}.tinvwl-wizard .tinvwl-content .tinwl-finish.tinwl-inner{padding:40px 100px}.tinvwl-wizard h1{font-size:36px;letter-spacing:-.025em;text-transform:uppercase;color:#291c09}.tinvwl-wizard label{line-height:1.429}@media (min-width:992px){.tinvwl-wizard .tinwl-inner:not(.tinvwl-social) .col-md-6.control-label{padding-top:10px}}.tinvwl-wizard .tinvwl-title-wrap h1+.tinvwl-desc{margin-top:12px}.tinvwl-wizard .tinvwl-title-wrap h1+.tinvwl-separator{margin-top:20px;margin-bottom:20px}.tinvwl-wizard .tinvwl-skip{display:inline-block;font-size:14px;color:rgba(75,75,75,.722);text-decoration:underline;line-height:1.429}.tinvwl-wizard .tinvwl-separator{display:block;width:100%;height:2px;margin:24px 0;background:#ececec}.tinvwl-wizard .form-horizontal+.tinvwl-separator,.tinvwl-wizard .tinvwl-separator+.form-horizontal{margin-top:30px}.tinvwl-wizard .row+.tinvwl-separator{margin-top:0}.tinvwl-wizard .form-group{margin-bottom:20px}.tinvwl-wizard .tinvwl-desc{font-family:"Open Sans",Arial,sans-serif;font-size:16px;line-height:1.875;margin-bottom:24px}.tinvwl-wizard .tinvwl-desc a{color:#4f4639;text-decoration:underline}.tinvwl-wizard .tinvwl-desc a:active,.tinvwl-wizard .tinvwl-desc a:focus,.tinvwl-wizard .tinvwl-desc a:hover{color:#000}.tinvwl-wizard .tinvwl-nav{margin:30px 0 0}.tinvwl-wizard .tinvwl-desc+.tinvwl-nav{margin:55px 0 0}.tinvwl-wizard .tinvwl-nav .tinvwl-btn{min-width:147px}.tinvwl-wizard .tinvwl-nav .tinvwl-next{float:right}.tinvwl-wizard .tinvwl-nav .tinvwl-skip+.tinvwl-btn{margin-left:26px}.tinvwl-wizard .tinwl-finish,.tinvwl-wizard .tinwl-intro{text-align:center}.tinvwl-wizard .tinwl-finish .tinvwl-title,.tinvwl-wizard .tinwl-intro .tinvwl-title{font-size:48px;margin-bottom:14px}.tinvwl-wizard .tinwl-finish .tinvwl-title{margin-bottom:33px}.tinvwl-wizard .tinwl-finish .tinvwl-sub-title,.tinvwl-wizard .tinwl-intro .tinvwl-sub-title{font-size:18px;font-weight:600;text-transform:uppercase;line-height:1.167;letter-spacing:-.025em;margin-bottom:0;color:#b2b2b2}.tinvwl-wizard .tinwl-intro .tinvwl-thumb{margin-bottom:16px}.tinvwl-wizard .tinwl-intro .tinvwl-desc{margin-bottom:21px}.tinvwl-wizard .tinwl-finish .tinvwl-desc{margin-bottom:45px}.tinvwl-wizard .tinwl-intro .tinvwl-skip{margin-top:19px}.tinvwl-wizard .tinwl-finish .tinvwl-more{display:inline-block;text-decoration:underline;margin-top:35px;color:#4b4b4b}.tinvwl-wizard .tinwl-finish .tinvwl-btn{margin-right:14px;padding:16px 26px}.tinvwl-wizard .tinwl-finish .tinvwl-btn:last-child{margin-right:0}.tinvwl-error .form-control{border:2px solid red}.tinvwl-error .tinvwl-error-icon{position:absolute;top:8px;left:-10px;color:red}.tinvwl-error .tinvwl-error-desc{line-height:1.42857143;margin:10px 8px 0;color:red}.tinvwl-wizard .tinvwl-return-to-dash{margin-top:45px;text-align:center}@media screen and (max-width:1024px){.tinvwl-wizard{margin:20px auto}.tinvwl-wizard .tinwl-finish .tinvwl-btn{display:block;margin:0 auto}.tinvwl-wizard .tinwl-finish .tinvwl-btn+.tinvwl-btn{margin-top:15px}}@media screen and (max-width:782px){html{margin:0}.tinvwl-wizard .tinvwl-content .tinwl-inner.tinwl-finish,.tinvwl-wizard .tinvwl-content .tinwl-inner.tinwl-intro{padding-left:50px;padding-right:50px}.tinvwl-wizard .tinvwl-nav{text-align:center}.tinvwl-wizard .tinvwl-nav .tinvwl-next{float:none;text-align:center}}
|
assets/css/admin.min.css
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
/*! WooCommerce Wishlist Plugin - version 1.8.
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
-
@font-face{font-family:tinvwl-webfont;src:url(../fonts/tinvwl-webfont.eot?xu2uyi);src:url(../fonts/tinvwl-webfont.eot?xu2uyi#iefix) format("embedded-opentype"),url(../fonts/tinvwl-webfont.ttf?xu2uyi) format("truetype"),url(../fonts/tinvwl-webfont.woff?xu2uyi) format("woff"),url(../fonts/tinvwl-webfont.svg?xu2uyi#tinvwl-webfont) format("svg");font-weight:400;font-style:normal}.ftinvwl{font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ftinvwl-twitter:before{content:"\f099"}.ftinvwl-facebook-f:before,.ftinvwl-facebook:before{content:"\f09a"}.ftinvwl-google:before{content:"\f0d5"}.ftinvwl-email:before{content:"\f0e0"}.ftinvwl-pinterest:before{content:"\f231"}.ftinvwl-star:before{content:"\e912"}.ftinvwl-shopping-cart:before{content:"\e913"}.ftinvwl-magic:before{content:"\e914"}.ftinvwl-info:before{content:"\e915"}.ftinvwl-graduation-cap:before{content:"\e918"}.ftinvwl-floppy-o:before{content:"\e919"}.ftinvwl-eyedropper:before{content:"\e91a"}.ftinvwl-exclamation-triangle:before{content:"\e91b"}.ftinvwl-check:before{content:"\e91e"}.ftinvwl-arrow-left:before{content:"\e91f"}.ftinvwl-wrench:before{content:"\e920"}.ftinvwl-chevron-down:before{content:"\e900"}.ftinvwl-chevron-right:before{content:"\e901"}.ftinvwl-chevron-left:before{content:"\e902"}.ftinvwl-chevron-up:before{content:"\e903"}.ftinvwl-cancel:before{content:"\e904"}.ftinvwl-times:before{content:"\e905"}.ftinvwl-heart-plus:before{content:"\e906"}.ftinvwl-heart-mark-right:before{content:"\e907"}.ftinvwl-heart2:before{content:"\e908"}.ftinvwl-heart-o:before{content:"\e909"}.ftinvwl-heart-mark-left:before{content:"\e90a"}.ftinvwl-heart-mail:before{content:"\e90b"}.ftinvwl-heart-tinv:before{content:"\e90c"}.ftinvwl-key:before{content:"\e90d"}.ftinvwl-lock:before{content:"\e90e"}.ftinvwl-hearts:before{content:"\e90f"}.ftinvwl-user:before{content:"\e910"}*,:after,:before{box-sizing:border-box}.container-fluid:after,.container-fluid:before,.container:after,.container:before,.form-group:after,.form-group:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.row:after,.row:before,.tablenav:after,.tablenav:before,.tinv-wishlist-clearfix:after,.tinv-wishlist-clearfix:before,.tinvwl-panel:after,.tinvwl-panel:before{display:table;content:" "}.container-fluid:after,.container:after,.form-group:after,.form-horizontal .form-group:after,.row:after,.tablenav:after,.tinv-wishlist-clearfix:after,.tinvwl-panel:after{clear:both}.tinvwl-content table,.tinvwl-header table{border-spacing:0;border-collapse:collapse;width:100%;max-width:100%}.tinvwl-content td,.tinvwl-content th,.tinvwl-header td,.tinvwl-header th{padding:0}.tinvwl-content img,.tinvwl-header img{height:auto;max-width:100%}#wpwrap{background:#f6f3ed}#wpcontent{padding-left:0}#wpbody-content{padding-bottom:135px}#update-nag,.notice,.update-nag,div.error,div.updated{margin:20px 0 0 40px}.notice,div.error,div.updated{margin-right:40px}body .tinvwl-content,body .tinvwl-header{font-family:Arial,sans-serif;font-size:14px;line-height:1.429;color:#6b625a}button,input,select,textarea{font-family:inherit;font-size:inherit;font-weight:inherit}.tinv-label,label{display:block;font-size:15px;font-family:"Open Sans","Helvetica Neue",sans-serif;color:#291C09;font-weight:600;margin-bottom:7px}.wrap h1,h1,h2,h3,h4,h5,h6{color:#291c09;font-family:'Open Sans',Arial,sans-serif;font-weight:400;line-height:1.313;padding:0;margin:0;border:0}.wrap h1,h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}h5{font-size:14px}h6{font-size:12px}@media screen and (max-width:1200px){#update-nag,.notice,.update-nag,div.error,div.updated{margin-top:20px;margin-left:20px;margin-right:20px}}@media screen and (max-width:782px){.auto-fold #wpcontent{padding-left:0}#update-nag,.notice,.update-nag,div.error,div.updated{margin:20px 0 0}.notice,div.error,div.updated{margin-right:0}}#toplevel_page_tinvwl ul ul{display:none;margin-left:15px;position:absolute}#toplevel_page_tinvwl ul li.current ul,#toplevel_page_tinvwl ul li:hover ul{display:block;left:145px;margin-left:15px;position:absolute;top:0}.status-panel>div{display:inline-block;margin-left:21px}.status-panel .button-link{background-color:#FF5739;color:#FFF;text-decoration:none;text-transform:uppercase;line-height:10px;font-weight:600;height:48px;display:table-cell;border-radius:5px;padding:0 17px;vertical-align:middle}.status-panel .button-link span::before{color:#ffdc00;display:inline-block;font:400 12px/1 dashicons;vertical-align:bottom;-webkit-font-smoothing:antialiased;content:"\f155"}.status-panel .button-round{border:2px solid #f1f1f1;border-radius:50%;width:43px;padding-top:5px;padding-left:2px;height:40px;display:table-cell;text-align:center;vertical-align:middle}.status-panel .status-tutorial span::before{color:#515151;display:inline-block;font:400 24px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;content:"\f118"}.tinvwl-status-message{font-family:Arial,sans-serif;font-size:14px;line-height:1.429;margin-top:40px;color:#6b625a;border-top:2px solid #f6f3ed}.tinvwl-status-message .tinvwl-title{padding:13px 20px;float:left;width:142px;font-weight:700}.tinvwl-status-message.type-error .tinvwl-title,.tinvwl-status-message.type-tip .tinvwl-title{color:#fff}.tinvwl-status-message.type-error .tinvwl-title{background:#ff3814}.tinvwl-status-message.type-tip .tinvwl-title{background:#30aec4}.tinvwl-status-message.type-attention .tinvwl-title{color:#23282d;background:#ffe900}.tinvwl-status-message .tinvwl-title i{margin-right:10px}.tinvwl-status-message.type-error>.tinvwl-title>i:before{content:"\f00d"}.tinvwl-status-message.type-tip>.tinvwl-title>i:before{content:"\f05a"}.tinvwl-status-message.type-attention>.tinvwl-title>i:before{content:"\f071"}.tinvwl-status-message .tinvwl-message{padding:13px 20px;overflow:hidden;height:100%;background:#faf9f7}@media screen and (max-width:782px){.tinvwl-status-message{margin-top:20px}}.tinvwl-content a{text-decoration:none;color:#30aec4}.tinvwl-content a:active,.tinvwl-content a:focus,.tinvwl-content a:hover{color:#524737}.tinvwl-content input[type=checkbox],.tinvwl-content input[type=color],.tinvwl-content input[type=date],.tinvwl-content input[type=datetime-local],.tinvwl-content input[type=datetime],.tinvwl-content input[type=email],.tinvwl-content input[type=month],.tinvwl-content input[type=number],.tinvwl-content input[type=password],.tinvwl-content input[type=radio],.tinvwl-content input[type=search],.tinvwl-content input[type=tel],.tinvwl-content input[type=text],.tinvwl-content input[type=time],.tinvwl-content input[type=url],.tinvwl-content input[type=week],.tinvwl-content select,.tinvwl-content textarea{line-height:1.429;margin:0;color:#4f4639;border:1px solid rgba(0,0,0,.14);box-shadow:inset 1px 1px 6px 0 rgba(170,157,137,.14);padding:9px 13px}.tinvwl-content textarea{height:70px}.tinvwl-content input[type=color],.tinvwl-content input[type=date],.tinvwl-content input[type=datetime-local],.tinvwl-content input[type=datetime],.tinvwl-content input[type=email],.tinvwl-content input[type=month],.tinvwl-content input[type=number],.tinvwl-content input[type=password],.tinvwl-content input[type=search],.tinvwl-content input[type=tel],.tinvwl-content input[type=text],.tinvwl-content input[type=time],.tinvwl-content input[type=url],.tinvwl-content input[type=week],.tinvwl-content select{height:42px;border-radius:4px}.tinvwl-content .tablenav input[type=search]{height:35px;width:210px;padding:9px 13px;box-shadow:none;border:none;background:#f4f3ef}.tinvwl-content .tablenav input[type=search]+button[type=submit],.tinvwl-content .tablenav input[type=search]+input[type=submit]{vertical-align:middle}.tinvwl-content .tablenav .tinvwl-select-wrap+input[type=submit],.tinvwl-content .tablenav input[type=search]+button[type=submit],.tinvwl-content .tablenav input[type=search]+input[type=submit]{float:right;margin-left:8px!important}.tinvwl-content input[type=color]:disabled,.tinvwl-content input[type=date]:disabled,.tinvwl-content input[type=datetime-local]:disabled,.tinvwl-content input[type=datetime]:disabled,.tinvwl-content input[type=email]:disabled,.tinvwl-content input[type=month]:disabled,.tinvwl-content input[type=number]:disabled,.tinvwl-content input[type=password]:disabled,.tinvwl-content input[type=search]:disabled,.tinvwl-content input[type=tel]:disabled,.tinvwl-content input[type=text]:disabled,.tinvwl-content input[type=time]:disabled,.tinvwl-content input[type=url]:disabled,.tinvwl-content input[type=week]:disabled{font-size:15px;font-family:"Open Sans","Helvetica Neue",sans-serif;font-weight:600;color:#291C09;background-color:#f6f3ed;border-color:#f6f3ed}.tinvwl-content select{font-family:Arial,sans-serif;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;padding:9px 40px 9px 13px;background-color:#fff;background-image:url(../img/select_caret.png);background-repeat:no-repeat;background-position:96% center;background-position:calc(100% - 15px) center}.tinvwl-content select:disabled{font-size:15px;font-family:"Open Sans","Helvetica Neue",sans-serif;font-weight:600;color:#291C09;background-color:#f6f3ed;border-color:#f6f3ed}.tinvwl-content select[multiple=multiple]{padding:9px 13px;background:#fff}.tinvwl-content .tinvwl-select.grey{font-size:14px;font-family:Arial,"Helvetica Neue",Helvetica,sans-serif;padding:8px 11px;height:35px;border:none;color:#5D5D5D;background:#f4f3ef}@media screen and (max-width:782px){input,textarea{font-size:14px}#wpbody .tinvwl-content select{height:42px;font-size:14px}}.tinvwl-select-wrap{position:relative;display:inline-block;vertical-align:middle;cursor:pointer}.tinvwl-content select.tinvwl-select.grey{padding-right:47px;margin:0;border-radius:4px}.tinvwl-select+.tinvwl-caret{pointer-events:none;display:inline-block;position:absolute;top:0;right:0;width:36px;height:36px;line-height:36px;text-align:center;border-radius:0 4px 4px 0}.tinvwl-btn,button,input[type=submit]{vertical-align:middle;font-family:'Open Sans',Arial,sans-serif;font-size:14px;line-height:normal;text-decoration:none;cursor:pointer}.tinvwl-select+.tinvwl-caret span{display:inline-block;width:13px;height:8px;background:url(../img/chevron_down.png) center no-repeat;background-position:0 -10px}.tinvwl-select:hover+.tinvwl-caret{background:#3e3e3e}.tinvwl-select:hover+.tinvwl-caret span{background-position:0 0}.tinvwl-content .tinvwl-nav{margin:0 40px}.tinvwl-content .tinvwl-panel+.tinvwl-nav{margin-top:40px}.tinvwl-nav .tinvwl-prev,.tinvwl-nav .tinvwl-prev .tinvwl-btn{float:left}.tinvwl-nav .tinvwl-next{float:right;text-align:right}.tinvwl-nav .tinvwl-btn+.tinvwl-btn{margin-left:20px}.tinvwl-panel.only-button.w-bg{background:0 0;overflow:visible}.tinvwl-panel.only-button.w-shadow{box-shadow:none;overflow:visible}.tinvwl-panel.only-button .control-label,.tinvwl-panel.only-button tfoot,.tinvwl-panel.only-button thead{display:none}.tinvwl-panel.only-button .form-group{margin-bottom:0}.tinvwl-panel.only-button .form-control{display:inline-block;width:auto}.tinvwl-panel.only-button .tinvwl-table>tbody>tr>td{padding:0}.tinvwl-panel.only-button #save_buttons--setting_save{display:inline-block}.tinvwl-panel.only-button #save_buttons--setting_reset{display:inline-block;float:right}.tinvwl-panel.only-button #save_buttons--setting_reset .form-control{background-color:#fff;color:#3e3e3e}.tinvwl-panel.only-button #save_buttons--setting_reset .tinvwl-btn.split span{background:#fbfaf9}.tinvwl-panel.only-button #save_buttons--setting_reset .form-control:hover{color:#fff;background-color:#515151}.tinvwl-panel.only-button #save_buttons--setting_reset .tinvwl-btn.split:hover span{background:#434343}.tinvwl-btn,a.tinvwl-btn{padding:11px 19px 12px 18px;text-transform:uppercase;color:#fff;background-color:#96b100;font-weight:800;letter-spacing:-.025em;text-align:center}#doaction,#doaction2,#post-query-submit{margin:0}button,input[type=submit]{display:inline-block;margin:0}.tinvwl-btn{display:inline-block;margin:0;border:none;border-radius:2px}#wpfooter a,.tinvwl-info .tinvwl-info-desc a,.tinvwl-premium-feat .tinvwl-features li span{text-decoration:underline}a.tinvwl-btn{border:none;border-radius:2px}.tinvwl-btn.white.small,.tinvwl-btn.white.smaller{font-size:14px;border:1px solid rgba(0,0,0,.14);box-shadow:1px 2px 4px 0 rgba(0,0,0,.1)}.tinvwl-btn.large{padding:14px 19px 14px 18px}.tinvwl-btn.small{padding:6px 11px 7px}.tinvwl-btn.smaller{padding:11px 18px 12px}.tinvwl-btn.black,.tinvwl-btn.dark-green,.tinvwl-btn.green,.tinvwl-btn.red{font-weight:800}.tinvwl-btn.grey{margin:0;padding:8px 12px;font-weight:700;color:#3e3e3e;background:#F4F3EF}.tinvwl-btn.grey.large{font-weight:800;padding:14px 19px 14px 18px}.tinvwl-btn.grey.w-icon{letter-spacing:-.025em}.tinvwl-btn.red{color:#fff;background-color:#ff5739}.tinvwl-btn.orange{color:#fff;background-color:#FF9F07}.tinvwl-btn.white.smaller{font-weight:700;letter-spacing:-.05em;padding:10px 15px 11px}.tinvwl-btn.white.small{font-family:Arial,sans-serif;text-transform:none;font-weight:400;padding:9px 18px;color:#4f4639}.tinvwl-content .widefat th,.tinvwl-content th.sortable>a,.tinvwl-content th.sorted>a,.tinvwl-sign-icon,.tinwl-wishlists-privacy li a{font-family:"Open Sans","Helvetica Neue",sans-serif}.tinvwl-btn.small.white:active,.tinvwl-btn.small.white:focus,.tinvwl-btn.small.white:hover{color:#fff}.tinvwl-btn.white{color:#291c09;background:#fff}.tinvwl-btn.white.no-txt{padding:12px 16px}.tinvwl-btn.white.small.no-txt{padding:9px 12px}.tinvwl-btn.white i{color:#6b625a;margin-right:11px}.tinvwl-btn.w-icon{font-weight:800}.tinvwl-btn.w-icon i{margin-right:16px}.tinvwl-btn.round.w-icon i{margin-right:15px;font-size:16px}.tinvwl-btn.w-icon i.ftinvwl-graduation-cap{vertical-align:text-bottom}.tinvwl-btn.red.w-icon i{margin-right:13px}.tinvwl-btn.round.xl-icon i,.tinvwl-btn.xl-icon i{font-size:17px;margin-right:15px}.tinvwl-btn.lg-icon i{font-size:15px}.tinvwl-btn.md-icon i,.tinvwl-btn.round.md-icon i{font-size:14px}.tinvwl-btn.sm-icon i{font-size:13px}.tinvwl-btn.xs-icon i{font-size:11px;vertical-align:1%}.tinvwl-header .tinvwl-status-panel>a,.tinvwl-table.w-info .tinvwl-info[rowspan],.tinvwl-table.w-info .tinvwl-info[rowspan] .tinvwl-info-sign{vertical-align:middle}.tinvwl-btn.white.no-txt i{margin-right:0}.tinvwl-btn.white:active i,.tinvwl-btn.white:focus i,.tinvwl-btn.white:hover i{color:#fff}.tinvwl-btn.green{color:#fff;background-color:#a9c203}.tinvwl-btn.black{color:#fff;background-color:#515151}.tinvwl-btn.smaller-txt{font-size:12px;padding:15px 20px}.tinvwl-btn.medium{letter-spacing:0}.tinvwl-btn.medium.smaller-txt{padding:9px 16px}.tinvwl-btn.round{border-radius:25px;padding:15px 28px 16px}.tinvwl-btn.round.red{padding:16px 30px}.tinvwl-btn.split{padding:0 26px 0 0}.tinvwl-btn.split span{display:inline-block;text-align:center;width:46px;padding:14px 0;margin-right:14px;border-radius:4px 0 0 4px;background:#8aa300}.tinvwl-btn.split:active span,.tinvwl-btn.split:focus span,.tinvwl-btn.split:hover span{background:#434343}.tinvwl-btn.split.green span{background:#b9cf09}.tinvwl-btn.split.black span{background:#434343}.tinvwl-btn.split span i{font-size:17px}.tinvwl-btn:not(:disabled):active,.tinvwl-btn:not(:disabled):focus,.tinvwl-btn:not(:disabled):hover,a.tinvwl-btn:not(:disabled):active,a.tinvwl-btn:not(:disabled):focus,a.tinvwl-btn:not(:disabled):hover{color:#fff;background-color:#515151}.tinvwl-header{padding:21px 40px;margin-bottom:40px;background:#fff}.tinvwl-header .icon.border-grey{position:relative;display:inline-block;width:45px;height:45px;line-height:45px;text-align:center;background:#fff;border:2px solid #f1f1f1;border-radius:50%;color:#3e3e3e}.tinvwl-header .icon.border-grey:hover{border-color:#515151}.tinvwl-header .icon.w-lines{position:relative;padding:0 30px}.tinvwl-header .icon.w-lines:after,.tinvwl-header .icon.w-lines:before{content:'';position:absolute;top:50%;top:calc(50% - 1px);width:17px;height:1px;background:rgba(0,0,0,.12)}.tinvwl-header .icon.w-lines:before{left:0}.tinvwl-header .icon.w-lines:after{right:0}.tinvwl-header .icon .badge{position:absolute;top:-5px;right:-10px;display:inline-block;min-width:26px;height:26px;font-size:11px;line-height:19px;font-weight:700;background:#ff5739;border:3px solid #fff;color:#fff;border-radius:50%}.tinwl-logo i.logo_heart{min-width:54px}.tinwl-logo h2{font-size:18px;font-weight:700;text-transform:uppercase;line-height:1;padding-left:10px}.tinvwl-header .tinvwl-title{padding-left:28px;margin-left:28px;border-left:1px solid #dcddde}.tinvwl-header h1{color:#3e3e3e;padding:0}.tinvwl-header .tinvwl-status-panel{margin-top:-12px;text-align:right}.tinvwl-header .tinvwl-status-panel>a+a{margin-left:15px}.tinvwl-header .tinvwl-btn{margin-top:15px;margin-top:18px}.tinvwl-header .tinvwl-btn.red i{color:#ffdc00}.tinvwl-sign-icon{font-size:30px;color:#948d84}@media (max-width:1199px){.tinvwl-header{text-align:center}.tinvwl-header .tinvwl-cell,.tinvwl-header .tinvwl-cell-3,.tinvwl-header .tinvwl-table{display:block}.tinvwl-header h1+.tinvwl-status-panel{margin-top:25px}.tinvwl-header .tinvwl-status-panel{text-align:center;margin-top:15px}.tinvwl-header .tinvwl-status-panel>a+a{margin-left:9px}.tinvwl-header .tinvwl-title,.tinwl-logo,.tinwl-logo h2,.tinwl-logo img{display:block;margin:0 auto}.tinwl-logo h2{padding-left:0;margin-left:0;margin-top:6px}.tinvwl-header .tinvwl-title{position:relative;padding-left:12px;padding-right:12px;padding-top:13px;margin-left:0;margin-top:16px;border-left:0}.tinvwl-header .tinvwl-title:before{content:'';position:absolute;top:0;left:0;right:0;width:40px;height:1px;margin:0 auto;background:#dcddde}}@media (max-width:782px){.tinvwl-header .tinvwl-btn .tinvwl-txt{display:none}.tinvwl-header .tinvwl-btn i{margin-right:0!important}.tinvwl-header .tinvwl-btn.grey{padding-left:16px;padding-right:16px}}.tinwl-wishlists-privacy{margin:-10px 0 0}.tinwl-wishlists-privacy li{float:left;margin:10px 10px 0 0}.tinwl-wishlists-privacy li:last-child{margin-right:0}.tinwl-wishlists-privacy li a{display:block;font-size:14px;font-weight:600;line-height:1;padding:10px 16px;border-radius:3px;color:#404040;background:#ede8df}.tinwl-wishlists-privacy li a:active,.tinwl-wishlists-privacy li a:focus,.tinwl-wishlists-privacy li a:hover,.tinwl-wishlists-privacy li.active a{color:#fff;background-color:#96b100}@media screen and (max-width:782px){.tinwl-wishlists-privacy{margin-left:15px}}.tinvwl-panel{margin:40px 40px 0}.tinvwl-panel .w-bg-grey{background:#fbfaf9}.tinvwl-panel.w-shadow{box-shadow:1px 1px 8px 0 rgba(170,157,137,.14)}.tinvwl-panel.w-bg{background:#fff;border-radius:4px}.tinvwl-table.w-info .tinvwl-info-top>tr .tinvwl-info{vertical-align:top}@media screen and (max-width:1200px){.tinvwl-panel{margin:20px 20px 0}.tinvwl-header{margin-bottom:20px}}@media screen and (max-width:782px){.tinvwl-panel{margin:20px 0 0}.tinvwl-panel.only-button{text-align:center}}.tinvwl-icon-preview{position:relative;width:50px;height:42px;margin-right:10px;margin-bottom:10px;text-align:center;border-radius:2px;color:#595857;background:#f6f3ed}.tinvwl-icon-preview span{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tinvwl-icon-preview span img{max-width:50px;max-height:42px;vertical-align:middle}@media (min-width:1200px){.tinvwl-icon-preview{margin-bottom:0}}.tinvwl-content table.widefat{box-shadow:none;border:none;border-bottom:2px solid #f7f7f7}.tinvwl-content .tablenav{height:auto;margin:30px;background:#fff}.tinvwl-content .tablenav .actions{padding:0}.tinvwl-content .widefat td,.tinvwl-content .widefat th{text-align:center}.tinvwl-content .widefat th{padding:27px 0;position:relative}@media screen and (max-width:782px){.tablenav.top .actions{display:block}.tablenav br.tinv-wishlist-clear,.tinvwl-content .tablenav .tinvwl-full{display:none}.tinvwl-content .tablenav{margin:15px 12px}.tinvwl-content .tablenav .alignleft,.tinvwl-content .tablenav .alignright{float:none}.tinvwl-content .tablenav .alignleft+.alignright{margin-top:10px}.tinvwl-content .tablenav .tinvwl-select-wrap{width:calc(100% - 75px)}#wpbody .tinvwl-content .tablenav .tinvwl-select-wrap select.tinvwl-select{max-width:100%;width:100%;height:35px;padding:9px 13px}.tinvwl-content .tablenav input[type=search]{width:calc(100% - 84px)}}.tinvwl-content .widefat th.sortable,.tinvwl-content .widefat th.sorted{padding:0}.tinvwl-content .widefat th.sortable>a,.tinvwl-content .widefat th.sorted>a{padding:28px 17px;position:relative}.tinvwl-content .widefat th.tinvwl-has-info{padding-top:28px}.tinvwl-content .widefat th.tinvwl-has-info.sortable>a,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a{padding-top:0}.tinvwl-content .widefat th.sortable:first-of-type,.tinvwl-content .widefat th.sorted:first-of-type{padding-left:0}.tinvwl-content .widefat th.sortable:first-of-type>a,.tinvwl-content .widefat th.sorted:first-of-type>a{padding-left:28px}.tinvwl-content .widefat td:first-of-type,.tinvwl-content .widefat th:first-of-type{text-align:left;padding-left:28px}.tinvwl-content .widefat th .tinvwl-help-wrap{display:inline-block;margin-left:6px}.tinvwl-content .widefat th.sortable>a+.tinvwl-help-wrap,.tinvwl-content .widefat th.sorted>a+.tinvwl-help-wrap{margin-left:0}.tinvwl-content .widefat thead tr{background:#f4f3ef}.tinvwl-content .striped>tbody>:nth-child(odd),.tinvwl-content ul.striped>:nth-child(odd){background:0 0}.tinvwl-content .widefat tbody th.check-column,.tinvwl-content .widefat thead td.check-column{width:50px;vertical-align:middle}.tinvwl-content .widefat thead td.check-column{padding:28px 0 28px 28px}.tinvwl-content .widefat tbody th.check-column{padding:13px 0 13px 28px}.tinvwl-content .widefat tbody th.check-column+td,.tinvwl-content .widefat thead td.check-column+th,.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>.tinvwl-info-wrap.tinvwl-in-table,.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>a,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>.tinvwl-info-wrap.tinvwl-in-table,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>a{padding-left:21px}.tinvwl-content .widefat tbody th.pause-play-column,.tinvwl-content .widefat thead td.pause-play-column{padding:0;width:53px;text-align:center}.tinvwl-content th.sortable a,.tinvwl-content th.sorted a{padding:0}.tinvwl-content .widefat th,.tinvwl-content th.sortable>a,.tinvwl-content th.sorted>a{font-size:14px;font-weight:600;color:#291C09;text-transform:uppercase;letter-spacing:-.025em}.tinvwl-content th.sortable>a,.tinvwl-content th.sorted>a{display:inline-block;vertical-align:middle}.tinvwl-content .widefat th.sortable>a .sorting-indicator,.tinvwl-content .widefat th.sorted>a .sorting-indicator{position:absolute;top:50%;right:0;margin-top:-2px}.tinvwl-content .widefat th.tinvwl-has-info.sortable>a .sorting-indicator,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a .sorting-indicator{margin-top:-15px}.tinvwl-content th.sortable a span,.tinvwl-content th.sorted a span{float:none}.tinvwl-content .widefat thead td,.tinvwl-content .widefat thead th{border-bottom:0}.tinvwl-content .widefat td{padding:24px 0;vertical-align:middle}.tinvwl-content .widefat tbody td{padding:13px 0}.tinvwl-content .widefat td,.tinvwl-content .widefat td ol,.tinvwl-content .widefat td p,.tinvwl-content .widefat td ul{font-size:14px}.tinvwl-content .widefat tbody tr+tr{border-top:2px solid #f7f7f7}.tinvwl-content .widefat thead th.column-preference{text-indent:-9999px}.tinvwl-content .widefat.wishlists tbody td.column-preference,.tinvwl-content .widefat.wishlists thead th.column-preference{min-width:220px;width:220px}.tinvwl-content .widefat:not(.products) tbody td.column-preference{text-align:right}.tinvwl-content .widefat.products thead th.column-quantity a>span:not(.sorting-indicator){max-width:91px}.tinvwl-content .widefat.users tbody .column-name>a{display:block}.tinvwl-content .widefat.products tbody td.column-preference,.tinvwl-content .widefat.products thead th.column-preference{width:345px;min-width:345px}.tinvwl-content .widefat.users tbody td.column-preference,.tinvwl-content .widefat.users thead th.column-preference{width:165px;min-width:165px}.tinvwl-content .widefat tbody .column-name strong{font-weight:400}.tinvwl-content .widefat tbody .column-name>a{display:table}.tinvwl-content .widefat tbody .column-name .product-image{display:table-cell;vertical-align:middle}.tinvwl-content .widefat tbody .column-name .product-image img{max-width:66px}.tinvwl-content .widefat tbody .column-name .product-title{display:table-cell;vertical-align:middle;padding-left:15px}.tinvwl-content .widefat tbody td.column-preference,.tinvwl-content .widefat thead th.column-preference{padding-right:20px}.tinvwl-content .widefat.products tbody td.column-preference>a{margin-right:10px;float:left}.tinvwl-cell-2,.tinvwl-cell-3,.tinvwl-content .widefat.products thead th.column-quantity span span{float:none}.tinvwl-content .widefat.products tbody td.column-preference>a:last-child{margin-right:0}.tinvwl-content .tablenav .tablenav-pages{float:none;text-align:center;height:auto;margin-top:0}.tinvwl-content .tablenav .tablenav-pages .pagination-links>a,.tinvwl-content .tablenav .tablenav-pages .pagination-links>span{text-align:center;font-size:14px;padding:0;min-width:38px;height:38px;line-height:38px;color:#3e3e3e;display:inline-block;vertical-align:middle;font-weight:400}.tinvwl-content .tablenav .tablenav-pages .pagination-links>a{border-radius:50%;border:none;background:0 0}.tinvwl-content .tablenav .tablenav-pages .pagination-links>span{border-radius:50%;border:none;color:rgba(62,62,62,.46);background:#f3f1ec}.tinvwl-content .widefat.users tbody td.column-name,.tinvwl-content .widefat.users thead th.column-name,.tinvwl-table.w-info thead>tr>th{text-align:left}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page{background:#f3f1ec}.tinvwl-content .tablenav .tablenav-pages .pagination-links>.tinvwl-page-number.space{background:0 0;color:#3e3e3e}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover,.tinvwl-content .tablenav .tablenav-pages .pagination-links>a:hover{background:#3e3e3e;color:#fff}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page{margin-right:20px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page{margin-left:20px}.tinvwl-content .tablenav .tablenav-pages .tinvwl-chevron{display:inline-block;vertical-align:middle;width:9px;height:16px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page .tinvwl-chevron{background:url(../img/chevron_icon.png) center no-repeat;background-position:0 -16px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover .tinvwl-chevron{background:url(../img/chevron_icon.png) center no-repeat;background-position:0 0}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page .tinvwl-chevron{background:url(../img/chevron_icon.png) center no-repeat;background-position:-10px -16px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover .tinvwl-chevron{background:url(../img/chevron_icon.png) center no-repeat;background-position:-10px 0}.tinvwl-content .widefat.products tbody td.column-name,.tinvwl-content .widefat.products thead th.column-name{width:30%}.tinvwl-content .widefat.users tbody td.column-wishlist,.tinvwl-content .widefat.users thead th.column-wishlist,.tinvwl-content .widefat.wishlists tbody td.column-title,.tinvwl-content .widefat.wishlists thead th.column-title{width:45%}.tinvwl-content .widefat.users tbody td.column-quantity,.tinvwl-content .widefat.users thead th.column-quantity{width:100px}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn .tinvwl-mobile{display:none}@media screen and (max-width:1440px){.tinvwl-content .widefat.products tbody td.column-preference,.tinvwl-content .widefat.products thead th.column-preference{width:204px;min-width:204px}.tinvwl-content .widefat.wishlists tbody td.column-preference,.tinvwl-content .widefat.wishlists thead th.column-preference{width:98px;min-width:98px}.tinvwl-content .widefat.users tbody td.column-preference,.tinvwl-content .widefat.users thead th.column-preference{width:60px;min-width:60px}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn.tinvwl-w-mobile{padding:9px 12px}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn .tinvwl-mobile{display:inline;margin:0}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn .tinvwl-full{display:none}}@media screen and (max-width:1366px) and (min-width:783px){.tinvwl-content .widefat tbody .column-name .product-image{display:block}.tinvwl-content .widefat tbody .column-name .product-title{display:block;padding-left:0}.tinvwl-content .widefat.products tbody td.column-preference,.tinvwl-content .widefat.products thead th.column-preference{width:103px;min-width:103px}.tinvwl-content .widefat.products tbody td.column-preference>a{margin-right:5px}.tinvwl-content .widefat tbody td.column-preference>a:nth-child(2n){margin-right:0}.tinvwl-content .widefat tbody td.column-preference>a:nth-child(n+3){margin-top:5px}.tinvwl-content .widefat thead th .tinvwl-full{display:none}}@media screen and (max-width:1200px) and (min-width:783px){.tinvwl-content th.sortable a span,.tinvwl-content th.sorted a span{float:none}.tinvwl-content .widefat th.sortable>a,.tinvwl-content .widefat th.sorted>a{padding-left:0;padding-right:0;position:static}.tinvwl-content .widefat th.sortable>a .sorting-indicator,.tinvwl-content .widefat th.sorted>a .sorting-indicator{top:auto;bottom:12px;left:0;right:0;margin-left:auto;margin-right:auto}.tinvwl-content .widefat th.sortable>a .sorting-indicator:before,.tinvwl-content .widefat th.sorted>a .sorting-indicator:before{left:-5px}.tinvwl-content .widefat th.tinvwl-has-info.sortable>a .sorting-indicator,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a .sorting-indicator{margin-top:12px}.tinvwl-content .widefat.wishlists tbody td.column-title,.tinvwl-content .widefat.wishlists thead th.column-title{width:38%}}@media screen and (max-width:782px){.tinvwl-content .widefat th.tinvwl-has-info.sortable>a .sorting-indicator,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a .sorting-indicator{margin-top:0}.tinvwl-content .widefat.products tbody td.column-preference>a{margin-right:5px;float:none}.tinvwl-content .widefat tbody .column-name .product-image,.tinvwl-content .widefat tbody .column-name .product-title{vertical-align:top}.tablenav .tablenav-pages{margin-bottom:15px}.tinvwl-content .widefat thead th.column-primary{width:100%!important}.tinvwl-content .widefat thead td.check-column+th.column-primary{width:50%!important}.tinvwl-content .widefat.users thead td.check-column+th.column-primary{width:100%!important}}.tinvwl-cell,.tinvwl-cell-2{vertical-align:middle;display:table-cell}.tinvwl-table{display:table;width:100%;max-width:100%}.tinvwl-table.w-bg{background:#fff;overflow:hidden;border-radius:4px}.tinvwl-table.w-shadow{box-shadow:1px 1px 8px 0 rgba(170,157,137,.14)}.tinvwl-table.auto-width{width:auto}.tinvwl-caption{display:table-caption}.tinvwl-row{display:table-row}.tinvwl-rows{display:table-row-group}.tinvwl-cell-3,.tinvwl-color-picker .tinvwl-eyedropper,.tinvwl-table .tinvwl-info,.tinvwl-table td,.tinvwl-table th{vertical-align:top}.tinvwl-cell-3{display:table-cell}.tinvwl-bodies-border .tinvwl-info .tinvwl-inner,.tinvwl-table tbody>.tinvwl-bodies-border,.tinvwl-table thead .tinvwl-empty-info{display:none}.tinvwl-table.w-info>tbody>tr>td:first-child,.tinvwl-table.w-info>thead>tr>th:first-child{width:67%}.tinvwl-table .tinvwl-inner .tinv-wishlist-clearfix h3,.tinvwl-table .tinvwl-inner .tinv-wishlist-clearfix h4,.tinvwl-table .tinvwl-inner.tinv-wishlist-clearfix h3,.tinvwl-table .tinvwl-inner.tinv-wishlist-clearfix h4{float:left}.tinvwl-table .tinvwl-btn-wrap{float:right}.tinvwl-table.w-info thead>tr>th .tinvwl-info-wrap{font-weight:400}.tinvwl-table>thead>tr>th{padding:0 30px}.tinvwl-table>thead>tr>.tinvwl-info .tinvwl-info-wrap{padding-bottom:30px}.tinvwl-table tbody tr .tinvwl-inner h2{font-size:15px;color:#291C09;font-weight:600;margin-bottom:21px}.tinvwl-table>tbody>tr>.tinvwl-info .tinvwl-info-wrap{padding-bottom:20px}.tinvwl-table>tbody>tr>td{padding:0 30px}.tinvwl-table thead>tr .tinvwl-inner{padding:28px 0;margin-bottom:30px;border-bottom:2px solid rgba(219,219,219,.522)}.tinvwl-table thead.tinwl-empty>tr .tinvwl-inner{padding:30px 0 0;margin-bottom:0;border-bottom:0}.tinvwl-table .tinvwl-header-row label{font-size:22px;font-weight:400;line-height:1.313;margin:0 0 15px;padding-top:3px!important}.tinvwl-table thead .tinvwl-empty-info .tinvwl-inner{margin:0;padding-top:56px}.tinvwl-bodies-border .tinvwl-info .tinvwl-inner,.tinvwl-table tbody+tbody>.tinvwl-bodies-border:first-child>td:first-child>.tinvwl-inner{padding-top:30px;margin-top:10px;border-top:2px solid rgba(219,219,219,.522)}.tinvwl-style-options .tinvwl-bodies-border .tinvwl-info,.tinvwl-style-options .tinvwl-table thead .tinvwl-empty-info{padding-left:0;background:0 0}.tinvwl-style-options .tinvwl-table thead .tinvwl-empty-info{display:table-cell}.tinvwl-style-options .tinvwl-table thead .tinvwl-empty-info .tinvwl-inner,.tinvwl-style-options tbody+tbody>.tinvwl-bodies-border .tinvwl-info .tinvwl-inner{display:block}textarea[name=style_plain-css]{height:150px}.tinvwl-table tbody+tbody>.tinvwl-bodies-border{display:table-row}.tinvwl-table .tinvwl-header-row.tinvwl-line-border .tinvwl-inner{padding-bottom:15px;margin-bottom:30px;border-bottom:2px solid rgba(219,219,219,.522)}.tinvwl-table .form-group .col-lg-4:nth-child(n+4),.tinvwl-table .form-group .col-md-4:nth-child(n+4){padding-top:27px}.tinvwl-table tfoot .tinvwl-inner{padding-top:20px}.tinvwl-table tr.no-top-border .tinvwl-info-wrap,.tinvwl-table tr.no-top-border .tinvwl-inner{border-top:0;padding-top:0}.popover>.arrow,.popover>.arrow:after{border-color:transparent;border-style:solid;position:absolute}.tinvwl-table thead .w-bg-grey .tinvwl-info-wrap{padding-top:30px}.tiwl-notifications-style-logo img{height:42px}@media (min-width:1200px){.tinvwl-style-options .tinvwl-table .tinvwl-inner .form-horizontal{width:67%}.tinvwl-table tr.tinvwl-full-width .control-label label{margin-bottom:10px}.tinvwl-table tr.tinvwl-full-width [class^=col-lg-],.tinvwl-table tr.tinvwl-full-width [class^=col-md-]{width:100%}.tinvwl-table tr.tinvwl-full-width textarea{height:250px;padding:15px}.tiwl-notifications-style-logo img{float:right}}@media (max-width:1199px){.form-horizontal .control-label .tinvwl-empty{display:none}.tinvwl-style-options .tinvwl-empty-info,.tinvwl-style-options .tinvwl-info{display:none!important}.tinvwl-style-options .tinvwl-bodies-border td:first-child,.tinvwl-style-options .tinvwl-table thead th:first-child{padding-right:30px!important}.tinvwl-table .tinvwl-header-row.tinvwl-line-border .tinvwl-inner{padding-bottom:0}.tinvwl-table .tinvwl-header-row.tinvwl-line-border .tinvwl-inner .form-group{margin-bottom:20px}}.tinvwl-btns-group,.tiwl-style-custom-allow .tinvwl-inner textarea{margin-bottom:23px}.tinvwl-info .tinvwl-info-desc a{color:#ff5739}.tinvwl-info .tinvwl-info-desc a:active,.tinvwl-info .tinvwl-info-desc a:focus,.tinvwl-info .tinvwl-info-desc a:hover{color:#000}.tinvwl-info-wrap.tinvwl-in-section{background:#fbfaf9;color:#4f4639}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign{width:42px;vertical-align:top;padding-top:1px;padding-right:20px}.tinvwl-info-wrap .tinvwl-info-sign .tinvwl-help,.tinvwl-info-wrap .tinvwl-info-sign span{display:inline-block;text-align:center;width:22px;height:22px;line-height:22px;border-radius:50%;background:#e1dbce}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign .tinvwl-help,.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign span{display:block}.tinvwl-info-wrap i{font-size:14px;color:#fbfaf9}.tinvwl-panel:not(.only-button) .tinvwl-table .col-lg-6>.tinvwl-btn{width:auto}.tinvwl-btns-group{margin-top:-15px;margin-right:-15px}.tinvwl-btns-group .tinvwl-btn{margin-top:15px;margin-right:15px;float:left}.tinvwl-table .tinvwl-info .tinvwl-info-wrap.tinvwl-in-section .tinvwl-help{display:none}.tinvwl-info-wrap.tinvwl-in-table{vertical-align:middle;display:block;margin-bottom:5px}.tinvwl-info-wrap.tinvwl-in-table .tinvwl-help{cursor:pointer}.tinvwl-content .widefat th.tinvwl-has-info .tinvwl-col-name{margin-right:5px}.tinvwl-info-wrap.tinvwl-in-table .tinvwl-info-desc{display:none}@media (max-width:1200px){.tinvwl-table .tinvwl-info{padding-left:15px;padding-right:15px}.tinvwl-table.w-info>tbody>tr>td:first-child,.tinvwl-table.w-info>thead>tr>th:first-child{width:90%}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign{width:auto;padding-right:0}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign span{display:none}.tinvwl-table .tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign .tinvwl-help{display:block;margin:0 auto}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-desc{display:none}}@media (max-width:782px){.tinvwl-content .widefat th.tinvwl-has-info.sortable,.tinvwl-content .widefat th.tinvwl-has-info.sorted{padding-top:0}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox]{margin-bottom:0}.tinvwl-content .widefat th.sortable.tinvwl-has-info>a,.tinvwl-content .widefat th.sortable>a,.tinvwl-content .widefat th.sorted.tinvwl-has-info>a,.tinvwl-content .widefat th.sorted>a{padding-top:18px;padding-bottom:18px}.tinvwl-content .widefat thead td.check-column{padding-top:14px;padding-bottom:15px;padding-left:20px;width:45px}.tinvwl-content .widefat tbody th.check-column{padding-left:20px;width:45px;padding-top:11px;padding-bottom:11px;vertical-align:top}.tinvwl-content .widefat.wishlists tbody th.check-column,.tinvwl-content .widefat.wishlists thead td.check-column{width:23px}.tinvwl-content .widefat tbody th.check-column+td,.tinvwl-content .widefat thead td.check-column+th,.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>a,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>a{padding-left:10px}.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>.tinvwl-info-wrap.tinvwl-in-table,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>.tinvwl-info-wrap.tinvwl-in-table{padding-left:13px;display:inline-block;margin-top:5px;margin-bottom:0}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{text-align:left;left:28px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){text-align:right;padding-right:30px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.check-column+td:not(.column-primary)::before{left:13px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column):last-child{padding-bottom:13px}}.popover{position:absolute;top:0;left:0;z-index:9999;display:none;max-width:279px;padding:1px;text-align:center;white-space:normal;background-color:#fff;background-clip:padding-box;border-radius:6px;box-shadow:0 5px 15px 0 rgba(0,0,0,.22)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:30px 30px 0;margin:0;font-family:'Open Sans',Arial,sans-serif;font-size:14px;font-weight:600;line-height:1.714;text-transform:uppercase;letter-spacing:-.35px}.tinvwl-premium-feat h2,.tinvwl-premium-feat h3{text-transform:uppercase;letter-spacing:-.025em}.popover-content{padding:25px 30px 30px;color:#5D5D5D;font-family:Arial,sans-serif;font-size:14px;line-height:1.429}.popover>.arrow{display:block;width:0;height:0;border-width:11px;margin-left:0;overflow:visible}.popover>.arrow:after{display:block;z-index:9999;background:0 0;box-shadow:none;left:auto;top:auto;width:auto;height:auto;-webkit-transform:none;-ms-transform:none;transform:none;content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;left:auto;right:-11px;margin-top:-11px;border-right-width:0}.popover.left>.arrow:after{left:auto;right:1px;border-right-width:0;border-left-color:#fff}.tinvwl-img-w-desc i{margin-right:20px}.tinvwl-img-w-desc h5{font-weight:600;text-transform:uppercase}.tinvwl-img-w-desc .tinvwl-desc{color:#4f4639}.tinvwl-img-w-desc h5+.tinvwl-desc{margin-top:2px}.tinvwl-premium-feat h2{font-size:48px;line-height:1;color:#3e3e3e}.tinvwl-premium-feat h3{font-size:16px;font-weight:600;color:#50504f}.tinvwl-premium-feat .tinvwl-feat-col-inner{padding:40px}.tinvwl-premium-feat .tinvwl-pic-col .tinvwl-feat-col-inner{text-align:center;padding-left:22px;padding-right:22px}.tinvwl-premium-feat .tinvwl-pic-col img{display:block;margin:0 auto}.tinvwl-premium-feat .tinvwl-pic-col .tinvwl-btn{margin-top:-35px}.tinvwl-premium-feat .tinvwl-features{margin-top:28px}.tinvwl-premium-feat .tinvwl-features li i{color:#96b100;margin-right:15px}.tinvwl-premium-feat .tinvwl-features li+li{margin-top:14px}.tinvwl-premium-feat .tinvwl-img-w-desc+.tinvwl-img-w-desc{margin-top:15px}.tinvwl-premium-feat .tinvwl-sup-col .tinvwl-feat-col-inner>.tinvwl-desc{line-height:1.71428571;text-align:center;margin-top:23px}.tinvwl-premium-feat .tinvwl-sup-col .tinvwl-feat-col-inner>.tinvwl-desc a{display:inline-block;text-decoration:underline;margin-top:26px;color:#000}#wpfooter a,#wpfooter i{color:#ff5739}#wpfooter{padding:10px 40px}#wpfooter p{font-family:"Open Sans","Helvetica Neue",sans-serif;font-size:14px;line-height:1.85714286;color:#4b4b4b}#wpfooter .ftinvwl-heart{margin:0 3px}#wpfooter .ftinvwl-star{font-size:12px;margin:0 1px}#wpfooter span .ftinvwl-star:first-of-type{margin-left:6px}#wpfooter span .ftinvwl-star:last-of-type{margin-left:3px}#wpfooter a:active,#wpfooter a:focus,#wpfooter a:hover{color:#000}.tinvwl-color-picker{position:relative}.tinvwl-color-picker .iris-picker{position:absolute;z-index:9999}.tinvwl-color-picker input[type=text]{color:#fff;border:4px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.14)}.tinvwl-color-picker .tinvwl-eyedropper{cursor:pointer;position:relative;display:inline-block;margin-left:4px;width:42px;height:42px;background:url(../img/color_icon.png) center no-repeat #fff;border:1px solid rgba(0,0,0,.14);border-radius:2px;box-shadow:1px 2px 4px 0 rgba(0,0,0,.1)}.tinvwl-color-picker .tinvwl-eyedropper a{color:#6b625a}.tinvwl-color-picker .tinvwl-eyedropper i{display:inline-block;position:absolute;top:15px;left:14px;font-size:12px}.tinvwl-content .tinvwl-modal,.tinvwl-overlay{top:0;left:0;position:fixed;transition:opacity .3s ease,visibility .3s ease}.tinvwl-color-picker+.iris-picker .iris-square-value{width:0;height:0}.tinvwl-overlay{width:100%;height:100%;visibility:hidden;opacity:0;background:#191919}.tinvwl-modal.tinvwl-modal-open .tinvwl-overlay{visibility:visible;opacity:.5}.admin-bar .tinvwl-content .tinvwl-modal{padding-top:32px!important}.tinvwl-content .tinvwl-modal{overflow-y:auto;overflow-x:hidden;width:0;height:0;z-index:9999;outline:0!important;-webkit-backface-visibility:hidden;visibility:hidden;opacity:0;text-align:left}.tinvwl-content .tinvwl-modal.tinvwl-modal-open{visibility:visible;opacity:1;width:100%;height:100%}@media screen and (max-width:782px){.admin-bar .tinvwl-content .tinvwl-modal{padding-top:46px!important}}@media screen and (max-width:600px){.admin-bar .tinvwl-content .tinvwl-modal{padding-top:0!important}}.tinvwl-modal .tinvwl-table{height:100%}.tinvwl-content .tinvwl-modal .tinvwl-modal-inner{position:relative;margin:0 auto;background:#fff;border-radius:4px;max-width:415px;padding:40px 45px}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails{text-align:center}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails p{margin:0 0 26px}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails .tinvwl-btn.large{padding:14px 33px}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails .tinvwl-btn+.tinvwl-btn{margin-left:6px}.tinvwl-quick-btns{position:fixed;top:25%;left:100%;z-index:9999}.tinvwl-quick-btns button{display:block;width:117px;font-size:14px;font-family:"Open Sans",Arial,sans-serif;font-weight:600;padding:0 35px 0 0;border-radius:2px;border:none;text-decoration:none;background:#96b100;color:#fff;-webkit-transform:translateX(-50px);-ms-transform:translateX(-50px);transform:translateX(-50px);transition:-webkit-transform .3s ease;transition:transform .3s ease}.tinvwl-panel.only-button .tinvwl-quick-btns .form-control{display:block;width:119px}.tinvwl-quick-btns button:hover{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}.tinvwl-quick-btns button+button{margin-top:4px}.tinvwl-quick-btns button span{display:inline-block;width:50px;padding:15px 0;text-align:center}.tinvwl-empty-select+.tinvwl-input-group-btn .tinvwl-btn{margin-left:0}.container,.container-fluid{margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.tinvwl-btns-group .tinvwl-btn,.tinvwl-panel:not(.only-button) .tinvwl-table .col-lg-6>.tinvwl-btn,.tinvwl-table .tinvwl-form-onoff{float:right}.tinvwl-empty-select+.tinvwl-input-group-btn{text-align:right}.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.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,.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,.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,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{float:left;width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.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.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.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.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.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.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}@media (max-width:1199px){.tinvwl-table .form-group>[class^=col-lg-]+[class^=col-lg-],.tinvwl-table .form-group>[class^=col-md-]+[class^=col-md-],.tinvwl-table .row>[class^=col-lg-]+[class^=col-lg-],.tinvwl-table .row>[class^=col-md-]+[class^=col-md-]{padding-top:30px}}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-group{margin-bottom:23px}.form-control{display:block;width:100%}.tinvwl-input-group-addon,.tinvwl-input-group-btn{width:1%;vertical-align:middle;white-space:nowrap}label.one-line{display:inline-block;margin-bottom:0;margin-right:10px}.control-label label{display:block;margin-bottom:10px}.form-horizontal .control-label label{padding-top:9px;margin-bottom:0}@media (min-width:1200px){.tinvwl-table .tinvwl-header-row label{margin-bottom:0}.tinvwl-table .tinvwl-header-row .form-group{margin-top:-7px;margin-bottom:13px}}@media (max-width:1199px){.form-horizontal .control-label label{margin-bottom:10px}.tinvwl-table .tinvwl-header-row label{padding-top:3px}}.tinvwl-input-group{position:relative;display:table;border-collapse:separate}.tinvwl-input-group-btn{margin-top:0;position:relative}.tinvwl-input-group-btn .tinvwl-btn{margin-left:10px}.tinvwl-input-group-btn>.btn{position:relative}.tinvwl-input-group .form-control,.tinvwl-input-group-addon,.tinvwl-input-group-btn{display:table-cell}.tinvwl-input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}@media only screen and (max-width:1199px){.tinvwl-input-group:not(.tinvwl-no-full),.tinvwl-input-group:not(.tinvwl-no-full) .form-control,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn{display:block}.tinvwl-input-group:not(.tinvwl-no-full) .form-control{float:none}.tinvwl-input-group:not(.tinvwl-no-full) .form-control+.tinvwl-input-group-btn{padding-top:10px;padding-left:0}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>input,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>input{margin-left:0}}.text-right{text-align:right}@media (max-width:1199px){.text-right{text-align:left}}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .tinvwl-input-group{display:inline-table;vertical-align:middle}.form-inline .tinvwl-input-group .form-control,.form-inline .tinvwl-input-group .tinvwl-input-group-addon,.form-inline .tinvwl-input-group .tinvwl-input-group-btn{width:auto}.form-inline .tinvwl-input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.logo_heart{background:url(../img/logo_heart.png) center no-repeat;display:inline-block;background-size:54px 54px;width:54px;height:54px}.admin-rescue,.admin-update{display:inline-block;width:61px;height:60px}.admin-rescue{background:url(../img/admin-rescue.png) center no-repeat;background-size:61px 60px}.admin-update{background:url(../img/admin-update.png) center no-repeat;background-size:61px 60px}.wizard_logo{background:url(../img/wizard_logo.png) center no-repeat;background-size:54px 54px;width:54px;height:54px;display:block;margin:10px auto}.wizard_setup{background:url(../img/wizard_setup.png) center no-repeat;display:inline-block;background-size:143px 144px;width:143px;height:144px}.premium_adv{background:url(../img/premium_adv.png) center no-repeat;display:block;margin:0 auto;background-size:365px 216px;width:365px;height:216px}.tinvwl-content select{background-size:13px 8px}.tinvwl-select+.tinvwl-caret span{background-size:13px 18px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover .tinvwl-chevron{background-size:20px 30px}.tinvwl-color-picker .tinvwl-eyedropper{background-size:28px 29px}@media only screen and (-webkit-min-device-pixel-ratio:1.5),not all,not all,not all{.tinvwl-content select{background-image:url(../img/select_caret@2x.png)}.tinvwl-select+.tinvwl-caret span{background-image:url(../img/chevron_down@2x.png)}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover .tinvwl-chevron{background-image:url(../img/chevron_icon@2x.png)}.tinvwl-color-picker .tinvwl-eyedropper{background-image:url(../img/color_icon@2x.png)}.logo_heart{background-image:url(../img/logo_heart@2x.png)}.admin-rescue{background-image:url(../img/admin-rescue@2x.png)}.admin-update{background-image:url(../img/admin-update@2x.png)}.wizard_logo{background-image:url(../img/wizard_logo@2x.png)}.wizard_setup{background-image:url(../img/wizard_setup@2x.png)}}#style_options .tinvwl-table tbody tr .tinvwl-inner h2{font-size:18px;color:#291C09;text-transform:capitalize;font-weight:600;margin-bottom:21px;padding:14px 0}
|
1 |
+
/*! WooCommerce Wishlist Plugin - version 1.8.4
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
+
@font-face{font-family:tinvwl-webfont;src:url(../fonts/tinvwl-webfont.eot?xu2uyi);src:url(../fonts/tinvwl-webfont.eot?xu2uyi#iefix) format("embedded-opentype"),url(../fonts/tinvwl-webfont.ttf?xu2uyi) format("truetype"),url(../fonts/tinvwl-webfont.woff?xu2uyi) format("woff"),url(../fonts/tinvwl-webfont.svg?xu2uyi#tinvwl-webfont) format("svg");font-weight:400;font-style:normal}.ftinvwl{font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ftinvwl-twitter:before{content:"\f099"}.ftinvwl-facebook:before{content:"\f09a"}.ftinvwl-facebook-f:before{content:"\f09a"}.ftinvwl-google:before{content:"\f0d5"}.ftinvwl-email:before{content:"\f0e0"}.ftinvwl-pinterest:before{content:"\f231"}.ftinvwl-star:before{content:"\e912"}.ftinvwl-shopping-cart:before{content:"\e913"}.ftinvwl-magic:before{content:"\e914"}.ftinvwl-info:before{content:"\e915"}.ftinvwl-graduation-cap:before{content:"\e918"}.ftinvwl-floppy-o:before{content:"\e919"}.ftinvwl-eyedropper:before{content:"\e91a"}.ftinvwl-exclamation-triangle:before{content:"\e91b"}.ftinvwl-check:before{content:"\e91e"}.ftinvwl-arrow-left:before{content:"\e91f"}.ftinvwl-wrench:before{content:"\e920"}.ftinvwl-chevron-down:before{content:"\e900"}.ftinvwl-chevron-right:before{content:"\e901"}.ftinvwl-chevron-left:before{content:"\e902"}.ftinvwl-chevron-up:before{content:"\e903"}.ftinvwl-cancel:before{content:"\e904"}.ftinvwl-times:before{content:"\e905"}.ftinvwl-heart-plus:before{content:"\e906"}.ftinvwl-heart-mark-right:before{content:"\e907"}.ftinvwl-heart2:before{content:"\e908"}.ftinvwl-heart-o:before{content:"\e909"}.ftinvwl-heart-mark-left:before{content:"\e90a"}.ftinvwl-heart-mail:before{content:"\e90b"}.ftinvwl-heart-tinv:before{content:"\e90c"}.ftinvwl-key:before{content:"\e90d"}.ftinvwl-lock:before{content:"\e90e"}.ftinvwl-hearts:before{content:"\e90f"}.ftinvwl-user:before{content:"\e910"}*{box-sizing:border-box}:after,:before{box-sizing:border-box}.tinv-wishlist-clearfix:after,.tinv-wishlist-clearfix:before{display:table;content:" "}.container:after,.container:before{display:table;content:" "}.container-fluid:after,.container-fluid:before{display:table;content:" "}.row:after,.row:before{display:table;content:" "}.form-horizontal .form-group:after,.form-horizontal .form-group:before{display:table;content:" "}.form-group:after,.form-group:before{display:table;content:" "}.tablenav:after,.tablenav:before{display:table;content:" "}.tinvwl-panel:after,.tinvwl-panel:before{display:table;content:" "}.container-fluid:after,.container:after,.form-group:after,.form-horizontal .form-group:after,.row:after,.tablenav:after,.tinv-wishlist-clearfix:after,.tinvwl-panel:after{clear:both}.tinvwl-content table,.tinvwl-header table{border-spacing:0;border-collapse:collapse;width:100%;max-width:100%}.tinvwl-header td,.tinvwl-header th{padding:0}.tinvwl-content td,.tinvwl-content th{padding:0}.tinvwl-content img,.tinvwl-header img{height:auto;max-width:100%}#wpwrap{background:#f6f3ed}#wpcontent{padding-left:0}#wpbody-content{padding-bottom:135px}#update-nag,.notice,.update-nag{margin:20px 0 0 40px}div.error,div.updated{margin:20px 0 0 40px}.notice{margin-right:40px}div.error,div.updated{margin-right:40px}body .tinvwl-content,body .tinvwl-header{font-family:Arial,sans-serif;font-size:14px;line-height:1.429;color:#6b625a}button,input,select,textarea{font-family:inherit;font-size:inherit;font-weight:inherit}.tinv-label,label{display:block;font-size:15px;font-family:"Open Sans","Helvetica Neue",sans-serif;color:#291c09;font-weight:600;margin-bottom:7px}.wrap h1,h1,h2,h3,h4,h5,h6{color:#291c09;font-family:'Open Sans',Arial,sans-serif;font-weight:400;line-height:1.313;padding:0;margin:0;border:0}.wrap h1,h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}h5{font-size:14px}h6{font-size:12px}@media screen and (max-width:1200px){#update-nag,.notice,.update-nag{margin-top:20px;margin-left:20px;margin-right:20px}div.error,div.updated{margin-top:20px;margin-left:20px;margin-right:20px}}@media screen and (max-width:782px){.auto-fold #wpcontent{padding-left:0}#update-nag,.notice,.update-nag{margin:20px 0 0 0}div.error,div.updated{margin:20px 0 0 0}.notice{margin-right:0}div.error,div.updated{margin-right:0}}#toplevel_page_tinvwl ul ul{display:none;margin-left:15px;position:absolute}#toplevel_page_tinvwl ul li.current ul,#toplevel_page_tinvwl ul li:hover ul{display:block;left:145px;margin-left:15px;position:absolute;top:0}.status-panel>div{display:inline-block;margin-left:21px}.status-panel .button-link{background-color:#ff5739;color:#fff;text-decoration:none;text-transform:uppercase;line-height:10px;font-weight:600;height:48px;display:table-cell;border-radius:5px;padding:0 17px;vertical-align:middle}.status-panel .button-link span::before{color:#ffdc00;display:inline-block;font:normal 12px/1 dashicons;vertical-align:bottom;-webkit-font-smoothing:antialiased;content:"\f155"}.status-panel .button-round{border:2px solid #f1f1f1;border-radius:50%;width:43px;padding-top:5px;padding-left:2px;height:40px;display:table-cell;text-align:center;vertical-align:middle}.status-panel .status-tutorial span::before{color:#515151;display:inline-block;font:normal 24px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;content:"\f118"}.tinvwl-status-message{font-family:Arial,sans-serif;font-size:14px;line-height:1.429;margin-top:40px;color:#6b625a;border-top:2px solid #f6f3ed}.tinvwl-status-message .tinvwl-title{padding:13px 20px;float:left;width:142px;font-weight:700}.tinvwl-status-message.type-error .tinvwl-title,.tinvwl-status-message.type-tip .tinvwl-title{color:#fff}.tinvwl-status-message.type-attention .tinvwl-title{color:#23282d}.tinvwl-status-message.type-error .tinvwl-title{background:#ff3814}.tinvwl-status-message.type-tip .tinvwl-title{background:#30aec4}.tinvwl-status-message.type-attention .tinvwl-title{background:#ffe900}.tinvwl-status-message .tinvwl-title i{margin-right:10px}.tinvwl-status-message.type-error>.tinvwl-title>i:before{content:"\f00d"}.tinvwl-status-message.type-tip>.tinvwl-title>i:before{content:"\f05a"}.tinvwl-status-message.type-attention>.tinvwl-title>i:before{content:"\f071"}.tinvwl-status-message .tinvwl-message{padding:13px 20px;overflow:hidden;height:100%;background:#faf9f7}@media screen and (max-width:782px){.tinvwl-status-message{margin-top:20px}}.tinvwl-content a{text-decoration:none;color:#30aec4}.tinvwl-content a:active,.tinvwl-content a:focus,.tinvwl-content a:hover{color:#524737}.tinvwl-content input[type=checkbox],.tinvwl-content input[type=color],.tinvwl-content input[type=date],.tinvwl-content input[type=datetime-local],.tinvwl-content input[type=datetime],.tinvwl-content input[type=email],.tinvwl-content input[type=month],.tinvwl-content input[type=number],.tinvwl-content input[type=password],.tinvwl-content input[type=radio],.tinvwl-content input[type=search],.tinvwl-content input[type=tel],.tinvwl-content input[type=text],.tinvwl-content input[type=time],.tinvwl-content input[type=url],.tinvwl-content input[type=week]{line-height:1.429;padding:9px 13px;margin:0;color:#4f4639;border:1px solid rgba(0,0,0,.14);box-shadow:inset 1px 1px 6px 0 rgba(170,157,137,.14)}.tinvwl-content select{line-height:1.429;padding:9px 13px;margin:0;color:#4f4639;border:1px solid rgba(0,0,0,.14);box-shadow:inset 1px 1px 6px 0 rgba(170,157,137,.14)}.tinvwl-content textarea{line-height:1.429;padding:9px 13px;margin:0;color:#4f4639;border:1px solid rgba(0,0,0,.14);box-shadow:inset 1px 1px 6px 0 rgba(170,157,137,.14);height:70px}.tinvwl-content input[type=color],.tinvwl-content input[type=date],.tinvwl-content input[type=datetime-local],.tinvwl-content input[type=datetime],.tinvwl-content input[type=email],.tinvwl-content input[type=month],.tinvwl-content input[type=number],.tinvwl-content input[type=password],.tinvwl-content input[type=search],.tinvwl-content input[type=tel],.tinvwl-content input[type=text],.tinvwl-content input[type=time],.tinvwl-content input[type=url],.tinvwl-content input[type=week]{height:42px;border-radius:4px}.tinvwl-content select{height:42px;border-radius:4px}.tinvwl-content .tablenav input[type=search]{height:35px;width:210px;padding:9px 13px;box-shadow:none;border:none;background:#f4f3ef}.tinvwl-content .tablenav input[type=search]+button[type=submit],.tinvwl-content .tablenav input[type=search]+input[type=submit]{vertical-align:middle}.tinvwl-content .tablenav .tinvwl-select-wrap+input[type=submit]{float:right;margin-left:8px!important}.tinvwl-content .tablenav input[type=search]+button[type=submit],.tinvwl-content .tablenav input[type=search]+input[type=submit]{float:right;margin-left:8px!important}.tinvwl-content input[type=color]:disabled,.tinvwl-content input[type=date]:disabled,.tinvwl-content input[type=datetime-local]:disabled,.tinvwl-content input[type=datetime]:disabled,.tinvwl-content input[type=email]:disabled,.tinvwl-content input[type=month]:disabled,.tinvwl-content input[type=number]:disabled,.tinvwl-content input[type=password]:disabled,.tinvwl-content input[type=search]:disabled,.tinvwl-content input[type=tel]:disabled,.tinvwl-content input[type=text]:disabled,.tinvwl-content input[type=time]:disabled,.tinvwl-content input[type=url]:disabled,.tinvwl-content input[type=week]:disabled{font-size:15px;font-family:"Open Sans","Helvetica Neue",sans-serif;font-weight:600;color:#291c09;background-color:#f6f3ed;border-color:#f6f3ed}.tinvwl-content select{font-family:Arial,sans-serif;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;padding:9px 40px 9px 13px;background-color:#fff;background-image:url(../img/select_caret.png);background-repeat:no-repeat;background-position:96% center;background-position:calc(100% - 15px) center}.tinvwl-content select:disabled{font-size:15px;font-family:"Open Sans","Helvetica Neue",sans-serif;font-weight:600;color:#291c09;background-color:#f6f3ed;border-color:#f6f3ed}.tinvwl-content select[multiple=multiple]{padding:9px 13px;background:#fff}.tinvwl-content .tinvwl-select.grey{font-size:14px;font-family:Arial,"Helvetica Neue",Helvetica,sans-serif;padding:8px 11px;height:35px;border:none;color:#5d5d5d;background:#f4f3ef}@media screen and (max-width:782px){input,textarea{font-size:14px}#wpbody .tinvwl-content select{height:42px;font-size:14px}}.tinvwl-select-wrap{position:relative;display:inline-block;vertical-align:middle;cursor:pointer}.tinvwl-content select.tinvwl-select.grey{padding-right:47px;margin:0;border-radius:4px}.tinvwl-select+.tinvwl-caret{pointer-events:none;display:inline-block;position:absolute;top:0;right:0;width:36px;height:36px;line-height:36px;text-align:center;border-radius:0 4px 4px 0}.tinvwl-select+.tinvwl-caret span{display:inline-block;width:13px;height:8px;background:url(../img/chevron_down.png) no-repeat center;background-position:0 -10px}.tinvwl-select:hover+.tinvwl-caret{background:#3e3e3e}.tinvwl-select:hover+.tinvwl-caret span{background-position:0 0}.tinvwl-content .tinvwl-nav{margin:0 40px}.tinvwl-content .tinvwl-panel+.tinvwl-nav{margin-top:40px}.tinvwl-nav .tinvwl-prev{float:left}.tinvwl-nav .tinvwl-prev .tinvwl-btn{float:left}.tinvwl-nav .tinvwl-next{float:right;text-align:right}.tinvwl-nav .tinvwl-btn+.tinvwl-btn{margin-left:20px}.tinvwl-panel.only-button.w-bg{background:0 0;overflow:visible}.tinvwl-panel.only-button.w-shadow{box-shadow:none;overflow:visible}.tinvwl-panel.only-button .control-label,.tinvwl-panel.only-button tfoot,.tinvwl-panel.only-button thead{display:none}.tinvwl-panel.only-button .form-group{margin-bottom:0}.tinvwl-panel.only-button .form-control{display:inline-block;width:auto}.tinvwl-panel.only-button .tinvwl-table>tbody>tr>td{padding:0}.tinvwl-panel.only-button #save_buttons--setting_save{display:inline-block}.tinvwl-panel.only-button #save_buttons--setting_reset{display:inline-block;float:right}.tinvwl-panel.only-button #save_buttons--setting_reset .form-control{background-color:#fff;color:#3e3e3e}.tinvwl-panel.only-button #save_buttons--setting_reset .tinvwl-btn.split span{background:#fbfaf9}.tinvwl-panel.only-button #save_buttons--setting_reset .form-control:hover{color:#fff;background-color:#515151}.tinvwl-panel.only-button #save_buttons--setting_reset .tinvwl-btn.split:hover span{background:#434343}#doaction,#doaction2,#post-query-submit{margin:0}button,input[type=submit]{display:inline-block;vertical-align:middle;margin:0;font-family:'Open Sans',Arial,sans-serif;font-size:14px;line-height:normal;cursor:pointer;text-decoration:none}.tinvwl-btn{display:inline-block;vertical-align:middle;margin:0;font-family:'Open Sans',Arial,sans-serif;font-size:14px;line-height:normal;cursor:pointer;text-decoration:none;padding:11px 19px 12px 18px;font-weight:800;text-align:center;text-transform:uppercase;letter-spacing:-.025em;border:none;border-radius:2px;color:#fff;background-color:#96b100}a.tinvwl-btn{padding:11px 19px 12px 18px;font-weight:800;text-align:center;text-transform:uppercase;letter-spacing:-.025em;border:none;border-radius:2px;color:#fff;background-color:#96b100}.tinvwl-btn.large{padding:14px 19px 14px 18px}.tinvwl-btn.small{padding:6px 11px 7px}.tinvwl-btn.smaller{padding:11px 18px 12px}.tinvwl-btn.black,.tinvwl-btn.dark-green,.tinvwl-btn.green,.tinvwl-btn.red{font-weight:800}.tinvwl-btn.grey{margin:0;padding:8px 12px;font-weight:700;color:#3e3e3e;background:#f4f3ef}.tinvwl-btn.grey.large{font-weight:800;padding:14px 19px 14px 18px}.tinvwl-btn.grey.w-icon{letter-spacing:-.025em}.tinvwl-btn.red{color:#fff;background-color:#ff5739}.tinvwl-btn.orange{color:#fff;background-color:#ff9f07}.tinvwl-btn.white.smaller{font-size:14px;font-weight:700;letter-spacing:-.05em;padding:10px 15px 11px;border:1px solid rgba(0,0,0,.14);box-shadow:1px 2px 4px 0 rgba(0,0,0,.1)}.tinvwl-btn.white.small{font-family:Arial,sans-serif;font-size:14px;text-transform:none;font-weight:400;border:1px solid rgba(0,0,0,.14);box-shadow:1px 2px 4px 0 rgba(0,0,0,.1);padding:9px 18px;color:#4f4639}.tinvwl-btn.small.white:active,.tinvwl-btn.small.white:focus,.tinvwl-btn.small.white:hover{color:#fff}.tinvwl-btn.white{color:#291c09;background:#fff}.tinvwl-btn.white.no-txt{padding:12px 16px}.tinvwl-btn.white.small.no-txt{padding:9px 12px}.tinvwl-btn.white i{color:#6b625a;margin-right:11px}.tinvwl-btn.w-icon{font-weight:800}.tinvwl-btn.w-icon i{margin-right:16px}.tinvwl-btn.round.w-icon i{margin-right:15px;font-size:16px}.tinvwl-btn.w-icon i.ftinvwl-graduation-cap{vertical-align:text-bottom}.tinvwl-btn.red.w-icon i{margin-right:13px}.tinvwl-btn.round.xl-icon i,.tinvwl-btn.xl-icon i{font-size:17px;margin-right:15px}.tinvwl-btn.lg-icon i{font-size:15px}.tinvwl-btn.md-icon i,.tinvwl-btn.round.md-icon i{font-size:14px}.tinvwl-btn.sm-icon i{font-size:13px}.tinvwl-btn.xs-icon i{font-size:11px;vertical-align:1%}.tinvwl-btn.white.no-txt i{margin-right:0}.tinvwl-btn.white:active i,.tinvwl-btn.white:focus i,.tinvwl-btn.white:hover i{color:#fff}.tinvwl-btn.green{color:#fff;background-color:#a9c203}.tinvwl-btn.black{color:#fff;background-color:#515151}.tinvwl-btn.smaller-txt{font-size:12px;padding:15px 20px}.tinvwl-btn.medium{letter-spacing:0}.tinvwl-btn.medium.smaller-txt{padding:9px 16px}.tinvwl-btn.round{border-radius:25px;padding:15px 28px 16px}.tinvwl-btn.round.red{padding:16px 30px}.tinvwl-btn.split{padding:0 26px 0 0}.tinvwl-btn.split span{display:inline-block;text-align:center;width:46px;padding:14px 0;margin-right:14px;border-radius:4px 0 0 4px;background:#8aa300}.tinvwl-btn.split:active span,.tinvwl-btn.split:focus span,.tinvwl-btn.split:hover span{background:#434343}.tinvwl-btn.split.green span{background:#b9cf09}.tinvwl-btn.split.black span{background:#434343}.tinvwl-btn.split span i{font-size:17px}.tinvwl-btn:not(:disabled):active,.tinvwl-btn:not(:disabled):focus,.tinvwl-btn:not(:disabled):hover{color:#fff;background-color:#515151}a.tinvwl-btn:not(:disabled):active,a.tinvwl-btn:not(:disabled):focus,a.tinvwl-btn:not(:disabled):hover{color:#fff;background-color:#515151}.tinvwl-header{padding:21px 40px;margin-bottom:40px;background:#fff}.tinvwl-header .icon.border-grey{position:relative;display:inline-block;width:45px;height:45px;line-height:45px;text-align:center;background:#fff;border:2px solid #f1f1f1;border-radius:50%;color:#3e3e3e}.tinvwl-header .icon.border-grey:hover{border-color:#515151}.tinvwl-header .icon.w-lines{position:relative;padding:0 30px}.tinvwl-header .icon.w-lines:after,.tinvwl-header .icon.w-lines:before{content:'';position:absolute;top:50%;top:calc(50% - 1px);width:17px;height:1px;background:rgba(0,0,0,.12)}.tinvwl-header .icon.w-lines:before{left:0}.tinvwl-header .icon.w-lines:after{right:0}.tinvwl-header .icon .badge{position:absolute;top:-5px;right:-10px;display:inline-block;min-width:26px;height:26px;font-size:11px;line-height:19px;font-weight:700;background:#ff5739;border:3px solid #fff;color:#fff;border-radius:50%}.tinwl-logo i.logo_heart{min-width:54px}.tinwl-logo h2{font-size:18px;font-weight:700;text-transform:uppercase;line-height:1;padding-left:10px}.tinvwl-header .tinvwl-title{padding-left:28px;margin-left:28px;border-left:1px solid #dcddde}.tinvwl-header h1{color:#3e3e3e;padding:0}.tinvwl-header .tinvwl-status-panel{margin-top:-12px}.tinvwl-header .tinvwl-status-panel>a{vertical-align:middle}.tinvwl-header .tinvwl-status-panel>a+a{margin-left:15px}.tinvwl-header .tinvwl-btn{margin-top:15px;margin-top:18px}.tinvwl-header .tinvwl-btn.red i{color:#ffdc00}.tinvwl-header .tinvwl-status-panel{text-align:right}.tinvwl-sign-icon{font-size:30px;font-family:"Open Sans","Helvetica Neue",sans-serif;color:#948d84}@media (max-width:1199px){.tinvwl-header{text-align:center}.tinvwl-header .tinvwl-cell,.tinvwl-header .tinvwl-cell-3,.tinvwl-header .tinvwl-table{display:block}.tinvwl-header h1+.tinvwl-status-panel{margin-top:25px}.tinvwl-header .tinvwl-status-panel{text-align:center;margin-top:15px}.tinvwl-header .tinvwl-status-panel>a+a{margin-left:9px}.tinwl-logo{display:block;margin:0 auto}.tinwl-logo h2,.tinwl-logo img{display:block;margin:0 auto}.tinvwl-header .tinvwl-title{display:block;margin:0 auto}.tinwl-logo h2{padding-left:0;margin-left:0;margin-top:6px}.tinvwl-header .tinvwl-title{position:relative;padding-left:12px;padding-right:12px;padding-top:13px;margin-left:0;margin-top:16px;border-left:0}.tinvwl-header .tinvwl-title:before{content:'';position:absolute;top:0;left:0;right:0;width:40px;height:1px;margin:0 auto;background:#dcddde}}@media (max-width:782px){.tinvwl-header .tinvwl-btn .tinvwl-txt{display:none}.tinvwl-header .tinvwl-btn i{margin-right:0!important}.tinvwl-header .tinvwl-btn.grey{padding-left:16px;padding-right:16px}}.tinwl-wishlists-privacy{margin:-10px 0 0}.tinwl-wishlists-privacy li{float:left;margin:10px 10px 0 0}.tinwl-wishlists-privacy li:last-child{margin-right:0}.tinwl-wishlists-privacy li a{display:block;font-family:"Open Sans","Helvetica Neue",sans-serif;font-size:14px;font-weight:600;line-height:1;padding:10px 16px;border-radius:3px;color:#404040;background:#ede8df}.tinwl-wishlists-privacy li.active a{color:#fff;background-color:#96b100}.tinwl-wishlists-privacy li a:active,.tinwl-wishlists-privacy li a:focus,.tinwl-wishlists-privacy li a:hover{color:#fff;background-color:#96b100}@media screen and (max-width:782px){.tinwl-wishlists-privacy{margin-left:15px}}.tinvwl-panel{margin:40px 40px 0}.tinvwl-panel .w-bg-grey{background:#fbfaf9}.tinvwl-panel.w-shadow{box-shadow:1px 1px 8px 0 rgba(170,157,137,.14)}.tinvwl-panel.w-bg{background:#fff;border-radius:4px}.tinvwl-table.w-info .tinvwl-info[rowspan]{vertical-align:middle}.tinvwl-table.w-info .tinvwl-info[rowspan] .tinvwl-info-sign{vertical-align:middle}.tinvwl-table.w-info .tinvwl-info-top>tr .tinvwl-info{vertical-align:top}@media screen and (max-width:1200px){.tinvwl-panel{margin:20px 20px 0}.tinvwl-header{margin-bottom:20px}}@media screen and (max-width:782px){.tinvwl-panel{margin:20px 0 0}.tinvwl-panel.only-button{text-align:center}}.tinvwl-icon-preview{position:relative;width:50px;height:42px;margin-right:10px;margin-bottom:10px;text-align:center;border-radius:2px;color:#595857;background:#f6f3ed}.tinvwl-icon-preview span{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tinvwl-icon-preview span img{max-width:50px;max-height:42px;vertical-align:middle}@media (min-width:1200px){.tinvwl-icon-preview{margin-bottom:0}}.tinvwl-content table.widefat{box-shadow:none}.tinvwl-content .tablenav{height:auto;margin:30px;background:#fff}.tinvwl-content .tablenav .actions{padding:0}.tinvwl-content .widefat td,.tinvwl-content .widefat th{text-align:center;padding:0}.tinvwl-content .widefat th{padding:27px 0;position:relative}@media screen and (max-width:782px){.tablenav.top .actions{display:block}.tablenav br.tinv-wishlist-clear{display:none}.tinvwl-content .tablenav{margin:15px 12px}.tinvwl-content .tablenav .alignleft,.tinvwl-content .tablenav .alignright{float:none}.tinvwl-content .tablenav .tinvwl-full{display:none}.tinvwl-content .tablenav .alignleft+.alignright{margin-top:10px}.tinvwl-content .tablenav .tinvwl-select-wrap{width:calc(100% - 75px)}#wpbody .tinvwl-content .tablenav .tinvwl-select-wrap select.tinvwl-select{max-width:100%;width:100%;height:35px;padding:9px 13px}.tinvwl-content .tablenav input[type=search]{width:calc(100% - 84px)}}.tinvwl-content .widefat th.sortable,.tinvwl-content .widefat th.sorted{padding:0}.tinvwl-content .widefat th.sortable>a,.tinvwl-content .widefat th.sorted>a{padding:28px 17px}.tinvwl-content .widefat th.tinvwl-has-info{padding-top:28px}.tinvwl-content .widefat th.tinvwl-has-info.sortable>a,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a{padding-top:0}.tinvwl-content .widefat th.sortable:first-of-type,.tinvwl-content .widefat th.sorted:first-of-type{padding-left:0}.tinvwl-content .widefat th.sortable:first-of-type>a,.tinvwl-content .widefat th.sorted:first-of-type>a{padding-left:28px}.tinvwl-content .widefat th:first-of-type{text-align:left;padding-left:28px}.tinvwl-content .widefat td:first-of-type{text-align:left;padding-left:28px}.tinvwl-content .widefat th .tinvwl-help-wrap{display:inline-block;margin-left:6px}.tinvwl-content .widefat th.sortable>a+.tinvwl-help-wrap,.tinvwl-content .widefat th.sorted>a+.tinvwl-help-wrap{margin-left:0}.tinvwl-content .widefat thead tr{background:#f4f3ef}.tinvwl-content .striped>tbody>:nth-child(odd),.tinvwl-content ul.striped>:nth-child(odd){background:0 0}.tinvwl-content .widefat tbody th.check-column,.tinvwl-content .widefat thead td.check-column{width:50px;padding:28px 0 28px 28px;vertical-align:middle}.tinvwl-content .widefat thead td.check-column{padding:28px 0 28px 28px}.tinvwl-content .widefat tbody th.check-column{padding:13px 0 13px 28px}.tinvwl-content .widefat thead td.check-column+th{padding-left:21px}.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>a,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>a{padding-left:21px}.tinvwl-content .widefat tbody th.check-column+td{padding-left:21px}.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>.tinvwl-info-wrap.tinvwl-in-table,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>.tinvwl-info-wrap.tinvwl-in-table{padding-left:21px}.tinvwl-content .widefat thead td.pause-play-column{padding:0;width:53px;text-align:center}.tinvwl-content .widefat tbody th.pause-play-column{padding:0;width:53px;text-align:center}.tinvwl-content th.sortable a,.tinvwl-content th.sorted a{padding:0}.tinvwl-content .widefat th{font-size:14px;font-weight:600;font-family:"Open Sans","Helvetica Neue",sans-serif;color:#291c09;text-transform:uppercase;letter-spacing:-.025em}.tinvwl-content th.sortable>a,.tinvwl-content th.sorted>a{font-size:14px;font-weight:600;font-family:"Open Sans","Helvetica Neue",sans-serif;color:#291c09;text-transform:uppercase;letter-spacing:-.025em}.tinvwl-content th.sortable>a,.tinvwl-content th.sorted>a{display:inline-block;vertical-align:middle}.tinvwl-content .widefat th.sortable>a,.tinvwl-content .widefat th.sorted>a{position:relative}.tinvwl-content .widefat th.sortable>a .sorting-indicator,.tinvwl-content .widefat th.sorted>a .sorting-indicator{position:absolute;top:50%;right:0;margin-top:-2px}.tinvwl-content .widefat th.tinvwl-has-info.sortable>a .sorting-indicator,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a .sorting-indicator{margin-top:-15px}.tinvwl-content th.sortable a span,.tinvwl-content th.sorted a span{float:none}.tinvwl-content table.widefat{border:none;border-bottom:2px solid #f7f7f7}.tinvwl-content .widefat thead td,.tinvwl-content .widefat thead th{border-bottom:0}.tinvwl-content .widefat td{padding:24px 0;vertical-align:middle}.tinvwl-content .widefat tbody td{padding:13px 0}.tinvwl-content .widefat td{font-size:14px}.tinvwl-content .widefat td ol,.tinvwl-content .widefat td p,.tinvwl-content .widefat td ul{font-size:14px}.tinvwl-content .widefat tbody tr+tr{border-top:2px solid #f7f7f7}.tinvwl-content .widefat thead th.column-preference{text-indent:-9999px}.tinvwl-content .widefat.wishlists tbody td.column-preference,.tinvwl-content .widefat.wishlists thead th.column-preference{min-width:220px;width:220px}.tinvwl-content .widefat:not(.products) tbody td.column-preference{text-align:right}.tinvwl-content .widefat.products thead th.column-quantity a>span:not(.sorting-indicator){max-width:91px}.tinvwl-content .widefat.users tbody .column-name>a{display:block}.tinvwl-content .widefat.products tbody td.column-preference,.tinvwl-content .widefat.products thead th.column-preference{width:345px;min-width:345px}.tinvwl-content .widefat.users tbody td.column-preference,.tinvwl-content .widefat.users thead th.column-preference{width:165px;min-width:165px}.tinvwl-content .widefat tbody .column-name strong{font-weight:400}.tinvwl-content .widefat tbody .column-name>a{display:table}.tinvwl-content .widefat tbody .column-name .product-image{display:table-cell;vertical-align:middle}.tinvwl-content .widefat tbody .column-name .product-image img{max-width:66px}.tinvwl-content .widefat tbody .column-name .product-title{display:table-cell;vertical-align:middle;padding-left:15px}.tinvwl-content .widefat tbody td.column-preference,.tinvwl-content .widefat thead th.column-preference{padding-right:20px}.tinvwl-content .widefat.products tbody td.column-preference>a{margin-right:10px;float:left}.tinvwl-content .widefat.products tbody td.column-preference>a:last-child{margin-right:0}.tinvwl-content .tablenav .tablenav-pages{float:none;text-align:center;height:auto;margin-top:0}.tinvwl-content .tablenav .tablenav-pages .pagination-links>a{display:inline-block;vertical-align:middle;text-align:center;font-size:14px;font-weight:400;padding:0;min-width:38px;height:38px;line-height:38px;border-radius:50%;border:none;background:0 0;color:#3e3e3e}.tinvwl-content .tablenav .tablenav-pages .pagination-links>span{display:inline-block;vertical-align:middle;text-align:center;font-size:14px;font-weight:400;padding:0;min-width:38px;height:38px;line-height:38px;border-radius:50%;border:none;background:0 0;color:#3e3e3e;color:rgba(62,62,62,.46);background:#f3f1ec}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page{background:#f3f1ec}.tinvwl-content .tablenav .tablenav-pages .pagination-links>.tinvwl-page-number.space{background:0 0;color:#3e3e3e}.tinvwl-content .tablenav .tablenav-pages .pagination-links>a:hover{background:#3e3e3e;color:#fff}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover{background:#3e3e3e;color:#fff}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page{margin-right:20px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover{background:#3e3e3e;color:#fff}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page{margin-left:20px}.tinvwl-content .tablenav .tablenav-pages .tinvwl-chevron{display:inline-block;vertical-align:middle;width:9px;height:16px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page .tinvwl-chevron{background:url(../img/chevron_icon.png) no-repeat center;background-position:0 -16px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover .tinvwl-chevron{background:url(../img/chevron_icon.png) no-repeat center;background-position:0 0}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page .tinvwl-chevron{background:url(../img/chevron_icon.png) no-repeat center;background-position:-10px -16px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover .tinvwl-chevron{background:url(../img/chevron_icon.png) no-repeat center;background-position:-10px 0}.tinvwl-content .widefat.products tbody td.column-name,.tinvwl-content .widefat.products thead th.column-name{width:30%}.tinvwl-content .widefat.wishlists tbody td.column-title,.tinvwl-content .widefat.wishlists thead th.column-title{width:45%}.tinvwl-content .widefat.users tbody td.column-wishlist,.tinvwl-content .widefat.users thead th.column-wishlist{width:45%}.tinvwl-content .widefat.users tbody td.column-name,.tinvwl-content .widefat.users thead th.column-name{text-align:left}.tinvwl-content .widefat.users tbody td.column-quantity,.tinvwl-content .widefat.users thead th.column-quantity{width:100px}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn .tinvwl-mobile{display:none}.tinvwl-content .widefat.products thead th.column-quantity span span{float:none}@media screen and (max-width:1440px){.tinvwl-content .widefat.products tbody td.column-preference,.tinvwl-content .widefat.products thead th.column-preference{width:204px;min-width:204px}.tinvwl-content .widefat.wishlists tbody td.column-preference,.tinvwl-content .widefat.wishlists thead th.column-preference{width:98px;min-width:98px}.tinvwl-content .widefat.users tbody td.column-preference,.tinvwl-content .widefat.users thead th.column-preference{width:60px;min-width:60px}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn.tinvwl-w-mobile{padding:9px 12px}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn .tinvwl-mobile{display:inline;margin:0}.tinvwl-content .widefat tbody td.column-preference .tinvwl-btn .tinvwl-full{display:none}}@media screen and (max-width:1366px) and (min-width:783px){.tinvwl-content .widefat tbody .column-name .product-image{display:block}.tinvwl-content .widefat tbody .column-name .product-title{display:block;padding-left:0}.tinvwl-content .widefat.products thead th.column-preference{width:103px;min-width:103px}.tinvwl-content .widefat.products tbody td.column-preference{width:103px;min-width:103px}.tinvwl-content .widefat.products tbody td.column-preference>a{margin-right:5px}.tinvwl-content .widefat tbody td.column-preference>a:nth-child(2n){margin-right:0}.tinvwl-content .widefat tbody td.column-preference>a:nth-child(n+3){margin-top:5px}.tinvwl-content .widefat thead th .tinvwl-full{display:none}}@media screen and (max-width:1200px) and (min-width:783px){.tinvwl-content th.sortable a span,.tinvwl-content th.sorted a span{float:none}.tinvwl-content .widefat th.sortable>a,.tinvwl-content .widefat th.sorted>a{padding-left:0;padding-right:0;position:static}.tinvwl-content .widefat th.sortable>a .sorting-indicator,.tinvwl-content .widefat th.sorted>a .sorting-indicator{top:auto;bottom:12px;left:0;right:0;margin-left:auto;margin-right:auto}.tinvwl-content .widefat th.sortable>a .sorting-indicator:before,.tinvwl-content .widefat th.sorted>a .sorting-indicator:before{left:-5px}.tinvwl-content .widefat th.tinvwl-has-info.sortable>a .sorting-indicator,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a .sorting-indicator{margin-top:12px}.tinvwl-content .widefat.wishlists tbody td.column-title,.tinvwl-content .widefat.wishlists thead th.column-title{width:38%}}@media screen and (max-width:782px){.tinvwl-content .widefat th.tinvwl-has-info.sortable>a .sorting-indicator,.tinvwl-content .widefat th.tinvwl-has-info.sorted>a .sorting-indicator{margin-top:0}.tinvwl-content .widefat.products tbody td.column-preference>a{margin-right:5px;float:none}.tinvwl-content .widefat tbody .column-name .product-image,.tinvwl-content .widefat tbody .column-name .product-title{vertical-align:top}.tablenav .tablenav-pages{margin-bottom:15px}.tinvwl-content .widefat thead th.column-primary{width:100%!important}.tinvwl-content .widefat thead td.check-column+th.column-primary{width:50%!important}.tinvwl-content .widefat.users thead td.check-column+th.column-primary{width:100%!important}}.tinvwl-table{display:table;width:100%;max-width:100%}.tinvwl-table.w-bg{background:#fff;overflow:hidden;border-radius:4px}.tinvwl-table.w-shadow{box-shadow:1px 1px 8px 0 rgba(170,157,137,.14)}.tinvwl-table.auto-width{width:auto}.tinvwl-caption{display:table-caption}.tinvwl-row{display:table-row}.tinvwl-rows{display:table-row-group}.tinvwl-cell{display:table-cell;vertical-align:middle}.tinvwl-cell-2{display:table-cell;vertical-align:middle;float:none}.tinvwl-cell-3{display:table-cell;vertical-align:top;float:none}.tinvwl-table.w-info>tbody>tr>td:first-child,.tinvwl-table.w-info>thead>tr>th:first-child{width:67%}.tinvwl-table td,.tinvwl-table th{vertical-align:top}.tinvwl-table .tinvwl-inner .tinv-wishlist-clearfix h3,.tinvwl-table .tinvwl-inner .tinv-wishlist-clearfix h4,.tinvwl-table .tinvwl-inner.tinv-wishlist-clearfix h3,.tinvwl-table .tinvwl-inner.tinv-wishlist-clearfix h4{float:left}.tinvwl-table .tinvwl-btn-wrap{float:right}.tinvwl-table.w-info thead>tr>th{text-align:left}.tinvwl-table.w-info thead>tr>th .tinvwl-info-wrap{font-weight:400}.tinvwl-table>thead>tr>th{padding:0 30px}.tinvwl-table .tinvwl-info{vertical-align:top}.tinvwl-table>thead>tr>.tinvwl-info .tinvwl-info-wrap{padding-bottom:30px}.tinvwl-table tbody tr .tinvwl-inner h2{font-size:15px;color:#291c09;font-weight:600;margin-bottom:21px}.tinvwl-table>tbody>tr>.tinvwl-info .tinvwl-info-wrap{padding-bottom:20px}.tinvwl-table>tbody>tr>td{padding:0 30px}.tinvwl-table thead>tr .tinvwl-inner{padding:28px 0;margin-bottom:30px;border-bottom:2px solid rgba(219,219,219,.522)}.tinvwl-table thead.tinwl-empty>tr .tinvwl-inner{padding:30px 0 0;margin-bottom:0;border-bottom:0}.tinvwl-table .tinvwl-header-row label{font-size:22px;font-weight:400;line-height:1.313;margin:0 0 15px;padding-top:3px!important}.tinvwl-table tbody>.tinvwl-bodies-border,.tinvwl-table thead .tinvwl-empty-info{display:none}.tinvwl-table thead .tinvwl-empty-info .tinvwl-inner{margin:0;padding-top:56px}.tinvwl-bodies-border .tinvwl-info .tinvwl-inner{display:none;padding-top:30px;margin-top:10px;border-top:2px solid rgba(219,219,219,.522)}.tinvwl-style-options .tinvwl-bodies-border .tinvwl-info,.tinvwl-style-options .tinvwl-table thead .tinvwl-empty-info{padding-left:0;background:0 0}.tinvwl-style-options .tinvwl-table thead .tinvwl-empty-info{display:table-cell}.tinvwl-style-options .tinvwl-table thead .tinvwl-empty-info .tinvwl-inner{display:block}.tinvwl-style-options tbody+tbody>.tinvwl-bodies-border .tinvwl-info .tinvwl-inner{display:block}@media (min-width:1200px){.tinvwl-style-options .tinvwl-table .tinvwl-inner .form-horizontal{width:67%}}textarea[name=style_plain-css]{height:150px}.tinvwl-table tbody+tbody>.tinvwl-bodies-border{display:table-row}.tinvwl-table tbody+tbody>.tinvwl-bodies-border:first-child>td:first-child>.tinvwl-inner{padding-top:30px;margin-top:10px;border-top:2px solid rgba(219,219,219,.522)}.tinvwl-table .tinvwl-header-row.tinvwl-line-border .tinvwl-inner{padding-bottom:15px;margin-bottom:30px;border-bottom:2px solid rgba(219,219,219,.522)}.tinvwl-table .form-group .col-lg-4:nth-child(n+4),.tinvwl-table .form-group .col-md-4:nth-child(n+4){padding-top:27px}.tinvwl-table tfoot .tinvwl-inner{padding-top:20px}.tinvwl-table tr.no-top-border .tinvwl-info-wrap,.tinvwl-table tr.no-top-border .tinvwl-inner{border-top:0;padding-top:0}.tinvwl-table thead .w-bg-grey .tinvwl-info-wrap{padding-top:30px}.tiwl-notifications-style-logo img{height:42px}@media (min-width:1200px){.tinvwl-table tr.tinvwl-full-width .control-label label{margin-bottom:10px}.tinvwl-table tr.tinvwl-full-width [class^=col-lg-],.tinvwl-table tr.tinvwl-full-width [class^=col-md-]{width:100%}.tinvwl-table tr.tinvwl-full-width textarea{height:250px;padding:15px}.tiwl-notifications-style-logo img{float:right}}@media (max-width:1199px){.form-horizontal .control-label .tinvwl-empty{display:none}.tinvwl-style-options .tinvwl-empty-info,.tinvwl-style-options .tinvwl-info{display:none!important}.tinvwl-style-options .tinvwl-bodies-border td:first-child,.tinvwl-style-options .tinvwl-table thead th:first-child{padding-right:30px!important}.tinvwl-table .tinvwl-header-row.tinvwl-line-border .tinvwl-inner{padding-bottom:0}.tinvwl-table .tinvwl-header-row.tinvwl-line-border .tinvwl-inner .form-group{margin-bottom:20px}}.tinvwl-info .tinvwl-info-desc a{text-decoration:underline;color:#ff5739}.tinvwl-info .tinvwl-info-desc a:active,.tinvwl-info .tinvwl-info-desc a:focus,.tinvwl-info .tinvwl-info-desc a:hover{color:#000}.tinvwl-info-wrap.tinvwl-in-section{background:#fbfaf9;color:#4f4639}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign{width:42px;vertical-align:top;padding-top:1px;padding-right:20px}.tinvwl-info-wrap .tinvwl-info-sign .tinvwl-help,.tinvwl-info-wrap .tinvwl-info-sign span{display:inline-block;text-align:center;width:22px;height:22px;line-height:22px;border-radius:50%;background:#e1dbce}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign .tinvwl-help,.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign span{display:block}.tinvwl-info-wrap i{font-size:14px;color:#fbfaf9}.tinvwl-panel:not(.only-button) .tinvwl-table .col-lg-6>.tinvwl-btn{width:auto}.tinvwl-btns-group{margin-bottom:23px;margin-top:-15px;margin-right:-15px}.tiwl-style-custom-allow .tinvwl-inner textarea{margin-bottom:23px}.tinvwl-btns-group .tinvwl-btn{margin-top:15px;margin-right:15px;float:left}@media (min-width:1200px){.tinvwl-btns-group .tinvwl-btn,.tinvwl-panel:not(.only-button) .tinvwl-table .col-lg-6>.tinvwl-btn,.tinvwl-table .tinvwl-form-onoff{float:right}}.tinvwl-table .tinvwl-info .tinvwl-info-wrap.tinvwl-in-section .tinvwl-help{display:none}.tinvwl-info-wrap.tinvwl-in-table{display:inline-block;vertical-align:middle;display:block;margin-bottom:5px}.tinvwl-info-wrap.tinvwl-in-table .tinvwl-help{cursor:pointer}.tinvwl-content .widefat th.tinvwl-has-info .tinvwl-col-name{margin-right:5px}.tinvwl-info-wrap.tinvwl-in-table .tinvwl-info-desc{display:none}@media (max-width:1200px){.tinvwl-table .tinvwl-info{padding-left:15px;padding-right:15px}.tinvwl-table.w-info>tbody>tr>td:first-child,.tinvwl-table.w-info>thead>tr>th:first-child{width:90%}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign{width:auto;padding-right:0}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign span{display:none}.tinvwl-table .tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-sign .tinvwl-help{display:block;margin:0 auto}.tinvwl-info-wrap.tinvwl-in-section .tinvwl-info-desc{display:none}}@media (max-width:782px){.tinvwl-content .widefat th.tinvwl-has-info.sortable,.tinvwl-content .widefat th.tinvwl-has-info.sorted{padding-top:0}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox]{margin-bottom:0}.tinvwl-content .widefat th.sortable.tinvwl-has-info>a,.tinvwl-content .widefat th.sortable>a,.tinvwl-content .widefat th.sorted.tinvwl-has-info>a,.tinvwl-content .widefat th.sorted>a{padding-top:18px;padding-bottom:18px}.tinvwl-content .widefat thead td.check-column{padding-top:14px;padding-bottom:15px;padding-left:20px;width:45px}.tinvwl-content .widefat tbody th.check-column{padding-top:14px;padding-bottom:15px;padding-left:20px;width:45px;padding-top:11px;padding-bottom:11px;vertical-align:top}.tinvwl-content .widefat.wishlists tbody th.check-column,.tinvwl-content .widefat.wishlists thead td.check-column{width:23px}.tinvwl-content .widefat thead td.check-column+th{padding-left:10px}.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>a,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>a{padding-left:10px}.tinvwl-content .widefat tbody th.check-column+td{padding-left:10px}.tinvwl-content .widefat thead td.check-column+th.sortable:first-of-type>.tinvwl-info-wrap.tinvwl-in-table,.tinvwl-content .widefat thead td.check-column+th.sorted:first-of-type>.tinvwl-info-wrap.tinvwl-in-table{padding-left:13px;display:inline-block;margin-top:5px;margin-bottom:0}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{text-align:left}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){text-align:right;padding-right:30px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{left:28px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.check-column+td:not(.column-primary)::before{left:13px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column):last-child{padding-bottom:13px}}.popover{position:absolute;top:0;left:0;z-index:9999;display:none;max-width:279px;padding:1px;text-align:center;white-space:normal;background-color:#fff;background-clip:padding-box;border-radius:6px;box-shadow:0 5px 15px 0 rgba(0,0,0,.22)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:30px 30px 0;margin:0;font-family:'Open Sans',Arial,sans-serif;font-size:14px;font-weight:600;line-height:1.714;text-transform:uppercase;letter-spacing:-.35px}.popover-content{padding:25px 30px 30px;color:#5d5d5d;font-family:Arial,sans-serif;font-size:14px;line-height:1.429}.popover>.arrow{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;border-width:11px;margin-left:0;overflow:visible}.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;content:none;z-index:9999;background:0 0;box-shadow:none;position:absolute;left:auto;top:auto;width:auto;height:auto;-webkit-transform:none;-ms-transform:none;transform:none;content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;left:auto;right:-11px;margin-top:-11px;border-right-width:0}.popover.left>.arrow:after{left:auto;right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.tinvwl-img-w-desc i{margin-right:20px}.tinvwl-img-w-desc h5{font-weight:600;text-transform:uppercase}.tinvwl-img-w-desc .tinvwl-desc{color:#4f4639}.tinvwl-img-w-desc h5+.tinvwl-desc{margin-top:2px}.tinvwl-premium-feat h2{font-size:48px;text-transform:uppercase;letter-spacing:-.025em;line-height:1;color:#3e3e3e}.tinvwl-premium-feat h3{font-size:16px;font-weight:600;text-transform:uppercase;letter-spacing:-.025em;color:#50504f}.tinvwl-premium-feat .tinvwl-feat-col-inner{padding:40px}.tinvwl-premium-feat .tinvwl-pic-col .tinvwl-feat-col-inner{text-align:center;padding-left:22px;padding-right:22px}.tinvwl-premium-feat .tinvwl-pic-col img{display:block;margin:0 auto}.tinvwl-premium-feat .tinvwl-pic-col .tinvwl-btn{margin-top:-35px}.tinvwl-premium-feat .tinvwl-features{margin-top:28px}.tinvwl-premium-feat .tinvwl-features li i{color:#96b100;margin-right:15px}.tinvwl-premium-feat .tinvwl-features li span{text-decoration:underline}.tinvwl-premium-feat .tinvwl-features li+li{margin-top:14px}.tinvwl-premium-feat .tinvwl-img-w-desc+.tinvwl-img-w-desc{margin-top:15px}.tinvwl-premium-feat .tinvwl-sup-col .tinvwl-feat-col-inner>.tinvwl-desc{line-height:1.71428571;text-align:center;margin-top:23px}.tinvwl-premium-feat .tinvwl-sup-col .tinvwl-feat-col-inner>.tinvwl-desc a{display:inline-block;text-decoration:underline;margin-top:26px;color:#000}#wpfooter{padding:10px 40px}#wpfooter p{font-family:"Open Sans","Helvetica Neue",sans-serif;font-size:14px;line-height:1.85714286;color:#4b4b4b}#wpfooter .ftinvwl-heart{margin:0 3px}#wpfooter .ftinvwl-star{font-size:12px;margin:0 1px}#wpfooter span .ftinvwl-star:first-of-type{margin-left:6px}#wpfooter span .ftinvwl-star:last-of-type{margin-left:3px}#wpfooter i{color:#ff5739}#wpfooter a{text-decoration:underline;color:#ff5739}#wpfooter a:active,#wpfooter a:focus,#wpfooter a:hover{color:#000}.tinvwl-color-picker{position:relative}.tinvwl-color-picker .iris-picker{position:absolute;z-index:9999}.tinvwl-color-picker input[type=text]{color:#fff;border:4px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.14)}.tinvwl-color-picker .tinvwl-eyedropper{cursor:pointer;position:relative;display:inline-block;vertical-align:top;margin-left:4px;width:42px;height:42px;background:#fff url(../img/color_icon.png) no-repeat center;border:1px solid rgba(0,0,0,.14);border-radius:2px;box-shadow:1px 2px 4px 0 rgba(0,0,0,.1)}.tinvwl-color-picker .tinvwl-eyedropper a{color:#6b625a}.tinvwl-color-picker .tinvwl-eyedropper i{display:inline-block;position:absolute;top:15px;left:14px;font-size:12px}.tinvwl-color-picker+.iris-picker .iris-square-value{width:0;height:0}.tinvwl-overlay{position:fixed;top:0;left:0;width:100%;height:100%;visibility:hidden;opacity:0;transition:opacity .3s ease,visibility .3s ease;background:#191919}.tinvwl-modal.tinvwl-modal-open .tinvwl-overlay{visibility:visible;opacity:.5}.admin-bar .tinvwl-content .tinvwl-modal{padding-top:32px!important}.tinvwl-content .tinvwl-modal{overflow-y:auto;overflow-x:hidden;top:0;left:0;width:0;height:0;z-index:9999;position:fixed;outline:0!important;-webkit-backface-visibility:hidden;visibility:hidden;opacity:0;text-align:left;transition:opacity .3s ease,visibility .3s ease}.tinvwl-content .tinvwl-modal .tinvwl-modal-inner{position:relative;margin:0 auto;background:#fff;border-radius:4px}.tinvwl-content .tinvwl-modal.tinvwl-modal-open{visibility:visible;opacity:1;width:100%;height:100%}@media screen and (max-width:782px){.admin-bar .tinvwl-content .tinvwl-modal{padding-top:46px!important}}@media screen and (max-width:600px){.admin-bar .tinvwl-content .tinvwl-modal{padding-top:0!important}}.tinvwl-modal .tinvwl-table{height:100%}.tinvwl-content .tinvwl-modal .tinvwl-modal-inner{max-width:415px;padding:40px 45px}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails{text-align:center}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails p{margin:0 0 26px}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails .tinvwl-btn.large{padding:14px 33px}.tinvwl-content .tinvwl-modal.tinvwl-send-promo-emails .tinvwl-btn+.tinvwl-btn{margin-left:6px}.tinvwl-quick-btns{position:fixed;top:25%;left:100%;z-index:9999}.tinvwl-quick-btns button{display:block;width:117px;font-size:14px;font-family:"Open Sans",Arial,sans-serif;font-weight:600;padding:0 35px 0 0;border-radius:2px;border:none;text-decoration:none;background:#96b100;color:#fff;-webkit-transform:translateX(-50px);-ms-transform:translateX(-50px);transform:translateX(-50px);transition:-webkit-transform .3s ease;transition:transform .3s ease}.tinvwl-panel.only-button .tinvwl-quick-btns .form-control{display:block;width:119px}.tinvwl-quick-btns button:hover{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}.tinvwl-quick-btns button+button{margin-top:4px}.tinvwl-quick-btns button span{display:inline-block;width:50px;padding:15px 0;text-align:center}@media (min-width:1200px){.tinvwl-empty-select+.tinvwl-input-group-btn{text-align:right}}.tinvwl-empty-select+.tinvwl-input-group-btn .tinvwl-btn{margin-left:0}.container,.container-fluid{margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.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,.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,.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,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{float:left;width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.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{float:left;width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.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{float:left;width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.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{float:left;width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}@media (max-width:1199px){.tinvwl-table .row>[class^=col-lg-]+[class^=col-lg-],.tinvwl-table .row>[class^=col-md-]+[class^=col-md-]{padding-top:30px}.tinvwl-table .form-group>[class^=col-lg-]+[class^=col-lg-],.tinvwl-table .form-group>[class^=col-md-]+[class^=col-md-]{padding-top:30px}}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-group{margin-bottom:23px}.form-control{display:block;width:100%}label.one-line{display:inline-block;margin-bottom:0;margin-right:10px}.control-label label{display:block;margin-bottom:10px}.form-horizontal .control-label label{padding-top:9px;margin-bottom:0}@media (min-width:1200px){.tinvwl-table .tinvwl-header-row label{margin-bottom:0}.tinvwl-table .tinvwl-header-row .form-group{margin-top:-7px;margin-bottom:13px}}@media (max-width:1199px){.form-horizontal .control-label label{margin-bottom:10px}.tinvwl-table .tinvwl-header-row label{padding-top:3px}}.tinvwl-input-group-btn{margin-top:13px}.tinvwl-input-group{position:relative;display:table;border-collapse:separate}.tinvwl-input-group-addon{width:1%;white-space:nowrap;vertical-align:middle}.tinvwl-input-group-btn{width:1%;white-space:nowrap;vertical-align:middle;margin-top:0;position:relative;white-space:nowrap}.tinvwl-input-group-btn .tinvwl-btn{margin-left:10px}.tinvwl-input-group-btn>.btn{position:relative}.tinvwl-input-group .form-control,.tinvwl-input-group-addon,.tinvwl-input-group-btn{display:table-cell}.tinvwl-input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}@media only screen and (max-width:1199px){.tinvwl-input-group:not(.tinvwl-no-full){display:block}.tinvwl-input-group:not(.tinvwl-no-full) .form-control{float:none}.tinvwl-input-group:not(.tinvwl-no-full) .form-control+.tinvwl-input-group-btn{padding-top:10px;padding-left:0}.tinvwl-input-group:not(.tinvwl-no-full) .form-control,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn{display:block}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn{margin-left:0}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>input{margin-left:0}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>input{margin-left:0}}.text-right{text-align:right}@media (max-width:1199px){.text-right{text-align:left}}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .tinvwl-input-group{display:inline-table;vertical-align:middle}.form-inline .tinvwl-input-group .form-control,.form-inline .tinvwl-input-group .tinvwl-input-group-addon,.form-inline .tinvwl-input-group .tinvwl-input-group-btn{width:auto}.form-inline .tinvwl-input-group>.form-control{width:100%}.form-inline .control-label label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.logo_heart{background:url(../img/logo_heart.png) no-repeat center;display:inline-block;background-size:54px 54px;width:54px;height:54px}.admin-rescue{background:url(../img/admin-rescue.png) no-repeat center;display:inline-block;background-size:61px 60px;width:61px;height:60px}.admin-update{background:url(../img/admin-update.png) no-repeat center;display:inline-block;background-size:61px 60px;width:61px;height:60px}.wizard_logo{background:url(../img/wizard_logo.png) no-repeat center;background-size:54px 54px;width:54px;height:54px;display:block;margin:10px auto}.wizard_setup{background:url(../img/wizard_setup.png) no-repeat center;display:inline-block;background-size:143px 144px;width:143px;height:144px}.premium_adv{background:url(../img/premium_adv.png) no-repeat center;display:block;margin:0 auto;background-size:365px 216px;width:365px;height:216px}.tinvwl-content select{background-size:13px 8px}.tinvwl-select+.tinvwl-caret span{background-size:13px 18px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover .tinvwl-chevron{background-size:20px 30px}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover .tinvwl-chevron{background-size:20px 30px}.tinvwl-color-picker .tinvwl-eyedropper{background-size:28px 29px}@media only screen and (-webkit-min-device-pixel-ratio:1.5),not all,not all,not all{.tinvwl-content select{background-image:url(../img/select_caret@2x.png)}.tinvwl-select+.tinvwl-caret span{background-image:url(../img/chevron_down@2x.png)}.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .prev-page:hover .tinvwl-chevron{background-image:url(../img/chevron_icon@2x.png)}.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page .tinvwl-chevron,.tinvwl-content .tablenav .tablenav-pages .pagination-links .next-page:hover .tinvwl-chevron{background-image:url(../img/chevron_icon@2x.png)}.tinvwl-color-picker .tinvwl-eyedropper{background-image:url(../img/color_icon@2x.png)}.logo_heart{background-image:url(../img/logo_heart@2x.png)}.admin-rescue{background-image:url(../img/admin-rescue@2x.png)}.admin-update{background-image:url(../img/admin-update@2x.png)}.wizard_logo{background-image:url(../img/wizard_logo@2x.png)}.wizard_setup{background-image:url(../img/wizard_setup@2x.png)}}#style_options .tinvwl-table tbody tr .tinvwl-inner h2{font-size:18px;color:#291c09;text-transform:capitalize;font-weight:600;margin-bottom:21px;padding:14px 0}
|
assets/css/bootstrap.min.css
CHANGED
@@ -1 +1,5 @@
|
|
1 |
-
.label,sub,sup{vertical-align:baseline}.btn,.btn-group,.btn-group-vertical,.caret,.checkbox-inline,.radio-inline,img{vertical-align:middle}hr,img{border:0}body,figure{margin:0}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.dropdown-menu{float:left}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.dropdown-menu,.modal-content{-webkit-background-clip:padding-box}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}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}.container{width:750px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{font-style:normal}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.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,.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,.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,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.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.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.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.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.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.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.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}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-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,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.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)}.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}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.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)}.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}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.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)}.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}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;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)}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.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)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.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}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;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}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.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}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.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;-webkit-box-shadow:none;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}}.progress-bar-striped,.progress-striped .progress-bar,.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:-o-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)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.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-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.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}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.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}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.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:#9d9d9d}.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}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.badge,.label{font-weight:700;line-height:1;white-space:nowrap;text-align:center}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-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}}.progress{height:20px;margin-bottom:20px;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)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-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;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{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)}.progress-striped .progress-bar-info,.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:-o-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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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)}.progress-bar-danger{background-color:#d9534f}.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:-o-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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;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)}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;text-align:left;text-align:start;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px}.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;text-align:left;text-align:start;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;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)}.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.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}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.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}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.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}.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}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before,.tinv-wishlist-clearfix:after,.tinv-wishlist-clearfix:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after,.tinv-wishlist-clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.3.6 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2015 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}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}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.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,.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,.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,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.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.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.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.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.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.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.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}}fieldset{min-width:0;padding:0;margin:0;border:0}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}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-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,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.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)}.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}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.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)}.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}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.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)}.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}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.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;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;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)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.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)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.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}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.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}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.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}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.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}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.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}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.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}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.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}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.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;-webkit-box-shadow:none;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-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;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@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-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.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}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.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:#9d9d9d}.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}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.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}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.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:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-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}}.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)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-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;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.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:-o-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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.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:-o-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)}.progress-bar-info{background-color:#5bc0de}.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:-o-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)}.progress-bar-warning{background-color:#f0ad4e}.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:-o-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)}.progress-bar-danger{background-color:#d9534f}.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:-o-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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;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)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;opacity:0;line-break:auto}.tooltip.in{opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;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);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.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}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.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}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.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);background-color:rgba(0,0,0,0);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.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}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.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)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before,.tinv-wishlist-clearfix:after,.tinv-wishlist-clearfix:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after,.tinv-wishlist-clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
|
assets/css/public.min.css
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
/*! WooCommerce Wishlist Plugin - version 1.8.
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
-
.ftinvwl,.icon_big_heart_check,.icon_big_times{font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@font-face{font-family:tinvwl-webfont;src:url(../fonts/tinvwl-webfont.eot?xu2uyi);src:url(../fonts/tinvwl-webfont.eot?xu2uyi#iefix) format("embedded-opentype"),url(../fonts/tinvwl-webfont.ttf?xu2uyi) format("truetype"),url(../fonts/tinvwl-webfont.woff?xu2uyi) format("woff"),url(../fonts/tinvwl-webfont.svg?xu2uyi#tinvwl-webfont) format("svg");font-weight:400;font-style:normal}.ftinvwl{font-family:tinvwl-webfont!important;speak:none;font-style:normal;line-height:1}.ftinvwl-twitter:before{content:"\f099"}.ftinvwl-facebook-f:before,.ftinvwl-facebook:before{content:"\f09a"}.ftinvwl-google:before{content:"\f0d5"}.ftinvwl-email:before{content:"\f0e0"}.ftinvwl-pinterest:before{content:"\f231"}.ftinvwl-star:before{content:"\e912"}.ftinvwl-shopping-cart:before{content:"\e913"}.ftinvwl-magic:before{content:"\e914"}.ftinvwl-info:before{content:"\e915"}.ftinvwl-graduation-cap:before{content:"\e918"}.ftinvwl-floppy-o:before{content:"\e919"}.ftinvwl-eyedropper:before{content:"\e91a"}.ftinvwl-exclamation-triangle:before{content:"\e91b"}.ftinvwl-check:before{content:"\e91e"}.ftinvwl-arrow-left:before{content:"\e91f"}.ftinvwl-wrench:before{content:"\e920"}.ftinvwl-chevron-down:before{content:"\e900"}.ftinvwl-chevron-right:before{content:"\e901"}.ftinvwl-chevron-left:before{content:"\e902"}.ftinvwl-chevron-up:before{content:"\e903"}.ftinvwl-cancel:before{content:"\e904"}.ftinvwl-times:before{content:"\e905"}.ftinvwl-heart-plus:before{content:"\e906"}.ftinvwl-heart-mark-right:before{content:"\e907"}.ftinvwl-heart2:before{content:"\e908"}.ftinvwl-heart-o:before{content:"\e909"}.ftinvwl-heart-mark-left:before{content:"\e90a"}.ftinvwl-heart-mail:before{content:"\e90b"}.ftinvwl-heart-tinv:before{content:"\e90c"}.ftinvwl-key:before{content:"\e90d"}.ftinvwl-lock:before{content:"\e90e"}.ftinvwl-hearts:before{content:"\e90f"}.ftinvwl-user:before{content:"\e910"}.tinv-wishlist form,.tinv-wishlist p:last-child,.tinv-wishlist table{margin-bottom:0}.tinv-wishlist *,.tinvwl-wishlist :after,.tinvwl-wishlist :before{box-sizing:border-box}.tinv-wishlist select{width:140px}.tinv-wishlist ul{list-style:none;margin:0;padding:0}.woocommerce.tinv-wishlist #respond input#submit.alt,.woocommerce.tinv-wishlist a.button.alt,.woocommerce.tinv-wishlist button.button.alt,.woocommerce.tinv-wishlist input.button.alt{text-align:center}.tinv-wishlist .button i,.tinv-wishlist .navigation-button a i,.tinv-wishlist input[type=button] i,.tinv-wishlist input[type=reset] i,.tinv-wishlist input[type=submit] i{margin-right:6px}.tinv-wishlist a.tinv-close-modal i{margin-right:0}a.wishlist_products_counter{text-decoration:none}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart:before,.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart:before,.woocommerce-page ul.products li.product a.button.tinvwl-icon-heart.tinvwl_add_to_wishlist_button:before,a.wishlist_products_counter.top_wishlist-heart:before{content:'\e909';display:inline-block;font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:20px;vertical-align:sub;margin-right:5px}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus:before,.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus:before,.woocommerce-page ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus:before,a.wishlist_products_counter.top_wishlist-heart-plus:before{content:'\e906';display:inline-block;font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:20px;vertical-align:sub;margin-right:5px}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.no-txt,.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart.no-txt,a.wishlist_products_counter.top_wishlist-heart-plus.no-txt{position:relative;width:36px;height:36px;vertical-align:sub}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.no-txt:before,.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart.no-txt:before{margin-top:-10px;margin-left:-10px;position:absolute;top:50%;left:50%;margin-right:0!important}.tinv-wishlist .button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.no-txt,.tinv-wishlist .button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart.no-txt{padding-left:1em;vertical-align:bottom}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart.tinvwl-product-in-list:before,.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart.tinvwl-product-in-list:before,.woocommerce-page ul.products li.product a.button.tinvwl-icon-heart.tinvwl_add_to_wishlist_button.tinvwl-product-in-list:before,a.wishlist_products_counter.top_wishlist-heart.wishlist-counter-with-products:before{content:'\e908'}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.tinvwl-product-in-list:before,.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.tinvwl-product-in-list:before,.woocommerce-page ul.products li.product a.button.tinvwl-icon-heart-plus.tinvwl_add_to_wishlist_button.tinvwl-product-in-list:before,a.wishlist_products_counter.top_wishlist-heart-plus.wishlist-counter-with-products:before{content:'\e907'}.tinv-wishlist .tinvwl_add_to_wishlist_button.icon-white:before,a.wishlist_products_counter.top_wishlist-white:before{color:#FFF}.tinv-wishlist .tinvwl_add_to_wishlist_button.icon-black:before,a.wishlist_products_counter.top_wishlist-black:before{color:#000}.tinv-wishlist.tinvwl-before-add-to-cart .tinvwl_add_to_wishlist_button{margin-bottom:15px}.tinv-wishlist.tinvwl-after-add-to-cart .tinvwl_add_to_wishlist_button{margin-top:15px}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-custom.no-txt,a.wishlist_products_counter.top_wishlist-custom.no-txt{padding:10px 11px;line-height:1}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-custom img,a.wishlist_products_counter.top_wishlist-custom img{display:inline-block!important;vertical-align:baseline;width:auto!important;max-width:16px;max-height:16px;margin-bottom:0;margin:0 6px 0 0!important}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-custom.no-txt img,a.wishlist_products_counter.top_wishlist-custom.no-txt img{margin-right:0!important}.single-product div.product form.cart .button.tinvwl_add_to_wishlist_button,div.product form.cart .tinvwl_add_to_wishlist_button{float:none}ul.products li.product .tinvwl_add_to_wishlist_button{margin-top:1em}.tinvwl_add_to_wishlist_button{display:inline-block;cursor:pointer}.tinv-wishlist.woocommerce .stock.in-stock:before{content:none}.tinv-wraper.tinv-wishlist{font-size:100%}.tinv-create-list li input[type=radio]{margin-right:10px}.tinv-create-list li+li{margin-top:15px}.tinv-create-list .tinvwl-input-group+ul{margin-top:25px}.tinv-search-list{margin-bottom:36px}.tinv-wishlist .tinv-header{margin-bottom:30px}.tinv-wishlist table{position:relative;table-layout:auto;margin-bottom:30px;z-index:2}.tinv-overlay,.tinv-wishlist .tinv-modal{top:0;left:0;position:fixed;transition:opacity .3s ease,visibility .3s ease}.tinv-wishlist table.tinvwl-table-manage-list{margin-bottom:27px;width:100%}.tinv-wishlist table input[type=checkbox]{margin-right:0}.tinv-wishlist table td,.tinv-wishlist table th{padding:1em;vertical-align:middle}.tinv-wishlist .tinvwl-table-manage-list .product-cb{width:35px;text-align:center}.tinv-wishlist .tinvwl-table-manage-list .product-remove{width:46px;text-align:center}.tinv-wishlist .product-remove button{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;margin:0 auto;width:27px;height:27px;border-radius:50%;padding:0;box-shadow:none;border:none;background-color:#f7f7f7;color:#000;font-size:20px;padding-left:3px}.tinv-wishlist .product-thumbnail{min-width:100px;width:100px}.tinv-wishlist .product-thumbnail .wp-post-image{margin-bottom:0}.tinv-wishlist td.product-name a+.variation{margin-top:2px}.tinv-wishlist .product-stock i{margin-right:15px}.tinv-wishlist .product-stock p{display:table}.tinv-wishlist .product-stock span{display:table-cell;vertical-align:middle}.tinv-wishlist .product-action>.button>i,.tinv-wishlist .tinvwl-table-manage-list .product-action button[name=tinvwl-remove],.tinv-wishlist table thead th .tinvwl-mobile{display:none}.tinv-wishlist.woocommerce .product-quantity{width:80px;text-align:center}.tinv-wishlist.woocommerce table .quantity .qty{max-width:100%;width:62px;text-align:left}.tinv-wishlist .product-action{width:135px;text-align:center}.tinv-wishlist .product-action .button{width:100%}.tinv-wishlist .product-action .tinvwl_move_product_button{margin-top:5px}.tinv-wishlist .tinvwl-table-manage-list .product-action>button[name=tinvwl-remove]>i{margin-right:0}.tinv-wishlist .wishlist-cb{width:33px;text-align:center}.tinv-wishlist .wishlist-name .tinvwl-rename-input input{width:100%}.tinv-wishlist .wishlist-name .tinvwl-rename-button{float:right}.tinv-wishlist .wishlist-name .tinvwl-rename-button>i{margin-right:10px}.tinv-wishlist .wishlist-privacy,.tinv-wishlist table:not(.tinvwl-public) .wishlist-date{width:18%}.tinv-wishlist .wishlist-privacy select{width:100%}.tinv-wishlist .wishlist-name{width:45%}.tinv-wishlist .wishlist-action{width:120px;text-align:center}.tinv-wishlist .wishlist-action button[value=manage_remove]>i{display:none;margin-right:0}.tinv-wishlist tfoot .tinvwl-to-right .tinv-create-list{display:inline-block;vertical-align:middle}.tinv-wishlist tfoot .tinvwl-to-right .tinv-create-list>a.button{margin-right:0}.tinv-wishlist tfoot .tinvwl-to-left+.tinvwl-to-right{margin-top:-10px}.tinv-wishlist tfoot .tinvwl-to-left:not(:empty){float:left;width:35%;margin-right:2%}.tinv-wishlist tfoot .tinvwl-to-right{float:left;width:63%;text-align:right}.tinv-wishlist tfoot .tinvwl-to-right>*{margin:10px 0 0;vertical-align:middle}.tinv-wishlist tfoot .tinvwl-to-right>*+*{margin-left:10px}.tinv-wishlist tfoot .tinvwl-to-left:empty+.tinvwl-to-right{width:100%}.tinv-wishlist .social-buttons+.tinv-wishlist-clear+.navigation-button{margin-top:16px}.tinv-wishlist .navigation-button{margin-top:-10px}.tinv-wishlist .navigation-button>li{float:left}.tinv-wishlist .navigation-button>li>.tinv-create-list>a,.tinv-wishlist .navigation-button>li>a{margin-right:30px;margin-top:10px;display:inline-block}.tinv-wishlist .navigation-button>li>.tinv-create-list>a.button,.tinv-wishlist .navigation-button>li>a.button{margin-right:10px}.tinv-wishlist .navigation-button>li:last-child>.tinv-create-list>a,.tinv-wishlist .navigation-button>li:last-child>a{margin-right:0}.tinv-wishlist .social-buttons{float:right}.tinv-wishlist .social-buttons>span,.tinv-wishlist .social-buttons>ul{display:inline-block;vertical-align:middle}.tinv-wishlist .social-buttons>span{margin-right:27px}.tinv-wishlist .social-buttons li{float:left;margin-right:5px;list-style:none}.tinv-wishlist .social-buttons li:last-child{margin-right:0}.tinv-wishlist .social-buttons li a{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:2em;height:2em;border-radius:50%;text-align:center;box-shadow:none;border:0;font-size:20px}.tinv-wishlist .social-buttons li a.white{color:#fff}.tinv-wishlist .social-buttons li a.dark{color:#000}.tinv-wishlist .social-buttons li a i{line-height:2em}.tinv-wishlist .navigation-button .tinv-create-list>a.tinvwl-no-icon>i,.tinv-wishlist .navigation-button li>a.tinvwl-no-icon>i{display:none}.tinv-wishlist .tinv-next,.tinv-wishlist .tinv-prev{display:inline-block;float:left}.tinv-wishlist .tinv-lists-nav{margin-bottom:35px}.tinv-wishlist .tinv-prev{margin-right:35px!important}.tinv-wishlist .tinv-prev i{margin-left:0;margin-right:18px}.tinv-wishlist .tinv-next i{margin-left:18px;margin-right:0}@media only screen and (max-width:1024px){.tinv-wishlist .tinvwl-table-manage-lists:not(.tinvwl-public){margin-top:0}.tinv-wishlist .tinvwl-table-manage-list .product-remove{display:none}.tinv-wishlist .tinvwl-table-manage-list .product-action button[name=tinvwl-remove]{display:inline-block;margin-top:5px}.tinv-wishlist .product-action{width:60px}}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist .tinvwl-table-manage-list td.product-stock p{display:block;text-align:center}.tinv-wishlist .product-stock span{display:block}.tinv-wishlist .tinvwl-table-manage-list td.product-stock i{margin-right:0}.tinv-wishlist .tinvwl-table-manage-list td.product-stock .tinvwl-txt{display:none}.tinv-wishlist .product-thumbnail{max-width:76px;width:76px}.tinv-wishlist .product-action .button>i{display:inline-block;margin-right:0}.tinv-wishlist .product-action .button .tinvwl-txt{display:none}}@media only screen and (max-width:640px){.tinv-wishlist table.tinvwl-table-manage-list tbody td.product-remove,.tinv-wishlist table.tinvwl-table-manage-list thead th:not(.product-name),.tinv-wishlist table.tinvwl-table-manage-lists thead th:not(.wishlist-name),.tinv-wishlist thead th .tinvwl-full{display:none}.tinv-wishlist table.tinvwl-table-manage-list thead th.product-name,.tinv-wishlist table.tinvwl-table-manage-lists thead th.wishlist-name{display:block;width:100%;text-align:center}.tinv-wishlist table thead th .tinvwl-mobile{display:block}.tinv-wishlist table.tinvwl-table-manage-list tbody td,.tinv-wishlist table.tinvwl-table-manage-lists tbody td,.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td{display:block;width:100%!important;text-align:center}.tinv-wishlist table.tinvwl-table-manage-list tbody td:not(:last-child),.tinv-wishlist table.tinvwl-table-manage-lists tbody td:not(:last-child),.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td:not(:last-child){border-bottom:0}.tinv-wishlist .product-stock p{margin:0 auto}.tinv-wishlist .product-thumbnail img{margin:0 auto;max-width:80px}.tinv-wishlist.woocommerce table .quantity .qty{text-align:center;width:100%}.tinv-wishlist .product-action .tinvwl_move_product_button{margin-top:10px}.tinv-wishlist table.tinvwl-table-manage-list tfoot td{display:block;width:100%}.tinv-wishlist table.tinvwl-table-manage-lists .wishlist-action button[value=manage_remove]{width:100%}.tinv-wishlist table.tinvwl-table-manage-lists .wishlist-name .tinvwl-rename-button{float:none}}@media only screen and (max-width:1024px){.tinv-wishlist .wishlist-name .tinvwl-rename-button>i,.tinv-wishlist tfoot .tinvwl-to-left:not(:empty){margin-right:0}.tinv-wishlist .wishlist-name .tinvwl-rename-button span{display:none}.tinv-wishlist .wishlist-action{width:60px}.tinv-wishlist tfoot .tinvwl-to-left:not(:empty){float:none;width:auto}.tinv-wishlist tfoot .tinvwl-to-right{float:none;width:auto;text-align:left}}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist .wishlist-action button[value=manage_remove] span{display:none}.tinv-wishlist .wishlist-action button[value=manage_remove]>i{display:inline-block}.tinv-wishlist tfoot .tinvwl-to-left+.tinvwl-to-right{margin-top:0}}@media only screen and (max-width:640px){.tinv-wishlist button[value=manage_apply] .tinvwl-mobile,.tinv-wishlist button[value=product_apply] .tinvwl-mobile{display:none}.tinv-wishlist tfoot .tinvwl-to-right .tinv-create-list{display:block}.tinv-wishlist .tinvwl-table-manage-list tfoot .tinvwl-to-right .button,.tinv-wishlist .tinvwl-table-manage-list tfoot .tinvwl-to-right button,.tinv-wishlist .tinvwl-table-manage-lists tfoot .tinvwl-to-right .button,.tinv-wishlist .tinvwl-table-manage-lists tfoot .tinvwl-to-right button{width:100%;margin:10px 0 0}.tinv-wishlist tfoot .tinvwl-to-right>*{margin:10px 0 0}.tinv-wishlist tfoot .tinvwl-to-right .button:first-child,.tinv-wishlist tfoot .tinvwl-to-right button:first-child{margin-top:0!important}.tinv-wishlist tfoot .tinvwl-to-left+.tinvwl-to-right{margin-top:20px}}@media only screen and (max-width:1024px){.tinv-wishlist .social-buttons{float:none;width:auto;text-align:left;margin-top:20px}.tinv-wishlist .social-buttons+.tinv-wishlist-clear+.navigation-button{margin-top:30px}.tinv-wishlist .tinv-login form input[name=login]{min-width:auto}}@media only screen and (max-width:640px){.tinv-wishlist .social-buttons{text-align:center}.tinv-wishlist .navigation-button>li{width:20%;text-align:center}.tinv-wishlist .navigation-button.tinvwl-btns-count-1>li{width:100%}.tinv-wishlist .navigation-button.tinvwl-btns-count-2>li{width:50%}.tinv-wishlist .navigation-button.tinvwl-btns-count-3>li{width:33%}.tinv-wishlist .navigation-button.tinvwl-btns-count-4>li{width:25%}.tinv-wishlist .navigation-button>li+li{width:20%}.tinv-wishlist .navigation-button.tinvwl-btns-count-1>li+li{width:100%}.tinv-wishlist .navigation-button.tinvwl-btns-count-2>li+li{width:50%}.tinv-wishlist .navigation-button.tinvwl-btns-count-3>li+li{width:33%}.tinv-wishlist .navigation-button.tinvwl-btns-count-4>li+li{width:25%}.tinv-wishlist .navigation-button>li>.tinv-create-list>a,.tinv-wishlist .navigation-button>li>a{width:calc(100% - 10px);margin-right:0}.tinv-wishlist .navigation-button .tinv-create-list>a .tinvwl-txt,.tinv-wishlist .navigation-button li>a .tinvwl-txt{display:none}.tinv-wishlist .navigation-button .tinv-create-list>a>i,.tinv-wishlist .navigation-button li>a>i{display:inline-block!important;margin-right:0}.tinv-wishlist .social-buttons>span{display:block;margin-top:0;margin-right:0;margin-bottom:5px}}@media only screen and (max-width:667px){.tinv-wishlist.woocommerce .tinv-login form .form-row-first,.tinv-wishlist.woocommerce .tinv-login form .form-row-last{float:none;width:100%}.tinv-wishlist.woocommerce .tinv-login form .form-row-first{padding:0}.tinv-wishlist.woocommerce .tinv-login form .form-row-last{padding:0;margin-top:10px}.tinv-wishlist.woocommerce .tinv-login form .tinvwl-input-group-btn{display:block;padding:0;width:auto;margin-top:10px}}.tinv-overlay{width:100%;height:100%;visibility:hidden;opacity:0;background:#191919}.tinv-modal.tinv-modal-open .tinv-overlay{visibility:visible;opacity:.5}.admin-bar .tinv-wishlist .tinv-modal{padding-top:32px!important}.tinv-wishlist .tinv-modal{overflow-y:auto;overflow-x:hidden;width:0;height:0;z-index:9999;outline:0!important;-webkit-backface-visibility:hidden;visibility:hidden;opacity:0;text-align:left}.tinv-wishlist .tinv-modal .tinv-modal-inner{position:relative;margin:0 auto;background-color:#fff;max-width:360px;padding:40px}.tinv-wishlist .tinv-modal.tinv-modal-open{visibility:visible;opacity:1;width:100%;height:100%}.tinv-wishlist .tinv-modal .tinv-close-modal{display:inline-block;position:absolute;top:17px;right:14px;width:26px;height:26px;line-height:26px;font-size:12px;text-align:center;border-radius:50%;border-bottom:0;box-shadow:none!important;background-color:#ebe9eb}.tinv-wishlist .tinv-modal .icon_big_heart_check,.tinv-wishlist .tinv-modal .icon_big_times,.tinv-wishlist .tinv-modal img{display:block;margin:0 auto;margin-bottom:25px;opacity:1!important}.tinv-wishlist .tinv-modal ul{overflow:visible;list-style:disc;margin:10px 0 0 20px}.tinv-wishlist .tinv-modal li{list-style:disc!important}.tinv-wishlist .tinv-create-list .tinv-modal ul,.tinv-wishlist.tinv-create-list form ul{list-style:none!important;margin:25px 0 0}.tinv-wishlist .tinv-create-list .tinv-modal li,.tinv-wishlist.tinv-create-list form li{list-style:none!important}.tinv-wishlist .tinv-modal .already-in{margin-bottom:35px}.tinv-wishlist .tinv-modal .delete-notification{margin-bottom:25px}.tinv-wishlist .tinv-modal .already-in ul{overflow:visible;margin:12px 0 27px 17px}.tinv-wishlist .tinv-modal select{width:100%}.tinv-wishlist .tinv-modal button+.button,.tinv-wishlist .tinv-modal button+button,.tinv-wishlist .tinv-modal input+button,.tinv-wishlist .tinv-modal label+button,.tinv-wishlist .tinv-modal label+input,.tinv-wishlist .tinv-modal select+button,.tinv-wishlist .tinv-modal select+input{margin-top:12px;width:100%}@media screen and (max-width:782px){.admin-bar .tinv-wishlist .tinv-modal{padding-top:46px!important}}@media screen and (max-width:600px){.admin-bar .tinv-wishlist .tinv-modal{padding-top:0!important}.tinv-wishlist .tinv-modal .tinv-close-modal{position:static;display:block;margin:0 auto 20px}}.tinv-wishlist .tinv-modal .already-in+label{display:block;margin-top:6px}.tinv-wishlist .tinv-modal label select{margin-top:8px}.tinv-wishlist .tinv-modal .delete-notification+button{width:100%}.tinv-wishlist .tinvwl_added_to_wishlist,.tinv-wishlist .tinvwl_created_wishlist{text-align:center}.tinv-wishlist .tinvwl_added_to_wishlist .tinv-txt,.tinv-wishlist .tinvwl_created_wishlist .tinv-txt{margin-bottom:25px}.tinv-wishlist .tinvwl_created_wishlist button,.woocommerce .tinv-wishlist .tinvwl_added_to_wishlist.tinv-modal button.button{margin-top:0;margin-bottom:10px}.tinv-wishlist .tinv-modal .tinvwl-buttons-group{margin-top:20px}.tinv-wishlist .tinvwl-buttons-group button{width:100%}.tinv-wishlist .tinvwl-buttons-group button+button{margin-top:7px}.tinv-wishlist .tinvwl-buttons-group button i{position:relative}.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-heart-o,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-key,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-times{font-size:20px}.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-heart-o::before,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-key::before,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-times::before{position:relative;top:3px}.tinv-wishlist .tinvwl-buttons-group+button{width:100%;margin-top:7px}.tinv-wishlist .tinv-modal h2{text-align:center;margin:0 0 35px}.tinv-wishlist .tinv-create-list .tinv-modal-inner{max-width:778px;padding:30px}.tinv-wishlist .tinvwl-has-error:not(.tinvwl-input-group),.tinv-wishlist .tinvwl-input-group.tinvwl-has-error .form-control{border:2px solid red}.tinv-wishlist .tinvwl-has-error+.tinvwl-error{padding:5px 0 0 5px;color:red}.tinvwl-tooltip{display:none}.tinvwl-input-group{position:relative;display:table;border-collapse:separate}.tinvwl-input-group .form-control{position:relative;z-index:1;float:left;height:38px;width:100%;margin-bottom:0}.tinvwl-input-group .form-control+.tinvwl-input-group-btn{padding-left:15px}.tinv-wishlist .tinvwl-to-left .tinvwl-input-group .form-control+.tinvwl-input-group-btn{padding-left:10px}.tinv-wishlist .tinv-search-form .tinvwl-input-group .form-control+.tinvwl-input-group-btn{padding-left:9px}.tinvwl-input-group .form-control,.tinvwl-input-group-addon,.tinvwl-input-group-btn{display:table-cell}.tinvwl-input-group-addon,.tinvwl-input-group-btn{width:1%;white-space:nowrap;vertical-align:top}@media only screen and (max-width:640px){.navigation-button,.social-buttons,.tinv-lists-nav{margin-left:12px;margin-right:12px}.tinvwl-input-group{width:100%}}@media only screen and (max-width:667px){.tinvwl-input-group:not(.tinvwl-no-full),.tinvwl-input-group:not(.tinvwl-no-full) .form-control,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn{display:block}.tinvwl-input-group:not(.tinvwl-no-full) .form-control{float:none}.tinv-wishlist .tinv-search-form .tinvwl-input-group:not(.tinvwl-no-full) .form-control+.tinvwl-input-group-btn,.tinvwl-input-group:not(.tinvwl-no-full) .form-control+.tinvwl-input-group-btn{padding-top:10px;padding-left:0}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>input,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>input{width:100%}}.tinv-table{display:table;width:100%;height:100%}.tinv-cell{display:table-cell;vertical-align:middle}.tinv-wishlist-clear:after,.tinv-wishlist-clear:before{content:" ";display:table}.tinv-wishlist .tinv-wishlist-clear{visibility:visible;width:auto;height:auto}.tinv-wishlist-clear:after{clear:both}.icon_big_heart_check,.icon_big_times{display:inline-block;width:46px;height:46px;font-family:tinvwl-webfont!important;speak:none;font-style:normal;line-height:1;font-size:60px}.icon_big_times::before{content:"\e904";top:-7px;left:-7px;position:relative}.icon_big_heart_check::before{content:"\e90a";top:-7px;left:-7px;position:relative}.tinvwl_add_to_wishlist_button.button.disabled-add-wishlist,.tinvwl_add_to_wishlist_button.disabled-add-wishlist{opacity:.5!important;cursor:not-allowed}.empty-name-wishlist{border-color:red!important}.tinvwl_remove_from_wishlist-text{display:none}.tinvwl-product-in-list.tinvwl-product-make-remove .tinvwl_remove_from_wishlist-text{display:inline}.tinvwl-product-in-list.tinvwl-product-make-remove .tinvwl_add_to_wishlist-text{display:none}@media only screen and (max-width:1024px){.tinv-wishlist .tinvwl-table-manage-list .product-remove{display:table-cell}}@media only screen and (max-width:640px){.tinv-wishlist table.tinvwl-table-manage-list tbody td.product-remove{display:block}}
|
1 |
+
/*! WooCommerce Wishlist Plugin - version 1.8.4
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
+
@font-face{font-family:tinvwl-webfont;src:url(../fonts/tinvwl-webfont.eot?xu2uyi);src:url(../fonts/tinvwl-webfont.eot?xu2uyi#iefix) format("embedded-opentype"),url(../fonts/tinvwl-webfont.ttf?xu2uyi) format("truetype"),url(../fonts/tinvwl-webfont.woff?xu2uyi) format("woff"),url(../fonts/tinvwl-webfont.svg?xu2uyi#tinvwl-webfont) format("svg");font-weight:400;font-style:normal}.ftinvwl{font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ftinvwl-twitter:before{content:"\f099"}.ftinvwl-facebook:before{content:"\f09a"}.ftinvwl-facebook-f:before{content:"\f09a"}.ftinvwl-google:before{content:"\f0d5"}.ftinvwl-email:before{content:"\f0e0"}.ftinvwl-pinterest:before{content:"\f231"}.ftinvwl-star:before{content:"\e912"}.ftinvwl-shopping-cart:before{content:"\e913"}.ftinvwl-magic:before{content:"\e914"}.ftinvwl-info:before{content:"\e915"}.ftinvwl-graduation-cap:before{content:"\e918"}.ftinvwl-floppy-o:before{content:"\e919"}.ftinvwl-eyedropper:before{content:"\e91a"}.ftinvwl-exclamation-triangle:before{content:"\e91b"}.ftinvwl-check:before{content:"\e91e"}.ftinvwl-arrow-left:before{content:"\e91f"}.ftinvwl-wrench:before{content:"\e920"}.ftinvwl-chevron-down:before{content:"\e900"}.ftinvwl-chevron-right:before{content:"\e901"}.ftinvwl-chevron-left:before{content:"\e902"}.ftinvwl-chevron-up:before{content:"\e903"}.ftinvwl-cancel:before{content:"\e904"}.ftinvwl-times:before{content:"\e905"}.ftinvwl-heart-plus:before{content:"\e906"}.ftinvwl-heart-mark-right:before{content:"\e907"}.ftinvwl-heart2:before{content:"\e908"}.ftinvwl-heart-o:before{content:"\e909"}.ftinvwl-heart-mark-left:before{content:"\e90a"}.ftinvwl-heart-mail:before{content:"\e90b"}.ftinvwl-heart-tinv:before{content:"\e90c"}.ftinvwl-key:before{content:"\e90d"}.ftinvwl-lock:before{content:"\e90e"}.ftinvwl-hearts:before{content:"\e90f"}.ftinvwl-user:before{content:"\e910"}.tinv-wishlist form,.tinv-wishlist p:last-child,.tinv-wishlist table{margin-bottom:0}.tinv-wishlist *{box-sizing:border-box}.tinvwl-wishlist :after,.tinvwl-wishlist :before{box-sizing:border-box}.tinv-wishlist select{width:140px}.tinv-wishlist ul{list-style:none;margin:0;padding:0}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.no-txt:before,.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart.no-txt:before{margin-top:-10px;margin-left:-10px}.woocommerce.tinv-wishlist #respond input#submit.alt,.woocommerce.tinv-wishlist a.button.alt,.woocommerce.tinv-wishlist button.button.alt,.woocommerce.tinv-wishlist input.button.alt{text-align:center}.tinv-wishlist .button i,.tinv-wishlist .navigation-button a i{margin-right:6px}.tinv-wishlist input[type=button] i,.tinv-wishlist input[type=reset] i,.tinv-wishlist input[type=submit] i{margin-right:6px}.tinv-wishlist a.tinv-close-modal i{margin-right:0}a.wishlist_products_counter{text-decoration:none}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart:before,.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart:before,.woocommerce-page ul.products li.product a.button.tinvwl-icon-heart.tinvwl_add_to_wishlist_button:before,a.wishlist_products_counter.top_wishlist-heart:before{content:'\e909';display:inline-block;font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:20px;vertical-align:sub;margin-right:5px}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus:before,.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus:before,.woocommerce-page ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus:before,a.wishlist_products_counter.top_wishlist-heart-plus:before{content:'\e906';display:inline-block;font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:20px;vertical-align:sub;margin-right:5px}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.no-txt,.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart.no-txt{position:relative;width:36px;height:36px;vertical-align:sub}a.wishlist_products_counter.top_wishlist-heart-plus.no-txt{position:relative;width:36px;height:36px;vertical-align:sub}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.no-txt:before,.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart.no-txt:before{position:absolute;top:50%;left:50%;margin-right:0!important}.tinv-wishlist .button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.no-txt,.tinv-wishlist .button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart.no-txt{padding-left:1em;vertical-align:bottom}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart.tinvwl-product-in-list:before{content:'\e908'}.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart.tinvwl-product-in-list:before,.woocommerce-page ul.products li.product a.button.tinvwl-icon-heart.tinvwl_add_to_wishlist_button.tinvwl-product-in-list:before,a.wishlist_products_counter.top_wishlist-heart.wishlist-counter-with-products:before{content:'\e908'}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.tinvwl-product-in-list:before,.woocommerce ul.products li.product a.button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus.tinvwl-product-in-list:before,.woocommerce-page ul.products li.product a.button.tinvwl-icon-heart-plus.tinvwl_add_to_wishlist_button.tinvwl-product-in-list:before,a.wishlist_products_counter.top_wishlist-heart-plus.wishlist-counter-with-products:before{content:'\e907'}.tinv-wishlist .tinvwl_add_to_wishlist_button.icon-white:before,a.wishlist_products_counter.top_wishlist-white:before{color:#fff}.tinv-wishlist .tinvwl_add_to_wishlist_button.icon-black:before,a.wishlist_products_counter.top_wishlist-black:before{color:#000}.tinv-wishlist.tinvwl-before-add-to-cart .tinvwl_add_to_wishlist_button{margin-bottom:15px}.tinv-wishlist.tinvwl-after-add-to-cart .tinvwl_add_to_wishlist_button{margin-top:15px}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-custom.no-txt{padding:10px 11px;line-height:1}a.wishlist_products_counter.top_wishlist-custom.no-txt{padding:10px 11px;line-height:1}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-custom img,a.wishlist_products_counter.top_wishlist-custom img{display:inline-block!important;vertical-align:baseline;width:auto!important;max-width:16px;max-height:16px;margin-bottom:0;margin:0 6px 0 0!important}.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-custom.no-txt img,a.wishlist_products_counter.top_wishlist-custom.no-txt img{margin-right:0!important}.single-product div.product form.cart .button.tinvwl_add_to_wishlist_button,div.product form.cart .tinvwl_add_to_wishlist_button{float:none}ul.products li.product .tinvwl_add_to_wishlist_button{margin-top:1em}.tinvwl_add_to_wishlist_button{display:inline-block;cursor:pointer}.tinv-wishlist.woocommerce .stock.in-stock:before{content:none}.tinv-wraper.tinv-wishlist{font-size:100%}.tinv-create-list li input[type=radio]{margin-right:10px}.tinv-create-list li+li{margin-top:15px}.tinv-create-list .tinvwl-input-group+ul{margin-top:25px}.tinv-search-list{margin-bottom:36px}.tinv-wishlist .tinv-header{margin-bottom:30px}.tinv-wishlist table{position:relative;table-layout:auto;margin-bottom:30px;z-index:2}.tinv-overlay{top:0;left:0;position:fixed;transition:opacity .3s ease,visibility .3s ease}.tinv-wishlist .tinv-modal{top:0;left:0;position:fixed;transition:opacity .3s ease,visibility .3s ease}.tinv-wishlist table.tinvwl-table-manage-list{margin-bottom:27px;width:100%}.tinv-wishlist table input[type=checkbox]{margin-right:0}.tinv-wishlist table td,.tinv-wishlist table th{padding:1em;vertical-align:middle}.tinv-wishlist .tinvwl-table-manage-list .product-cb{width:35px;text-align:center}.tinv-wishlist .tinvwl-table-manage-list .product-remove{width:46px;text-align:center}.tinv-wishlist .product-remove button{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;margin:0 auto;width:27px;height:27px;border-radius:50%;padding:0;box-shadow:none;border:none;background-color:#f7f7f7;color:#000;font-size:20px;padding-left:3px}.tinv-wishlist .product-thumbnail{min-width:100px;width:100px}.tinv-wishlist .product-thumbnail .wp-post-image{margin-bottom:0}.tinv-wishlist td.product-name a+.variation{margin-top:2px}.tinv-wishlist .product-stock i{margin-right:15px}.tinv-wishlist .product-stock p{display:table}.tinv-wishlist .product-stock span{display:table-cell;vertical-align:middle}.tinv-wishlist .product-action>.button>i,.tinv-wishlist .tinvwl-table-manage-list .product-action button[name=tinvwl-remove],.tinv-wishlist table thead th .tinvwl-mobile{display:none}.tinv-wishlist.woocommerce .product-quantity{width:80px;text-align:center}.tinv-wishlist.woocommerce table .quantity .qty{max-width:100%;width:62px;text-align:left}.tinv-wishlist .product-action{width:135px;text-align:center}.tinv-wishlist .product-action .button{width:100%}.tinv-wishlist .product-action .tinvwl_move_product_button{margin-top:5px}.tinv-wishlist .tinvwl-table-manage-list .product-action>button[name=tinvwl-remove]>i{margin-right:0}.tinv-wishlist .wishlist-cb{width:33px;text-align:center}.tinv-wishlist .wishlist-name .tinvwl-rename-input input{width:100%}.tinv-wishlist .wishlist-name .tinvwl-rename-button{float:right}.tinv-wishlist .wishlist-name .tinvwl-rename-button>i{margin-right:10px}.tinv-wishlist .wishlist-privacy,.tinv-wishlist table:not(.tinvwl-public) .wishlist-date{width:18%}.tinv-wishlist .wishlist-privacy select{width:100%}.tinv-wishlist .wishlist-name{width:45%}.tinv-wishlist .wishlist-action{width:120px;text-align:center}.tinv-wishlist .wishlist-action button[value=manage_remove]>i{display:none;margin-right:0}.tinv-wishlist tfoot .tinvwl-to-right .tinv-create-list{display:inline-block;vertical-align:middle}.tinv-wishlist tfoot .tinvwl-to-right .tinv-create-list>a.button{margin-right:0}.tinv-wishlist tfoot .tinvwl-to-left+.tinvwl-to-right{margin-top:-10px}.tinv-wishlist tfoot .tinvwl-to-left:not(:empty){float:left;width:35%;margin-right:2%}.tinv-wishlist tfoot .tinvwl-to-right{float:left;width:63%;text-align:right}.tinv-wishlist tfoot .tinvwl-to-right>*{margin:10px 0 0;vertical-align:middle}.tinv-wishlist tfoot .tinvwl-to-right>*+*{margin-left:10px}.tinv-wishlist tfoot .tinvwl-to-left:empty+.tinvwl-to-right{width:100%}.tinv-wishlist .social-buttons+.tinv-wishlist-clear+.navigation-button{margin-top:16px}.tinv-wishlist .navigation-button{margin-top:-10px}.tinv-wishlist .navigation-button>li{float:left}.tinv-wishlist .navigation-button>li>.tinv-create-list>a,.tinv-wishlist .navigation-button>li>a{margin-right:30px;margin-top:10px;display:inline-block}.tinv-wishlist .navigation-button>li>.tinv-create-list>a.button,.tinv-wishlist .navigation-button>li>a.button{margin-right:10px}.tinv-wishlist .navigation-button>li:last-child>.tinv-create-list>a,.tinv-wishlist .navigation-button>li:last-child>a{margin-right:0}.tinv-wishlist .social-buttons{float:right}.tinv-wishlist .social-buttons>span,.tinv-wishlist .social-buttons>ul{display:inline-block;vertical-align:middle}.tinv-wishlist .social-buttons>span{margin-right:27px}.tinv-wishlist .social-buttons li{float:left;margin-right:5px;list-style:none}.tinv-wishlist .social-buttons li:last-child{margin-right:0}.tinv-wishlist .social-buttons li a{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:2em;height:2em;border-radius:50%;text-align:center;box-shadow:none;border:0;font-size:20px}.tinv-wishlist .social-buttons li a.white{color:#fff}.tinv-wishlist .social-buttons li a.dark{color:#000}.tinv-wishlist .social-buttons li a i{line-height:2em}.tinv-wishlist .navigation-button .tinv-create-list>a.tinvwl-no-icon>i,.tinv-wishlist .navigation-button li>a.tinvwl-no-icon>i{display:none}.tinv-wishlist .tinv-lists-nav{margin-bottom:35px}.tinv-wishlist .tinv-next{display:inline-block;float:left}.tinv-wishlist .tinv-prev{display:inline-block;float:left;margin-right:35px!important}.tinv-wishlist .tinv-prev i{margin-left:0;margin-right:18px}.tinv-wishlist .tinv-next i{margin-left:18px;margin-right:0}@media only screen and (max-width:1024px){.tinv-wishlist .tinvwl-table-manage-lists:not(.tinvwl-public){margin-top:0}.tinv-wishlist .tinvwl-table-manage-list .product-remove{display:none}.tinv-wishlist .tinvwl-table-manage-list .product-action button[name=tinvwl-remove]{display:inline-block;margin-top:5px}.tinv-wishlist .product-action{width:60px}}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist .tinvwl-table-manage-list td.product-stock p{display:block;text-align:center}.tinv-wishlist .product-stock span{display:block}.tinv-wishlist .tinvwl-table-manage-list td.product-stock i{margin-right:0}.tinv-wishlist .tinvwl-table-manage-list td.product-stock .tinvwl-txt{display:none}.tinv-wishlist .product-thumbnail{max-width:76px;width:76px}.tinv-wishlist .product-action .button>i{display:inline-block;margin-right:0}.tinv-wishlist .product-action .button .tinvwl-txt{display:none}}@media only screen and (max-width:640px){.tinv-wishlist table.tinvwl-table-manage-list tbody td.product-remove,.tinv-wishlist table.tinvwl-table-manage-list thead th:not(.product-name){display:none}.tinv-wishlist table.tinvwl-table-manage-lists thead th:not(.wishlist-name){display:none}.tinv-wishlist thead th .tinvwl-full{display:none}.tinv-wishlist table.tinvwl-table-manage-list thead th.product-name,.tinv-wishlist table.tinvwl-table-manage-lists thead th.wishlist-name{display:block;width:100%;text-align:center}.tinv-wishlist table thead th .tinvwl-mobile{display:block}.tinv-wishlist table.tinvwl-table-manage-list tbody td{display:block;width:100%!important;text-align:center}.tinv-wishlist table.tinvwl-table-manage-lists tbody td,.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td{display:block;width:100%!important;text-align:center}.tinv-wishlist table.tinvwl-table-manage-list tbody td:not(:last-child){border-bottom:0}.tinv-wishlist table.tinvwl-table-manage-lists tbody td:not(:last-child),.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td:not(:last-child){border-bottom:0}.tinv-wishlist .product-stock p{margin:0 auto}.tinv-wishlist .product-thumbnail img{margin:0 auto;max-width:80px}.tinv-wishlist.woocommerce table .quantity .qty{text-align:center;width:100%}.tinv-wishlist .product-action .tinvwl_move_product_button{margin-top:10px}.tinv-wishlist table.tinvwl-table-manage-list tfoot td{display:block;width:100%}.tinv-wishlist table.tinvwl-table-manage-lists .wishlist-action button[value=manage_remove]{width:100%}.tinv-wishlist table.tinvwl-table-manage-lists .wishlist-name .tinvwl-rename-button{float:none}}@media only screen and (max-width:1024px){.tinv-wishlist .wishlist-name .tinvwl-rename-button>i,.tinv-wishlist tfoot .tinvwl-to-left:not(:empty){margin-right:0}.tinv-wishlist .wishlist-name .tinvwl-rename-button span{display:none}.tinv-wishlist .wishlist-action{width:60px}.tinv-wishlist tfoot .tinvwl-to-left:not(:empty){float:none;width:auto}.tinv-wishlist tfoot .tinvwl-to-right{float:none;width:auto;text-align:left}}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist .wishlist-action button[value=manage_remove] span{display:none}.tinv-wishlist .wishlist-action button[value=manage_remove]>i{display:inline-block}.tinv-wishlist tfoot .tinvwl-to-left+.tinvwl-to-right{margin-top:0}}@media only screen and (max-width:640px){.tinv-wishlist button[value=manage_apply] .tinvwl-mobile,.tinv-wishlist button[value=product_apply] .tinvwl-mobile{display:none}.tinv-wishlist tfoot .tinvwl-to-right .tinv-create-list{display:block}.tinv-wishlist .tinvwl-table-manage-list tfoot .tinvwl-to-right .button,.tinv-wishlist .tinvwl-table-manage-list tfoot .tinvwl-to-right button{width:100%;margin:10px 0 0}.tinv-wishlist .tinvwl-table-manage-lists tfoot .tinvwl-to-right .button,.tinv-wishlist .tinvwl-table-manage-lists tfoot .tinvwl-to-right button{width:100%;margin:10px 0 0}.tinv-wishlist tfoot .tinvwl-to-right>*{margin:10px 0 0}.tinv-wishlist tfoot .tinvwl-to-right .button:first-child,.tinv-wishlist tfoot .tinvwl-to-right button:first-child{margin-top:0!important}.tinv-wishlist tfoot .tinvwl-to-left+.tinvwl-to-right{margin-top:20px}}@media only screen and (max-width:1024px){.tinv-wishlist .social-buttons{float:none;width:auto;text-align:left;margin-top:20px}.tinv-wishlist .social-buttons+.tinv-wishlist-clear+.navigation-button{margin-top:30px}.tinv-wishlist .tinv-login form input[name=login]{min-width:auto}}@media only screen and (max-width:640px){.tinv-wishlist .social-buttons{text-align:center}.tinv-wishlist .navigation-button>li{width:20%;text-align:center}.tinv-wishlist .navigation-button.tinvwl-btns-count-1>li{width:100%}.tinv-wishlist .navigation-button.tinvwl-btns-count-2>li{width:50%}.tinv-wishlist .navigation-button.tinvwl-btns-count-3>li{width:33%}.tinv-wishlist .navigation-button.tinvwl-btns-count-4>li{width:25%}.tinv-wishlist .navigation-button>li+li{width:20%}.tinv-wishlist .navigation-button.tinvwl-btns-count-1>li+li{width:100%}.tinv-wishlist .navigation-button.tinvwl-btns-count-2>li+li{width:50%}.tinv-wishlist .navigation-button.tinvwl-btns-count-3>li+li{width:33%}.tinv-wishlist .navigation-button.tinvwl-btns-count-4>li+li{width:25%}.tinv-wishlist .navigation-button>li>.tinv-create-list>a,.tinv-wishlist .navigation-button>li>a{width:calc(100% - 10px);margin-right:0}.tinv-wishlist .navigation-button .tinv-create-list>a .tinvwl-txt,.tinv-wishlist .navigation-button li>a .tinvwl-txt{display:none}.tinv-wishlist .navigation-button .tinv-create-list>a>i,.tinv-wishlist .navigation-button li>a>i{display:inline-block!important;margin-right:0}.tinv-wishlist .social-buttons>span{display:block;margin-top:0;margin-right:0;margin-bottom:5px}}@media only screen and (max-width:667px){.tinv-wishlist.woocommerce .tinv-login form .form-row-first,.tinv-wishlist.woocommerce .tinv-login form .form-row-last{float:none;width:100%}.tinv-wishlist.woocommerce .tinv-login form .form-row-first{padding:0}.tinv-wishlist.woocommerce .tinv-login form .form-row-last{padding:0;margin-top:10px}.tinv-wishlist.woocommerce .tinv-login form .tinvwl-input-group-btn{display:block;padding:0;width:auto;margin-top:10px}}.tinv-overlay{width:100%;height:100%;visibility:hidden;opacity:0;background:#191919}.tinv-modal.tinv-modal-open .tinv-overlay{visibility:visible;opacity:.5}.admin-bar .tinv-wishlist .tinv-modal{padding-top:32px!important}.tinv-wishlist .tinv-modal{overflow-y:auto;overflow-x:hidden;width:0;height:0;z-index:9999;outline:0!important;-webkit-backface-visibility:hidden;visibility:hidden;opacity:0;text-align:left}.tinv-wishlist .tinv-modal .tinv-modal-inner{position:relative;margin:0 auto;background-color:#fff;max-width:360px;padding:40px}.tinv-wishlist .tinv-modal.tinv-modal-open{visibility:visible;opacity:1;width:100%;height:100%}.tinv-wishlist .tinv-modal .tinv-close-modal{display:inline-block;position:absolute;top:17px;right:14px;width:26px;height:26px;line-height:26px;font-size:12px;text-align:center;border-radius:50%;border-bottom:0;box-shadow:none!important;background-color:#ebe9eb}.tinv-wishlist .tinv-modal .icon_big_heart_check,.tinv-wishlist .tinv-modal .icon_big_times,.tinv-wishlist .tinv-modal img{display:block;margin:0 auto;margin-bottom:25px;opacity:1!important}.tinv-wishlist .tinv-modal ul{overflow:visible;list-style:disc;margin:10px 0 0 20px}.tinv-wishlist .tinv-modal li{list-style:disc!important}.tinv-wishlist .tinv-create-list .tinv-modal ul,.tinv-wishlist.tinv-create-list form ul{list-style:none!important;margin:25px 0 0}.tinv-wishlist .tinv-create-list .tinv-modal li,.tinv-wishlist.tinv-create-list form li{list-style:none!important}.tinv-wishlist .tinv-modal .already-in{margin-bottom:35px}.tinv-wishlist .tinv-modal .delete-notification{margin-bottom:25px}.tinv-wishlist .tinv-modal .already-in ul{overflow:visible;margin:12px 0 27px 17px}.tinv-wishlist .tinv-modal select{width:100%}.tinv-wishlist .tinv-modal button+.button,.tinv-wishlist .tinv-modal button+button{margin-top:12px;width:100%}.tinv-wishlist .tinv-modal input+button{margin-top:12px;width:100%}.tinv-wishlist .tinv-modal label+button,.tinv-wishlist .tinv-modal label+input{margin-top:12px;width:100%}.tinv-wishlist .tinv-modal select+button,.tinv-wishlist .tinv-modal select+input{margin-top:12px;width:100%}@media screen and (max-width:782px){.admin-bar .tinv-wishlist .tinv-modal{padding-top:46px!important}}@media screen and (max-width:600px){.admin-bar .tinv-wishlist .tinv-modal{padding-top:0!important}.tinv-wishlist .tinv-modal .tinv-close-modal{position:static;display:block;margin:0 auto 20px}}.tinv-wishlist .tinv-modal .already-in+label{display:block;margin-top:6px}.tinv-wishlist .tinv-modal label select{margin-top:8px}.tinv-wishlist .tinv-modal .delete-notification+button{width:100%}.tinv-wishlist .tinvwl_added_to_wishlist,.tinv-wishlist .tinvwl_created_wishlist{text-align:center}.tinv-wishlist .tinvwl_added_to_wishlist .tinv-txt{margin-bottom:25px}.tinv-wishlist .tinvwl_created_wishlist .tinv-txt{margin-bottom:25px}.tinv-wishlist .tinvwl_created_wishlist button{margin-top:0;margin-bottom:10px}.woocommerce .tinv-wishlist .tinvwl_added_to_wishlist.tinv-modal button.button{margin-top:0;margin-bottom:10px}.tinv-wishlist .tinv-modal .tinvwl-buttons-group{margin-top:20px}.tinv-wishlist .tinvwl-buttons-group button{width:100%}.tinv-wishlist .tinvwl-buttons-group button+button{margin-top:7px}.tinv-wishlist .tinvwl-buttons-group button i{position:relative}.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-heart-o,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-key,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-times{font-size:20px}.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-heart-o::before,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-key::before,.tinv-wishlist .tinvwl-buttons-group button i.ftinvwl-times::before{position:relative;top:3px}.tinv-wishlist .tinvwl-buttons-group+button{width:100%;margin-top:7px}.tinv-wishlist .tinv-modal h2{text-align:center;margin:0 0 35px}.tinv-wishlist .tinv-create-list .tinv-modal-inner{max-width:778px;padding:30px}.tinv-wishlist .tinvwl-has-error:not(.tinvwl-input-group),.tinv-wishlist .tinvwl-input-group.tinvwl-has-error .form-control{border:2px solid red}.tinv-wishlist .tinvwl-has-error+.tinvwl-error{padding:5px 0 0 5px;color:red}@media only screen and (max-width:640px){.navigation-button,.social-buttons,.tinv-lists-nav{margin-left:12px;margin-right:12px}}.tinvwl-tooltip{display:none}.tinvwl-input-group{position:relative;display:table;border-collapse:separate}.tinvwl-input-group .form-control{position:relative;z-index:1;float:left;height:38px;width:100%;margin-bottom:0}.tinvwl-input-group .form-control+.tinvwl-input-group-btn{padding-left:15px}.tinv-wishlist .tinvwl-to-left .tinvwl-input-group .form-control+.tinvwl-input-group-btn{padding-left:10px}.tinv-wishlist .tinv-search-form .tinvwl-input-group .form-control+.tinvwl-input-group-btn{padding-left:9px}.tinvwl-input-group .form-control,.tinvwl-input-group-addon,.tinvwl-input-group-btn{display:table-cell}.tinvwl-input-group-addon,.tinvwl-input-group-btn{width:1%;white-space:nowrap;vertical-align:top}@media only screen and (max-width:640px){.tinvwl-input-group{width:100%}}@media only screen and (max-width:667px){.tinvwl-input-group:not(.tinvwl-no-full){display:block}.tinvwl-input-group:not(.tinvwl-no-full) .form-control,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn{display:block}.tinvwl-input-group:not(.tinvwl-no-full) .form-control{float:none}.tinv-wishlist .tinv-search-form .tinvwl-input-group:not(.tinvwl-no-full) .form-control+.tinvwl-input-group-btn{padding-top:10px;padding-left:0}.tinvwl-input-group:not(.tinvwl-no-full) .form-control+.tinvwl-input-group-btn{padding-top:10px;padding-left:0}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon{width:100%}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-addon>input{width:100%}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn{width:100%}.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>button,.tinvwl-input-group:not(.tinvwl-no-full) .tinvwl-input-group-btn>input{width:100%}}.tinv-table{display:table;width:100%;height:100%}.tinv-cell{display:table-cell;vertical-align:middle}.tinv-wishlist-clear:after,.tinv-wishlist-clear:before{content:" ";display:table}.tinv-wishlist .tinv-wishlist-clear{visibility:visible;width:auto;height:auto}.tinv-wishlist-clear:after{clear:both}.icon_big_heart_check{display:inline-block;width:46px;height:46px;font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:60px}.icon_big_times{display:inline-block;width:46px;height:46px;font-family:tinvwl-webfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:60px}.icon_big_times::before{content:"\e904";top:-7px;left:-7px;position:relative}.icon_big_heart_check::before{content:"\e90a";top:-7px;left:-7px;position:relative}.tinvwl_add_to_wishlist_button.button.disabled-add-wishlist,.tinvwl_add_to_wishlist_button.disabled-add-wishlist{opacity:.5!important;cursor:not-allowed}.empty-name-wishlist{border-color:red!important}.tinvwl_remove_from_wishlist-text{display:none}.tinvwl-product-in-list.tinvwl-product-make-remove .tinvwl_remove_from_wishlist-text{display:inline}.tinvwl-product-in-list.tinvwl-product-make-remove .tinvwl_add_to_wishlist-text{display:none}@media only screen and (max-width:1024px){.tinv-wishlist .tinvwl-table-manage-list .product-remove{display:table-cell}}@media only screen and (max-width:640px){.tinv-wishlist table.tinvwl-table-manage-list tbody td.product-remove{display:block}}
|
assets/css/theme.css
CHANGED
@@ -383,6 +383,11 @@
|
|
383 |
font-weight: 700;
|
384 |
}
|
385 |
|
|
|
|
|
|
|
|
|
|
|
386 |
.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button, .woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:before, .woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:before {
|
387 |
color: #007acc;
|
388 |
font-family: inherit;
|
383 |
font-weight: 700;
|
384 |
}
|
385 |
|
386 |
+
.woocommerce.tinv-wishlist a.button.tinvwl_add_to_wishlist_button:before {
|
387 |
+
font-weight: 700;
|
388 |
+
vertical-align: middle;
|
389 |
+
}
|
390 |
+
|
391 |
.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button, .woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:before, .woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:before {
|
392 |
color: #007acc;
|
393 |
font-family: inherit;
|
assets/css/theme.min.css
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
/*! WooCommerce Wishlist Plugin - version 1.8.
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
-
.tinv-wishlist,.tinv-wishlist button,.tinv-wishlist input,.tinv-wishlist input[type=button],.tinv-wishlist input[type=reset],.tinv-wishlist input[type=submit],.tinv-wishlist select,.tinv-wishlist textarea{font-family:Georgia,serif;font-size:14px;font-weight:400;text-transform:none;line-height:1.75}.tinv-wishlist .woocommerce form .form-row input.input-text{line-height:1;padding-top:9.5px;padding-bottom:9.5px}.tinv-wishlist label{font-weight:400}.tinv-wishlist :-moz-placeholder,.tinv-wishlist ::-webkit-input-placeholder{color:#1a1a1a;font-family:Georgia,serif}.tinv-wishlist ::-moz-placeholder{color:#1a1a1a;font-family:Georgia,serif;opacity:1}.tinv-wishlist :-ms-input-placeholder{color:#1a1a1a;font-family:Georgia,serif}.tinv-wishlist select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:7px 10px;background-image:url(../img/select_caret_t.png);background-repeat:no-repeat;background-position:96% center;background-position:calc(100% - 15px) center}.tinv-wishlist button,.tinv-wishlist input[type=button],.tinv-wishlist input[type=reset],.tinv-wishlist input[type=submit]{text-align:center;font-weight:400;letter-spacing:0;line-height:1;padding:11.5px 19px}.tinv-wishlist .button,.tinv-wishlist button,.tinv-wishlist input[type=button],.tinv-wishlist input[type=reset],.tinv-wishlist input[type=submit]{box-shadow:none;text-transform:none;border:none;transition:none}.tinv-wishlist .product-quantity input[type=text].qty,.tinv-wishlist input[type=email],.tinv-wishlist input[type=number],.tinv-wishlist input[type=password],.tinv-wishlist input[type=search],.tinv-wishlist input[type=tel],.tinv-wishlist input[type=text],.tinv-wishlist input[type=url],.tinv-wishlist textarea{padding:6px 15px}.woocommerce.tinv-wishlist #respond input#submit,.woocommerce.tinv-wishlist a.button,.woocommerce.tinv-wishlist button.button,.woocommerce.tinv-wishlist input.button{text-align:center;font-weight:400;letter-spacing:0;line-height:1;text-transform:none;padding:11.5px 17px;transition:none}.woocommerce.tinv-wishlist #respond input#submit.alt,.woocommerce.tinv-wishlist a.button.alt,.woocommerce.tinv-wishlist button.button.alt,.woocommerce.tinv-wishlist input.button.alt{padding:11.5px 20px}.woocommerce.tinv-wishlist .tinvwl-continue-shop{padding-left:17px;padding-right:17px}.tinv-wishlist .product-quantity input[type=text].qty,.tinv-wishlist input[type=text],.tinv-wishlist input[type=email],.tinv-wishlist input[type=url],.tinv-wishlist input[type=password],.tinv-wishlist input[type=search],.tinv-wishlist input[type=tel],.tinv-wishlist input[type=number],.tinv-wishlist select,.tinv-wishlist textarea{font-family:inherit;color:#686868;background-color:#f7f7f7;border-width:1px;border-style:solid;border-color:#d1d1d1;border-radius:2px;box-shadow:none;font-size:14px}.tinv-wishlist{color:#1a1a1a}.tinv-wishlist a i.ftinvwl-chevron-left,.tinv-wishlist a i.ftinvwl-chevron-right{font-size:10px}.tinv-wishlist table th{padding:22px 12px}.tinv-wishlist table td{padding:27px 12px}.tinv-wishlist table .entry-date{background:0 0;padding:0;margin:0;color:inherit}.tinv-wishlist td.product-name{line-height:20px}.tinv-wishlist td.product-name a{line-height:1.14}.tinv-wishlist td.product-price{line-height:24px}.tinv-wishlist .product-stock i{font-size:12px}.tinv-wishlist .product-stock i.ftinvwl-times{font-size:20px;margin-right:8px}.tinv-wishlist .tinvwl-table-manage-list td.product-quantity{padding-left:9px;padding-right:9px}.tinv-wishlist.woocommerce table .quantity .qty{padding:8px 12px}.tinv-wishlist table.tinvwl-table-manage-list .product-action{padding-left:11px;padding-right:11px}.tinv-wishlist .tinvwl-table-manage-list .product-action .tinvwl_move_product_button i,.tinv-wishlist .tinvwl-table-manage-list .product-action button[name=tinvwl-remove] i{font-size:12px}.tinv-wishlist .wishlist-cb{padding-left:10px;padding-right:10px}.tinv-wishlist .wishlist-name{min-width:340px}.tinv-wishlist .wishlist-privacy{padding-left:15px;padding-right:15px;min-width:130px}.tinv-wishlist table:not(.tinvwl-public) .wishlist-date{min-width:130px}.tinv-wishlist .wishlist-action{padding-left:10px;padding-right:10px}.tinv-wishlist .tinv-login.tinv-wrapped-block{padding:30px}.tinv-wishlist .tinv-login form input[name=login]{min-width:219px}.tinv-wishlist .tinv-login input[name=username]{padding-left:40px}.tinv-wishlist .tinv-login input[name=password]{padding-left:36px}.tinv-wishlist .tinv-login .form-row{position:relative}.tinv-wishlist .tinv-login .tinvwl-icon{display:inline-block}.tinv-wishlist .tinv-modal .button{font-weight:400;padding:11px 11px 14px}.tinv-wishlist .tinv-modal .button i,.tinv-wishlist .tinv-modal button i{font-size:14px}.tinv-wishlist .tinvwl_added_to_wishlist .tinvwl_button_view,.tinv-wishlist .tinvwl_created_wishlist .tinvwl_button_view{padding:11px 11px 14px}.tinv-wishlist .tinv-modal .tinvwl-buttons-group button.tinvwl_button_close,.tinv-wishlist .tinv-modal .tinvwl-buttons-group button.tinvwl_button_view{float:left!important;width:calc(50% - 5px);white-space:normal}.tinv-wishlist .tinv-modal .tinvwl-buttons-group button+a button,.tinv-wishlist .tinv-modal .tinvwl-buttons-group button+button{margin:0 0 0 10px}.tinv-wishlist .tinv-header h2{font-family:inherit;text-transform:none;text-shadow:none;letter-spacing:0;font-size:40px;font-weight:700;margin-bottom:40px;color:#000}.tinv-wishlist a:not(.button):not(.social){font-family:inherit;font-weight:400;color:#007acc;text-decoration:underline;border-bottom:0;box-shadow:none}.tinv-wishlist a:not(.button):not(.social):active,.tinv-wishlist a:not(.button):not(.social):focus,.tinv-wishlist a:not(.button):not(.social):hover{color:#686868}.tinv-wishlist select{font-size:12px;background-size:8px 6px}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist table.tinvwl-table-manage-list td.product-thumbnail{padding-left:10px;padding-right:10px}.tinv-wishlist .product-action .button{padding:11.5px 12px!important}}@media only screen and (max-width:640px){.tinv-wishlist table.tinvwl-table-manage-list th{padding-top:26px;padding-bottom:26px}.tinv-wishlist table.tinvwl-table-manage-list tbody td,.tinv-wishlist table.tinvwl-table-manage-lists tbody td,.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td{display:block;width:100%!important;padding:0 12px 12px;text-align:center}.tinv-wishlist table.tinvwl-table-manage-list tbody td:not(:last-child),.tinv-wishlist table.tinvwl-table-manage-lists tbody td:not(:last-child),.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td:not(:last-child){border-bottom:0}.tinv-wishlist table.tinvwl-table-manage-list tbody td:first-child,.tinv-wishlist table.tinvwl-table-manage-lists tbody td:first-child{padding-top:20px}.tinv-wishlist table.tinvwl-table-manage-list td,.tinv-wishlist table.tinvwl-table-manage-lists td,.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public td{padding:12px}.tinv-wishlist .tinvwl-table-manage-list td.product-cb,.tinv-wishlist .tinvwl-table-manage-lists td.wishlist-cb{padding-bottom:20px}.tinv-wishlist .tinvwl-table-manage-list td.product-thumbnail{padding-top:20px;padding-bottom:14px}.tinv-wishlist .tinvwl-table-manage-list td.product-cb+td.product-remove+td.product-thumbnail{padding-top:0}.tinv-wishlist .tinvwl-table-manage-list td.product-name{padding-bottom:6px}.tinv-wishlist .tinvwl-table-manage-list td.product-price{padding-bottom:23px}.tinv-wishlist .tinvwl-table-manage-list td.product-date{padding-bottom:16px}.tinv-wishlist .tinvwl-table-manage-list td.product-stock{padding-bottom:24px}.tinv-wishlist .tinvwl-table-manage-list td.product-quantity{padding:0 12px 10px}.tinv-wishlist .wishlist-action button[value=manage_remove]{text-indent:-9999px;background-position:center}}@media only screen and (max-width:1200px){.tinv-wishlist .wishlist-name{min-width:200px}}@media only screen and (max-width:1024px){.tinv-wishlist .wishlist-action button[value=manage_remove]{padding-left:17px}}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist tfoot .tinvwl-to-left select{width:140px}.tinv-wishlist .wishlist-action button[value=manage_remove]{background-image:none;padding:11.5px 12px!important}}.woocommerce.tinv-wishlist a.button.tinvwl_add_to_wishlist_button{font-weight:700}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:before{color:#007acc;font-family:inherit;font-size:16px}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-black:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-white:before{color:#515151;background-color:#ebe9eb}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-black:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-white:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button:hover{color:#515151;background-color:#dad8da}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button{border-radius:3px}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:before{font-size:16px}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button:hover{color:#686868}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button{font-family:inherit;font-size:16px}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button{background-color:#ebe9eb;border-radius:3px}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-white:before{font-size:16px}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-black:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-white:before{color:#515151}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-black:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-white:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button:hover{color:#686868;background-color:#dad8da}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-white:before{color:#007acc}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-black:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-white:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button:hover{color:#686868}.woocommerce.tinv-wishlist #respond input#submit,.woocommerce.tinv-wishlist a.button,.woocommerce.tinv-wishlist button.button,.woocommerce.tinv-wishlist input.button{font-family:inherit;font-size:14px;margin-right:0;color:#515151;background-color:#ebe9eb;border-radius:3px;box-shadow:none;border:none}.woocommerce.tinv-wishlist #respond input#submit:hover,.woocommerce.tinv-wishlist a.button:hover,.woocommerce.tinv-wishlist button.button:hover,.woocommerce.tinv-wishlist input.button:hover{color:#515151;background-color:#dad8da}.woocommerce.tinv-wishlist #respond input#submit.alt,.woocommerce.tinv-wishlist a.button.alt,.woocommerce.tinv-wishlist button.button.alt,.woocommerce.tinv-wishlist input.button.alt{font-family:inherit;font-size:14px;color:#fff;background-color:#a46497;border-radius:3px}.woocommerce.tinv-wishlist #respond input#submit.alt:hover,.woocommerce.tinv-wishlist a.button.alt:hover,.woocommerce.tinv-wishlist button.button.alt:hover,.woocommerce.tinv-wishlist input.button.alt:hover{color:#fff;background-color:#935386}.tinv-wishlist .tinv-wrapped-block{padding:30px 30px 39px;color:#1a1a1a;background-color:#f6f6f6}.tinv-wishlist .tinv-search-list .tinv-wrapped-block{padding:20px 24px}.tinv-wishlist .tinv-wrapped-block input[type=password],.tinv-wishlist .tinv-wrapped-block input[type=search],.tinv-wishlist .tinv-wrapped-block input[type=text]{font-family:inherit;font-size:14px;color:#1a1a1a;background-color:#fff;border-color:#d1d1d1;border-radius:2px}.tinv-wishlist .tinv-wrapped-block input::-webkit-input-placeholder{color:#1a1a1a}.tinv-wishlist table,.tinv-wishlist table td{background-color:#fff}.tinv-wishlist table,.tinv-wishlist table td,.tinv-wishlist table th{border-color:#d1d1d1}.tinv-wishlist table{border-style:solid;border-width:1px 0 0 1px;line-height:16px}.tinv-wishlist table th{border:1px solid #d1d1d1;border-width:0 1px 1px 0;font-size:14px;font-family:inherit;font-weight:700;text-transform:none;color:#1a1a1a;background-color:#fff}.tinv-wishlist table td{border-style:solid;border-width:0 1px 1px 0;font-size:14px;font-family:inherit;color:#686868}.tinv-wishlist td.product-price{font-family:inherit;font-size:16px;color:#202020}.tinv-wishlist td.product-price ins span.amount{font-weight:400;color:#fff;background-color:#007acc}.tinv-wishlist .product-stock .stock:not(.out-of-stock){color:#6a8e19}.tinv-wishlist .product-remove button{background-color:#f7f7f7}.tinv-wishlist .product-remove button:active,.tinv-wishlist .product-remove button:focus,.tinv-wishlist .product-remove button:hover{background-color:#dad8da}.tinv-wishlist .social-buttons li a{box-shadow:none!important;background-color:#ebe9eb;text-decoration:none;font-size:20px}.tinv-wishlist .social-buttons li a:hover{background-color:#dad8da}.tinv-wishlist .social-buttons li a.dark,.tinv-wishlist .social-buttons li a.white{color:#000}.tinv-wishlist .social-buttons li a.dark:hover,.tinv-wishlist .social-buttons li a.white:hover{color:#686868}.tinv-wishlist .tinv-modal .tinv-modal-inner{line-height:26px;color:#1a1a1a;background-color:#fff;font-family:inherit;font-size:16px}.tinv-wishlist .tinv-modal .tinv-modal-inner select{font-family:inherit;font-size:16px;padding:6.5px 10px;line-height:22px;border-radius:2px}.tinv-wishlist input[type=email],.tinv-wishlist input[type=number],.tinv-wishlist input[type=password],.tinv-wishlist input[type=search],.tinv-wishlist input[type=tel],.tinv-wishlist input[type=text],.tinv-wishlist input[type=url],.tinv-wishlist select{min-height:38px}.tinv-wishlist .tinv-modal .tinv-close-modal,.tinv-wishlist .tinv-modal button.button{color:#515151;background-color:#ebe9eb}.tinv-wishlist .tinv-modal .tinv-close-modal:hover,.tinv-wishlist .tinv-modal button.button:hover{color:#515151;background-color:#dad8da}@media only screen and (-webkit-min-device-pixel-ratio:1.5),not all,not all,not all{.tinv-wishlist select{background-image:url(../img/select_caret_t@2x.png)}}
|
1 |
+
/*! WooCommerce Wishlist Plugin - version 1.8.4
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
5 |
|
6 |
+
.tinv-wishlist,.tinv-wishlist button,.tinv-wishlist input,.tinv-wishlist input[type=button],.tinv-wishlist input[type=reset],.tinv-wishlist input[type=submit],.tinv-wishlist select,.tinv-wishlist textarea{font-family:Georgia,serif;font-size:14px;font-weight:400;text-transform:none;line-height:1.75}.tinv-wishlist .woocommerce form .form-row input.input-text{line-height:1;padding-top:9.5px;padding-bottom:9.5px}.tinv-wishlist label{font-weight:400}.tinv-wishlist :-moz-placeholder,.tinv-wishlist ::-webkit-input-placeholder{color:#1a1a1a;font-family:Georgia,serif}.tinv-wishlist ::-moz-placeholder{color:#1a1a1a;font-family:Georgia,serif;opacity:1}.tinv-wishlist :-ms-input-placeholder{color:#1a1a1a;font-family:Georgia,serif}.tinv-wishlist select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:7px 10px;background-image:url(../img/select_caret_t.png);background-repeat:no-repeat;background-position:96% center;background-position:calc(100% - 15px) center}.tinv-wishlist button{text-align:center;font-weight:400;letter-spacing:0;line-height:1;text-transform:none;padding:11.5px 19px}.tinv-wishlist input[type=button],.tinv-wishlist input[type=reset],.tinv-wishlist input[type=submit]{text-align:center;font-weight:400;letter-spacing:0;line-height:1;text-transform:none;padding:11.5px 19px}.tinv-wishlist .button,.tinv-wishlist button{box-shadow:none;text-transform:none;border:none;transition:none}.tinv-wishlist input[type=button],.tinv-wishlist input[type=reset],.tinv-wishlist input[type=submit]{box-shadow:none;text-transform:none;border:none;transition:none}.tinv-wishlist .product-quantity input[type=text].qty{padding:6px 15px}.tinv-wishlist input[type=email],.tinv-wishlist input[type=number],.tinv-wishlist input[type=password],.tinv-wishlist input[type=search],.tinv-wishlist input[type=tel],.tinv-wishlist input[type=text],.tinv-wishlist input[type=url]{padding:6px 15px}.tinv-wishlist textarea{padding:6px 15px}.woocommerce.tinv-wishlist #respond input#submit,.woocommerce.tinv-wishlist a.button,.woocommerce.tinv-wishlist button.button,.woocommerce.tinv-wishlist input.button{text-align:center;font-weight:400;letter-spacing:0;line-height:1;text-transform:none;padding:11.5px 17px;transition:none}.woocommerce.tinv-wishlist #respond input#submit.alt,.woocommerce.tinv-wishlist a.button.alt,.woocommerce.tinv-wishlist button.button.alt,.woocommerce.tinv-wishlist input.button.alt{padding:11.5px 20px}.woocommerce.tinv-wishlist .tinvwl-continue-shop{padding-left:17px;padding-right:17px}.tinv-wishlist .product-quantity input[type=text].qty,.tinv-wishlist input[type=email],.tinv-wishlist input[type=number],.tinv-wishlist input[type=password],.tinv-wishlist input[type=search],.tinv-wishlist input[type=tel],.tinv-wishlist input[type=text],.tinv-wishlist input[type=url],.tinv-wishlist select,.tinv-wishlist textarea{font-family:inherit;color:#686868;background-color:#f7f7f7;border-width:1px;border-style:solid;border-color:#d1d1d1;border-radius:2px;box-shadow:none;font-size:14px}.tinv-wishlist{color:#1a1a1a}.tinv-wishlist a i.ftinvwl-chevron-left,.tinv-wishlist a i.ftinvwl-chevron-right{font-size:10px}.tinv-wishlist table th{padding:22px 12px}.tinv-wishlist table td{padding:27px 12px}.tinv-wishlist table .entry-date{background:0 0;padding:0;margin:0;color:inherit}.tinv-wishlist td.product-name{line-height:20px}.tinv-wishlist td.product-name a{line-height:1.14}.tinv-wishlist td.product-price{line-height:24px}.tinv-wishlist .product-stock i{font-size:12px}.tinv-wishlist .product-stock i.ftinvwl-times{font-size:20px;margin-right:8px}.tinv-wishlist .tinvwl-table-manage-list td.product-quantity{padding-left:9px;padding-right:9px}.tinv-wishlist.woocommerce table .quantity .qty{padding:8px 12px}.tinv-wishlist table.tinvwl-table-manage-list .product-action{padding-left:11px;padding-right:11px}.tinv-wishlist .tinvwl-table-manage-list .product-action .tinvwl_move_product_button i,.tinv-wishlist .tinvwl-table-manage-list .product-action button[name=tinvwl-remove] i{font-size:12px}.tinv-wishlist .wishlist-cb{padding-left:10px;padding-right:10px}.tinv-wishlist .wishlist-name{min-width:340px}.tinv-wishlist .wishlist-privacy{padding-left:15px;padding-right:15px;min-width:130px}.tinv-wishlist table:not(.tinvwl-public) .wishlist-date{min-width:130px}.tinv-wishlist .wishlist-action{padding-left:10px;padding-right:10px}.tinv-wishlist .tinv-login.tinv-wrapped-block{padding:30px}.tinv-wishlist .tinv-login form input[name=login]{min-width:219px}.tinv-wishlist .tinv-login input[name=username]{padding-left:40px}.tinv-wishlist .tinv-login input[name=password]{padding-left:36px}.tinv-wishlist .tinv-login .form-row{position:relative}.tinv-wishlist .tinv-login .tinvwl-icon{display:inline-block}.tinv-wishlist .tinv-modal .button{font-weight:400;padding:11px 11px 14px 11px}.tinv-wishlist .tinv-modal .button i{font-size:14px}.tinv-wishlist .tinv-modal button i{font-size:14px}.tinv-wishlist .tinvwl_added_to_wishlist .tinvwl_button_view,.tinv-wishlist .tinvwl_created_wishlist .tinvwl_button_view{padding:11px 11px 14px 11px}.tinv-wishlist .tinv-modal .tinvwl-buttons-group button.tinvwl_button_close,.tinv-wishlist .tinv-modal .tinvwl-buttons-group button.tinvwl_button_view{float:left!important;width:calc(50% - 5px);white-space:normal}.tinv-wishlist .tinv-modal .tinvwl-buttons-group button+a button,.tinv-wishlist .tinv-modal .tinvwl-buttons-group button+button{margin:0 0 0 10px}.tinv-wishlist .tinv-header h2{font-family:inherit;text-transform:none;text-shadow:none;letter-spacing:0;font-size:40px;font-weight:700;margin-bottom:40px;color:#000}.tinv-wishlist a:not(.button):not(.social){font-family:inherit;font-weight:400;color:#007acc;text-decoration:underline;border-bottom:0;box-shadow:none}.tinv-wishlist a:not(.button):not(.social):active,.tinv-wishlist a:not(.button):not(.social):focus,.tinv-wishlist a:not(.button):not(.social):hover{color:#686868}.tinv-wishlist select{font-size:12px;background-size:8px 6px}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist table.tinvwl-table-manage-list td.product-thumbnail{padding-left:10px;padding-right:10px}.tinv-wishlist .product-action .button{padding:11.5px 12px!important}}@media only screen and (max-width:640px){.tinv-wishlist table.tinvwl-table-manage-list th{padding-top:26px;padding-bottom:26px}.tinv-wishlist table.tinvwl-table-manage-list tbody td{display:block;width:100%!important;padding:0 12px 12px;text-align:center}.tinv-wishlist table.tinvwl-table-manage-lists tbody td,.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td{display:block;width:100%!important;padding:0 12px 12px;text-align:center}.tinv-wishlist table.tinvwl-table-manage-list tbody td:not(:last-child){border-bottom:0}.tinv-wishlist table.tinvwl-table-manage-lists tbody td:not(:last-child),.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public tbody td:not(:last-child){border-bottom:0}.tinv-wishlist table.tinvwl-table-manage-list tbody td:first-child,.tinv-wishlist table.tinvwl-table-manage-lists tbody td:first-child{padding-top:20px}.tinv-wishlist table.tinvwl-table-manage-list td{padding:12px}.tinv-wishlist table.tinvwl-table-manage-lists td,.tinv-wishlist table.tinvwl-table-manage-lists.tinvwl-public td{padding:12px}.tinv-wishlist .tinvwl-table-manage-list td.product-cb,.tinv-wishlist .tinvwl-table-manage-lists td.wishlist-cb{padding-bottom:20px}.tinv-wishlist .tinvwl-table-manage-list td.product-thumbnail{padding-top:20px;padding-bottom:14px}.tinv-wishlist .tinvwl-table-manage-list td.product-cb+td.product-remove+td.product-thumbnail{padding-top:0}.tinv-wishlist .tinvwl-table-manage-list td.product-name{padding-bottom:6px}.tinv-wishlist .tinvwl-table-manage-list td.product-price{padding-bottom:23px}.tinv-wishlist .tinvwl-table-manage-list td.product-date{padding-bottom:16px}.tinv-wishlist .tinvwl-table-manage-list td.product-stock{padding-bottom:24px}.tinv-wishlist .tinvwl-table-manage-list td.product-quantity{padding:0 12px 10px}.tinv-wishlist .wishlist-action button[value=manage_remove]{text-indent:-9999px;background-position:center}}@media only screen and (max-width:1200px){.tinv-wishlist .wishlist-name{min-width:200px}}@media only screen and (max-width:1024px){.tinv-wishlist .wishlist-action button[value=manage_remove]{padding-left:17px}}@media only screen and (max-width:1024px) and (min-width:641px){.tinv-wishlist tfoot .tinvwl-to-left select{width:140px}.tinv-wishlist .wishlist-action button[value=manage_remove]{background-image:none;padding:11.5px 12px!important}}.woocommerce.tinv-wishlist a.button.tinvwl_add_to_wishlist_button{font-weight:700}.woocommerce.tinv-wishlist a.button.tinvwl_add_to_wishlist_button:before{font-weight:700;vertical-align:middle}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:before{color:#007acc;font-family:inherit;font-size:16px}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-black:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-white:before{color:#515151;background-color:#ebe9eb}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-black:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button.icon-white:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button:hover{color:#515151;background-color:#dad8da}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.button{border-radius:3px}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:before{font-size:16px}.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-black:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button.icon-white:hover:before,.woocommerce ul.products li.product .tinvwl_add_to_wishlist_button:hover{color:#686868}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button{font-family:inherit;font-size:16px}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button{background-color:#ebe9eb;border-radius:3px}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-white:before{font-size:16px}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-black:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-white:before{color:#515151}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-black:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button.icon-white:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.button:hover{color:#686868;background-color:#dad8da}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-black:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-white:before{color:#007acc}.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-black:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button.icon-white:hover:before,.woocommerce div.product form.cart .tinvwl_add_to_wishlist_button:hover{color:#686868}.woocommerce.tinv-wishlist #respond input#submit,.woocommerce.tinv-wishlist a.button,.woocommerce.tinv-wishlist button.button,.woocommerce.tinv-wishlist input.button{font-family:inherit;font-size:14px;margin-right:0;color:#515151;background-color:#ebe9eb;border-radius:3px;box-shadow:none;border:none}.woocommerce.tinv-wishlist #respond input#submit:hover,.woocommerce.tinv-wishlist a.button:hover,.woocommerce.tinv-wishlist button.button:hover,.woocommerce.tinv-wishlist input.button:hover{color:#515151;background-color:#dad8da}.woocommerce.tinv-wishlist #respond input#submit.alt,.woocommerce.tinv-wishlist a.button.alt,.woocommerce.tinv-wishlist button.button.alt,.woocommerce.tinv-wishlist input.button.alt{font-family:inherit;font-size:14px;color:#fff;background-color:#a46497;border-radius:3px}.woocommerce.tinv-wishlist #respond input#submit.alt:hover,.woocommerce.tinv-wishlist a.button.alt:hover,.woocommerce.tinv-wishlist button.button.alt:hover,.woocommerce.tinv-wishlist input.button.alt:hover{color:#fff;background-color:#935386}.tinv-wishlist .tinv-wrapped-block{padding:30px 30px 39px;color:#1a1a1a;background-color:#f6f6f6}.tinv-wishlist .tinv-search-list .tinv-wrapped-block{padding:20px 24px}.tinv-wishlist .tinv-wrapped-block input[type=password],.tinv-wishlist .tinv-wrapped-block input[type=search],.tinv-wishlist .tinv-wrapped-block input[type=text]{font-family:inherit;font-size:14px;color:#1a1a1a;background-color:#fff;border-color:#d1d1d1;border-radius:2px}.tinv-wishlist .tinv-wrapped-block input::-webkit-input-placeholder{color:#1a1a1a}.tinv-wishlist table,.tinv-wishlist table td{background-color:#fff}.tinv-wishlist table,.tinv-wishlist table td,.tinv-wishlist table th{border-color:#d1d1d1}.tinv-wishlist table{border-style:solid;border-width:1px 0 0 1px;line-height:16px}.tinv-wishlist table th{border:1px solid #d1d1d1}.tinv-wishlist table td{border-style:solid;border-width:0 1px 1px 0;font-size:14px;font-family:inherit}.tinv-wishlist table th{border-width:0 1px 1px 0;font-size:14px;font-family:inherit;font-weight:700;text-transform:none;color:#1a1a1a;background-color:#fff}.tinv-wishlist table td{color:#686868}.tinv-wishlist td.product-price{font-family:inherit;font-size:16px;color:#202020}.tinv-wishlist td.product-price ins span.amount{font-weight:400;color:#fff;background-color:#007acc}.tinv-wishlist .product-stock .stock:not(.out-of-stock){color:#6a8e19}.tinv-wishlist .product-remove button{background-color:#f7f7f7}.tinv-wishlist .product-remove button:active,.tinv-wishlist .product-remove button:focus,.tinv-wishlist .product-remove button:hover{background-color:#dad8da}.tinv-wishlist .social-buttons li a{box-shadow:none!important;background-color:#ebe9eb;text-decoration:none;font-size:20px}.tinv-wishlist .social-buttons li a:hover{background-color:#dad8da}.tinv-wishlist .social-buttons li a.dark,.tinv-wishlist .social-buttons li a.white{color:#000}.tinv-wishlist .social-buttons li a.dark:hover,.tinv-wishlist .social-buttons li a.white:hover{color:#686868}.tinv-wishlist .tinv-modal .tinv-modal-inner{line-height:26px;color:#1a1a1a;background-color:#fff;font-family:inherit;font-size:16px}.tinv-wishlist .tinv-modal .tinv-modal-inner select{font-family:inherit;font-size:16px;padding:6.5px 10px;line-height:22px;border-radius:2px}.tinv-wishlist input[type=email],.tinv-wishlist input[type=number],.tinv-wishlist input[type=password],.tinv-wishlist input[type=search],.tinv-wishlist input[type=tel],.tinv-wishlist input[type=text],.tinv-wishlist input[type=url]{min-height:38px}.tinv-wishlist select{min-height:38px}.tinv-wishlist .tinv-modal .tinv-close-modal,.tinv-wishlist .tinv-modal button.button{color:#515151;background-color:#ebe9eb}.tinv-wishlist .tinv-modal .tinv-close-modal:hover,.tinv-wishlist .tinv-modal button.button:hover{color:#515151;background-color:#dad8da}@media only screen and (-webkit-min-device-pixel-ratio:1.5),not all,not all,not all{.tinv-wishlist select{background-image:url(../img/select_caret_t@2x.png)}}
|
assets/js/admin.min.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! WooCommerce Wishlist Plugin - version 1.8.
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
1 |
+
/*! WooCommerce Wishlist Plugin - version 1.8.4
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
assets/js/public.min.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! WooCommerce Wishlist Plugin - version 1.8.
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
1 |
+
/*! WooCommerce Wishlist Plugin - version 1.8.4
|
2 |
* https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
3 |
* Copyright (c) 2018;
|
4 |
* Licensed GPLv2+ */
|
includes/activator.class.php
CHANGED
@@ -1,800 +1,800 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Activation/Deactivation plugin class
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Activation/Deactivation plugin class
|
16 |
-
*/
|
17 |
-
class TInvWL_Activator {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Plugin name
|
21 |
-
*
|
22 |
-
* @var string Using defined constant.
|
23 |
-
*/
|
24 |
-
static $
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Prefix database
|
28 |
-
*
|
29 |
-
* @see wpdb
|
30 |
-
* @var string
|
31 |
-
*/
|
32 |
-
static $wpdb_prefix;
|
33 |
-
|
34 |
-
/**
|
35 |
-
* Database version
|
36 |
-
*
|
37 |
-
* @var string
|
38 |
-
*/
|
39 |
-
static $
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Current installed database version
|
43 |
-
*
|
44 |
-
* @var string
|
45 |
-
*/
|
46 |
-
static $_prev;
|
47 |
-
|
48 |
-
/**
|
49 |
-
* Regular expression for sorting database version function
|
50 |
-
*
|
51 |
-
* @var string
|
52 |
-
*/
|
53 |
-
const REGEXP = '/^database_/i';
|
54 |
-
|
55 |
-
/**
|
56 |
-
* Method activation plugin.
|
57 |
-
*/
|
58 |
-
public static function activate() {
|
59 |
-
if ( self::update() ) {
|
60 |
-
return false;
|
61 |
-
}
|
62 |
-
if ( is_null( get_option( self::$
|
63 |
-
TInvWL_WizardSetup::setup();
|
64 |
-
}
|
65 |
-
self::database();
|
66 |
-
self::load_data();
|
67 |
-
TInvWL_Public_TInvWL::update_rewrite_rules();
|
68 |
-
}
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Method deactivation plugin.
|
72 |
-
*/
|
73 |
-
public static function uninstall() {
|
74 |
-
self::database( 'destroy' );
|
75 |
-
self::unload_data();
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Method update plugin.
|
80 |
-
*/
|
81 |
-
public static function update() {
|
82 |
-
$current_version = get_option( self::$
|
83 |
-
if ( version_compare( self::$
|
84 |
-
self::database( 'upgrade', $current_version );
|
85 |
-
self::upgrade_data();
|
86 |
-
TInvWL_Public_TInvWL::update_rewrite_rules();
|
87 |
-
return true;
|
88 |
-
}
|
89 |
-
return false;
|
90 |
-
}
|
91 |
-
|
92 |
-
/**
|
93 |
-
* Require function database and apply method
|
94 |
-
*
|
95 |
-
* @param string $action create|destroy.
|
96 |
-
* @param string $prev Current installed version.
|
97 |
-
*/
|
98 |
-
private static function database( $action = 'create', $prev = 'f.0' ) {
|
99 |
-
|
100 |
-
$activator = new TInvWL_Activator();
|
101 |
-
$lists = get_class_methods( $activator );
|
102 |
-
unset( $activator );
|
103 |
-
|
104 |
-
self::$_prev = $prev;
|
105 |
-
$lists = array_filter( $lists, array( __CLASS__, 'filter_database' ) );
|
106 |
-
uasort( $lists, array( __CLASS__, 'sort_database' ) );
|
107 |
-
|
108 |
-
$tables = array();
|
109 |
-
foreach ( $lists as $method ) {
|
110 |
-
$tables = self::merge_database( $tables, $method );
|
111 |
-
}
|
112 |
-
if ( ! empty( $tables ) && is_array( $tables ) ) {
|
113 |
-
self::$action( $tables );
|
114 |
-
}
|
115 |
-
}
|
116 |
-
|
117 |
-
/**
|
118 |
-
* Merge table wit upgrade attributes
|
119 |
-
*
|
120 |
-
* @param array $tables1 Collecting tables.
|
121 |
-
* @param string $method Method for get new tables.
|
122 |
-
* @return array
|
123 |
-
*/
|
124 |
-
public static function merge_database( $tables1, $method ) {
|
125 |
-
$tables2 = self::$method();
|
126 |
-
foreach ( (array) $tables2 as $name => $table ) {
|
127 |
-
if ( empty( $table ) ) {
|
128 |
-
continue;
|
129 |
-
}
|
130 |
-
if ( array_key_exists( 'upgrade', $table ) ) {
|
131 |
-
$_upgrade = $table['upgrade'];
|
132 |
-
$table['upgrade'] = array();
|
133 |
-
$table['upgrade'][ self::pre_database( $method ) ] = $_upgrade;
|
134 |
-
}
|
135 |
-
if ( array_key_exists( $name, $tables1 ) ) {
|
136 |
-
if ( ! array_key_exists( 'upgrade', $tables1[ $name ] ) ) {
|
137 |
-
$tables1[ $name ]['upgrade'] = array();
|
138 |
-
}
|
139 |
-
if ( ! array_key_exists( 'upgrade', $table ) ) {
|
140 |
-
$table['upgrade'] = array();
|
141 |
-
}
|
142 |
-
$table['upgrade'] = tinv_array_merge( $tables1[ $name ]['upgrade'], $table['upgrade'] );
|
143 |
-
}
|
144 |
-
if ( empty( $table['field'] ) ) {
|
145 |
-
$tables1[ $name ]['upgrade'] = $table['upgrade'];
|
146 |
-
} else {
|
147 |
-
$tables1[ $name ] = $table;
|
148 |
-
}
|
149 |
-
}
|
150 |
-
return $tables1;
|
151 |
-
}
|
152 |
-
|
153 |
-
/**
|
154 |
-
* Filter methods for creating database
|
155 |
-
*
|
156 |
-
* @param string $method Method name from this class.
|
157 |
-
* @return boolean
|
158 |
-
*/
|
159 |
-
public static function filter_database( $method ) {
|
160 |
-
if ( ! preg_match( self::REGEXP, $method ) ) {
|
161 |
-
return false;
|
162 |
-
}
|
163 |
-
if ( version_compare( self::$_prev, self::pre_database( $method ), 'ge' ) ) {
|
164 |
-
return false;
|
165 |
-
}
|
166 |
-
return version_compare( self::$
|
167 |
-
}
|
168 |
-
|
169 |
-
/**
|
170 |
-
* Sort methods for creating database
|
171 |
-
*
|
172 |
-
* @param string $method1 Method name first from this class.
|
173 |
-
* @param string $method2 Method name second from this class.
|
174 |
-
* @return type
|
175 |
-
*/
|
176 |
-
public static function sort_database( $method1, $method2 ) {
|
177 |
-
return version_compare( self::pre_database( $method1 ), self::pre_database( $method2 ) );
|
178 |
-
}
|
179 |
-
|
180 |
-
/**
|
181 |
-
* Convert method name to version
|
182 |
-
*
|
183 |
-
* @param string $method Method name from this class.
|
184 |
-
* @return string
|
185 |
-
*/
|
186 |
-
public static function pre_database( $method ) {
|
187 |
-
$method = preg_replace( self::REGEXP, '', $method );
|
188 |
-
$method = str_replace( '_', '.', $method );
|
189 |
-
return $method;
|
190 |
-
}
|
191 |
-
|
192 |
-
/**
|
193 |
-
* Creation SQL request for creation table
|
194 |
-
*
|
195 |
-
* @param string $name Name Table.
|
196 |
-
* @param array $table Structured array table.
|
197 |
-
* array 'field' Array fields.
|
198 |
-
* string 'charset' Charset table.
|
199 |
-
* string 'key' Primary key.
|
200 |
-
* string 'post' Custom elements in format SQL.
|
201 |
-
* @return string
|
202 |
-
*/
|
203 |
-
public static function table( $name, $table ) {
|
204 |
-
$name = self::$wpdb_prefix . self::$
|
205 |
-
$fields = $table['field'];
|
206 |
-
$table = filter_var_array( $table, array(
|
207 |
-
'charset' => FILTER_SANITIZE_STRING,
|
208 |
-
'key' => FILTER_SANITIZE_STRING,
|
209 |
-
'post' => FILTER_DEFAULT,
|
210 |
-
) );
|
211 |
-
|
212 |
-
$table['charset'] = ( empty( $table['charset'] ) ) ? 'utf8' : $table['charset'];
|
213 |
-
$table['charset'] = sprintf( 'DEFAULT CHARSET=%s', $table['charset'] );
|
214 |
-
|
215 |
-
$keys = array_keys( $fields );
|
216 |
-
if ( ! in_array( $table['key'], $keys ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
217 |
-
$table['key'] = null;
|
218 |
-
}
|
219 |
-
$t = self::column_database();
|
220 |
-
foreach ( $fields as $key => $flags ) {
|
221 |
-
if ( is_string( $flags ) ) {
|
222 |
-
if ( array_key_exists( $flags, $t ) ) {
|
223 |
-
$flags = $t[ $flags ];
|
224 |
-
} else {
|
225 |
-
$flags = $t['text'];
|
226 |
-
}
|
227 |
-
}
|
228 |
-
$fields[ $key ] = $flags;
|
229 |
-
}
|
230 |
-
if ( empty( $table['key'] ) ) {
|
231 |
-
foreach ( $fields as $key => $flags ) {
|
232 |
-
if ( array_key_exists( 4, $flags ) ) {
|
233 |
-
if ( $flags[4] ) {
|
234 |
-
$table['key'] = $key;
|
235 |
-
break;
|
236 |
-
}
|
237 |
-
}
|
238 |
-
}
|
239 |
-
if ( empty( $table['key'] ) ) {
|
240 |
-
foreach ( $keys as $key ) {
|
241 |
-
if ( preg_match( '/id$/i', $key ) ) {
|
242 |
-
$table['key'] = $key;
|
243 |
-
break;
|
244 |
-
}
|
245 |
-
}
|
246 |
-
}
|
247 |
-
}
|
248 |
-
unset( $keys );
|
249 |
-
if ( empty( $table['key'] ) ) {
|
250 |
-
$table['key'] = '';
|
251 |
-
} else {
|
252 |
-
$table['key'] = sprintf( ', PRIMARY KEY (`%s`)', $table['key'] );
|
253 |
-
}
|
254 |
-
|
255 |
-
if ( empty( $table['post'] ) ) {
|
256 |
-
$table['post'] = '';
|
257 |
-
} else {
|
258 |
-
$table['post'] = ', ' . $table['post'];
|
259 |
-
}
|
260 |
-
|
261 |
-
foreach ( $fields as $key => $format ) {
|
262 |
-
$fields[ $key ] = self::field( $key, $format );
|
263 |
-
}
|
264 |
-
$fields = implode( ', ', $fields );
|
265 |
-
|
266 |
-
$sql = sprintf( 'CREATE TABLE IF NOT EXISTS `%s` ( %s%s%s) %s; ', $name, $fields, $table['key'], $table['post'], $table['charset'] );
|
267 |
-
return $sql;
|
268 |
-
}
|
269 |
-
|
270 |
-
/**
|
271 |
-
* Created SQL field
|
272 |
-
*
|
273 |
-
* @param string $name Name field.
|
274 |
-
* @param array $newformat Structure field.
|
275 |
-
* string 0 Data Types column.
|
276 |
-
* integer|string 1 Length or Size column.
|
277 |
-
* boolean 2 is NULL?
|
278 |
-
* integer|string 3 Specifies a default value for a column.
|
279 |
-
* boolean 4 is AUTO_INCREMENT?.
|
280 |
-
* @return string
|
281 |
-
*/
|
282 |
-
public static function field( $name, $newformat ) {
|
283 |
-
$format = array( 'TEXT', null, false, null, false );
|
284 |
-
|
285 |
-
foreach ( $format as $key => $value ) {
|
286 |
-
if ( array_key_exists( $key, $newformat ) ) {
|
287 |
-
$format[ $key ] = $newformat[ $key ];
|
288 |
-
}
|
289 |
-
}
|
290 |
-
|
291 |
-
if ( ! is_null( $format[1] ) ) {
|
292 |
-
$format[1] = sprintf( '(%s)', $format[1] );
|
293 |
-
}
|
294 |
-
|
295 |
-
$format[2] = ( filter_var( $format[2], FILTER_VALIDATE_BOOLEAN ) ? '' : 'NOT ' ) . 'NULL';
|
296 |
-
|
297 |
-
if ( ! is_null( $format[3] ) ) {
|
298 |
-
if ( ! in_array( $format[3], array( 'CURRENT_TIMESTAMP' ) ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
299 |
-
$format[3] = is_string( $format[3] ) ? "'" . $format[3] . "'" : $format[3];
|
300 |
-
}
|
301 |
-
$format[3] = sprintf( 'DEFAULT %s', $format[3] );
|
302 |
-
}
|
303 |
-
|
304 |
-
$format[4] = ( filter_var( $format[4], FILTER_VALIDATE_BOOLEAN ) ? 'AUTO_INCREMENT' : null );
|
305 |
-
|
306 |
-
array_unshift( $format, '`' . $name . '`' );
|
307 |
-
$format = array_filter( $format );
|
308 |
-
return implode( ' ', $format );
|
309 |
-
}
|
310 |
-
|
311 |
-
/**
|
312 |
-
* Created tables from array
|
313 |
-
*
|
314 |
-
* @global wpdb $wpdb
|
315 |
-
* @param array $tables Array tables.
|
316 |
-
* @return boolean
|
317 |
-
*/
|
318 |
-
public static function create( $tables ) {
|
319 |
-
global $wpdb;
|
320 |
-
self::$wpdb_prefix = $wpdb->prefix;
|
321 |
-
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
322 |
-
|
323 |
-
foreach ( $tables as $name => $table ) {
|
324 |
-
if ( array_key_exists( 'field', $table ) && ! empty( $table['field'] ) ) {
|
325 |
-
$table = self::table( $name, $table );
|
326 |
-
$tables[ $name ] = dbDelta( $table );
|
327 |
-
}
|
328 |
-
}
|
329 |
-
|
330 |
-
add_option( self::$
|
331 |
-
|
332 |
-
return true;
|
333 |
-
}
|
334 |
-
|
335 |
-
/**
|
336 |
-
* Upgrade tables from array
|
337 |
-
*
|
338 |
-
* @global wpdb $wpdb
|
339 |
-
* @param array $tables Array tables.
|
340 |
-
* @return boolean
|
341 |
-
*/
|
342 |
-
public static function upgrade( $tables ) {
|
343 |
-
|
344 |
-
self::create( $tables );
|
345 |
-
|
346 |
-
foreach ( $tables as $name => $table ) {
|
347 |
-
self::upgrade_action( $name, $table );
|
348 |
-
}
|
349 |
-
|
350 |
-
update_option( self::$
|
351 |
-
|
352 |
-
return true;
|
353 |
-
}
|
354 |
-
|
355 |
-
/**
|
356 |
-
* Get columns for exist table.
|
357 |
-
*
|
358 |
-
* @global wpdb $wpdb
|
359 |
-
* @param string $name Table name.
|
360 |
-
* @return array
|
361 |
-
*/
|
362 |
-
public static function upgrade_get_columns( $name ) {
|
363 |
-
global $wpdb;
|
364 |
-
|
365 |
-
$_fields = array();
|
366 |
-
$fields = $wpdb->get_results( "DESCRIBE `{$name}`", ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
367 |
-
foreach ( $fields as $field ) {
|
368 |
-
$_fields[ $field['Field'] ] = $field;
|
369 |
-
}
|
370 |
-
return $_fields;
|
371 |
-
}
|
372 |
-
|
373 |
-
/**
|
374 |
-
* Apply upgrade action
|
375 |
-
*
|
376 |
-
* @global wpdb $wpdb
|
377 |
-
* @param string $name Name Table.
|
378 |
-
* @param array $table Structured array table.
|
379 |
-
* @return boolean
|
380 |
-
*/
|
381 |
-
public static function upgrade_action( $name, $table ) {
|
382 |
-
|
383 |
-
if ( ! array_key_exists( 'upgrade' , $table ) ) {
|
384 |
-
return false;
|
385 |
-
}
|
386 |
-
|
387 |
-
$t = self::column_database();
|
388 |
-
foreach ( $table['field'] as $key => $flags ) {
|
389 |
-
if ( is_string( $flags ) ) {
|
390 |
-
if ( array_key_exists( $flags, $t ) ) {
|
391 |
-
$flags = $t[ $flags ];
|
392 |
-
} else {
|
393 |
-
$flags = $t['text'];
|
394 |
-
}
|
395 |
-
$table['field'][ $key ] = $flags;
|
396 |
-
}
|
397 |
-
}
|
398 |
-
$name = self::$wpdb_prefix . self::$
|
399 |
-
$upgrades = (array) $table['upgrade'];
|
400 |
-
foreach ( $upgrades as $ver_upgrades ) {
|
401 |
-
foreach ( $ver_upgrades as $upgrade ) {
|
402 |
-
$action = $upgrade;
|
403 |
-
if ( is_array( $upgrade ) ) {
|
404 |
-
$action = $upgrade['action'];
|
405 |
-
unset( $upgrade['action'] );
|
406 |
-
}
|
407 |
-
if ( ! is_string( $action ) ) {
|
408 |
-
continue;
|
409 |
-
}
|
410 |
-
$action = preg_replace( '/[^a-z0-9_]/i', '', (string) $action );
|
411 |
-
if ( empty( $action ) ) {
|
412 |
-
continue;
|
413 |
-
}
|
414 |
-
|
415 |
-
if ( method_exists( __CLASS__, __FUNCTION__ . '_' . $action ) ) {
|
416 |
-
call_user_func( array( __CLASS__, __FUNCTION__ . '_' . $action ), $name, $table, $upgrade );
|
417 |
-
}
|
418 |
-
}
|
419 |
-
}
|
420 |
-
}
|
421 |
-
|
422 |
-
/**
|
423 |
-
* Apply upgrade action
|
424 |
-
* Truncate table
|
425 |
-
*
|
426 |
-
* @global wpdb $wpdb
|
427 |
-
* @param string $name Table name.
|
428 |
-
*/
|
429 |
-
public static function upgrade_action_truncate( $name ) {
|
430 |
-
global $wpdb;
|
431 |
-
$wpdb->query( "TRUNCATE `{$name}`" ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
432 |
-
}
|
433 |
-
|
434 |
-
/**
|
435 |
-
* Apply upgrade action
|
436 |
-
* Drop table
|
437 |
-
*
|
438 |
-
* @global wpdb $wpdb
|
439 |
-
* @param string $name Table name.
|
440 |
-
*/
|
441 |
-
public static function upgrade_action_drop( $name ) {
|
442 |
-
global $wpdb;
|
443 |
-
$sql = sprintf( 'DROP TABLE IF EXISTS `%s`;', $name );
|
444 |
-
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
445 |
-
}
|
446 |
-
|
447 |
-
/**
|
448 |
-
* Apply upgrade action
|
449 |
-
* Rename table
|
450 |
-
*
|
451 |
-
* @global wpdb $wpdb
|
452 |
-
* @param string $name Table name.
|
453 |
-
* @param array $table Not used.
|
454 |
-
* @param array $upgrade Upgrade fields.
|
455 |
-
* @return boolean
|
456 |
-
*/
|
457 |
-
public static function upgrade_action_rename_table( $name, $table, $upgrade ) {
|
458 |
-
global $wpdb;
|
459 |
-
if ( ! array_key_exists( 'from', $upgrade ) ) {
|
460 |
-
return false;
|
461 |
-
}
|
462 |
-
$_name = self::$wpdb_prefix . self::$
|
463 |
-
|
464 |
-
$_t_name = $wpdb->get_var( "SHOW TABLES LIKE '{$_name}'" ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
465 |
-
if ( $_t_name == $_name ) { // WPCS: loose comparison ok.
|
466 |
-
self::upgrade_action_drop( $name );
|
467 |
-
}
|
468 |
-
$wpdb->query( sprintf( 'RENAME TABLE `%s` TO `%s`;', $_name, $name ) ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
469 |
-
}
|
470 |
-
|
471 |
-
/**
|
472 |
-
* Apply upgrade action
|
473 |
-
* Update fields table
|
474 |
-
*
|
475 |
-
* @global wpdb $wpdb
|
476 |
-
* @param string $name Table name.
|
477 |
-
* @param array $table Table array.
|
478 |
-
*/
|
479 |
-
public static function upgrade_action_update_fields( $name, $table ) {
|
480 |
-
global $wpdb;
|
481 |
-
|
482 |
-
$_fields = self::upgrade_get_columns( $name );
|
483 |
-
$fields = $table['field'];
|
484 |
-
|
485 |
-
// Search excess fields.
|
486 |
-
foreach ( $_fields as $field => $attr ) {
|
487 |
-
if ( ! array_key_exists( $field, $fields ) ) {
|
488 |
-
$sql = sprintf( 'ALTER TABLE `%s` DROP COLUMN `%s`;', $name, $field );
|
489 |
-
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
490 |
-
}
|
491 |
-
}
|
492 |
-
|
493 |
-
$prev_field = '';
|
494 |
-
|
495 |
-
foreach ( $fields as $field => $attr ) {
|
496 |
-
$attr = self::field( $field, $attr );
|
497 |
-
|
498 |
-
$sql = sprintf( 'ALTER TABLE `%s` MODIFY %s;', $name, $attr );
|
499 |
-
if ( ! array_key_exists( $field, $_fields ) ) {
|
500 |
-
$_prev_field = empty( $prev_field ) ? '' : " AFTER `{$prev_field}`";
|
501 |
-
$sql = sprintf( 'ALTER TABLE `%s` ADD %s;', $name, $attr . $_prev_field );
|
502 |
-
}
|
503 |
-
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
504 |
-
|
505 |
-
$prev_field = $field;
|
506 |
-
}
|
507 |
-
}
|
508 |
-
|
509 |
-
/**
|
510 |
-
* Apply upgrade action
|
511 |
-
* Update field table
|
512 |
-
*
|
513 |
-
* @global wpdb $wpdb
|
514 |
-
* @param string $name Table name.
|
515 |
-
* @param array $table Table array.
|
516 |
-
* @param array $upgrade Upgrade fields.
|
517 |
-
* @return boolean
|
518 |
-
*/
|
519 |
-
public static function upgrade_action_update_field( $name, $table, $upgrade ) {
|
520 |
-
global $wpdb;
|
521 |
-
if ( ! array_key_exists( 'field', $upgrade ) ) {
|
522 |
-
return false;
|
523 |
-
}
|
524 |
-
$name_field = $upgrade['field'];
|
525 |
-
|
526 |
-
$_fields = self::upgrade_get_columns( $name );
|
527 |
-
$fields = $table['field'];
|
528 |
-
|
529 |
-
$sql = '';
|
530 |
-
|
531 |
-
if ( array_key_exists( $name_field, $fields ) ) {
|
532 |
-
$prev_field = '';
|
533 |
-
foreach ( $fields as $field => $attr ) {
|
534 |
-
if ( $name_field == $field ) { // WPCS: loose comparison ok.
|
535 |
-
break;
|
536 |
-
}
|
537 |
-
$prev_field = $field;
|
538 |
-
}
|
539 |
-
|
540 |
-
$attr = self::field( $name_field, $fields[ $name_field ] );
|
541 |
-
|
542 |
-
$sql = sprintf( 'ALTER TABLE `%s` MODIFY %s;', $name, $attr );
|
543 |
-
if ( ! array_key_exists( $name_field, $_fields ) ) {
|
544 |
-
$_prev_field = empty( $prev_field ) ? '' : " AFTER `{$prev_field}`";
|
545 |
-
$sql = sprintf( 'ALTER TABLE `%s` ADD %s;', $name, $attr . $_prev_field );
|
546 |
-
}
|
547 |
-
} else {
|
548 |
-
if ( ! array_key_exists( $name_field, $fields ) ) {
|
549 |
-
$sql = sprintf( 'ALTER TABLE `%s` DROP COLUMN `%s`;', $name, $name_field );
|
550 |
-
}
|
551 |
-
}
|
552 |
-
if ( ! empty( $sql ) ) {
|
553 |
-
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
554 |
-
}
|
555 |
-
}
|
556 |
-
|
557 |
-
/**
|
558 |
-
* Apply upgrade action
|
559 |
-
* Rename field.
|
560 |
-
*
|
561 |
-
* @global wpdb $wpdb
|
562 |
-
* @param string $name Table name.
|
563 |
-
* @param array $table Table array.
|
564 |
-
* @param array $upgrade Upgrade fields.
|
565 |
-
* @return boolean
|
566 |
-
*/
|
567 |
-
public static function upgrade_action_rename_field( $name, $table, $upgrade ) {
|
568 |
-
global $wpdb;
|
569 |
-
if ( ! array_key_exists( 'from', $upgrade ) || ! array_key_exists( 'to', $upgrade ) ) {
|
570 |
-
return false;
|
571 |
-
}
|
572 |
-
$old_field = $upgrade['from'];
|
573 |
-
$new_field = $upgrade['to'];
|
574 |
-
|
575 |
-
$_fields = self::upgrade_get_columns( $name );
|
576 |
-
$fields = $table['field'];
|
577 |
-
|
578 |
-
if ( ! array_key_exists( $old_field, $_fields ) || ! array_key_exists( $new_field, $fields ) ) {
|
579 |
-
return false;
|
580 |
-
}
|
581 |
-
|
582 |
-
if ( array_key_exists( $new_field, $_fields ) ) {
|
583 |
-
$sql = sprintf( 'ALTER TABLE `%s` DROP COLUMN `%s`;', $name, $new_field );
|
584 |
-
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
585 |
-
}
|
586 |
-
|
587 |
-
$attr = self::field( $new_field, $fields[ $new_field ] );
|
588 |
-
|
589 |
-
$sql = sprintf( 'ALTER TABLE `%s` CHANGE `%s` %s;', $name, $old_field, $attr );
|
590 |
-
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
591 |
-
return true;
|
592 |
-
}
|
593 |
-
|
594 |
-
/**
|
595 |
-
* Apply upgrade action
|
596 |
-
* Use sql.
|
597 |
-
*
|
598 |
-
* @global wpdb $wpdb
|
599 |
-
* @param string $name Table name.
|
600 |
-
* @param array $table Not used.
|
601 |
-
* @param array $upgrade Upgrade fields.
|
602 |
-
* @return boolean
|
603 |
-
*/
|
604 |
-
public static function upgrade_action_sql( $name, $table, $upgrade ) {
|
605 |
-
global $wpdb;
|
606 |
-
if ( ! array_key_exists( 'sql', $upgrade ) ) {
|
607 |
-
return false;
|
608 |
-
}
|
609 |
-
$name = self::$wpdb_prefix . self::$
|
610 |
-
|
611 |
-
$wpdb->query( str_replace( '{table_name}', $name, $upgrade['sql'] ) ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
612 |
-
}
|
613 |
-
|
614 |
-
/**
|
615 |
-
* Destroy tables from array
|
616 |
-
*
|
617 |
-
* @global wpdb $wpdb
|
618 |
-
* @param type $tables Array tables.
|
619 |
-
* @return boolean
|
620 |
-
*/
|
621 |
-
public static function destroy( $tables ) {
|
622 |
-
global $wpdb;
|
623 |
-
self::$wpdb_prefix = $wpdb->prefix;
|
624 |
-
|
625 |
-
foreach ( $tables as $name => $table ) {
|
626 |
-
$table = self::$wpdb_prefix . self::$
|
627 |
-
$sql = sprintf( 'DROP TABLE IF EXISTS `%s`;', $table );
|
628 |
-
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
629 |
-
}
|
630 |
-
|
631 |
-
delete_option( self::$
|
632 |
-
|
633 |
-
return true;
|
634 |
-
}
|
635 |
-
|
636 |
-
/**
|
637 |
-
* Predefined fields attributes
|
638 |
-
*
|
639 |
-
* @return array
|
640 |
-
*/
|
641 |
-
public static function column_database() {
|
642 |
-
/**
|
643 |
-
* Array format for fields
|
644 |
-
*
|
645 |
-
* @param string TYPE
|
646 |
-
* @param integer|string SIZE
|
647 |
-
* @param boolean NULL
|
648 |
-
* @param integer|string DEFAULT
|
649 |
-
* @param boolean AUTO_INCREMENT
|
650 |
-
*/
|
651 |
-
return array(
|
652 |
-
'first++' => array( 'INT', null, false, null, true ),
|
653 |
-
'int_0' => array( 'INT', null, false, 0 ),
|
654 |
-
'int_1' => array( 'INT', null, false, 1 ),
|
655 |
-
'text' => array( 'TEXT' ),
|
656 |
-
'longtext' => array( 'LONGTEXT' ),
|
657 |
-
'date' => array( 'DATETIME', null, false, '0000-00-00 00:00:00' ),
|
658 |
-
'bool' => array( 'TINYINT', 1, false, 1 ),
|
659 |
-
);
|
660 |
-
}
|
661 |
-
|
662 |
-
/**
|
663 |
-
* Database
|
664 |
-
*
|
665 |
-
* @since 1.0.0
|
666 |
-
* @return array
|
667 |
-
*/
|
668 |
-
private static function database_1_0_0() {
|
669 |
-
$t = array(
|
670 |
-
'status' => array( 'VARCHAR', 20, false, 'public' ),
|
671 |
-
'type' => array( 'VARCHAR', 20, false, 'list' ),
|
672 |
-
'key_elem' => array( 'VARCHAR', 45 ),
|
673 |
-
'key_user' => array( 'TINYINT', 1, false, 7 ),
|
674 |
-
);
|
675 |
-
return array(
|
676 |
-
'lists' => array(
|
677 |
-
'field' => array(
|
678 |
-
'ID' => 'first++',
|
679 |
-
'author' => 'int_0',
|
680 |
-
'date' => 'date',
|
681 |
-
'title' => 'text',
|
682 |
-
'status' => $t['status'],
|
683 |
-
'type' => $t['type'],
|
684 |
-
'share_key' => $t['key_elem'],
|
685 |
-
),
|
686 |
-
),
|
687 |
-
'items' => array(
|
688 |
-
'field' => array(
|
689 |
-
'ID' => 'first++',
|
690 |
-
'wishlist_id' => 'int_0',
|
691 |
-
'product_id' => 'int_0',
|
692 |
-
'variation_id' => 'int_0',
|
693 |
-
'author' => 'int_0',
|
694 |
-
'date' => 'date',
|
695 |
-
'quantity' => 'int_1',
|
696 |
-
'price' => $t['key_elem'],
|
697 |
-
'in_stock' => 'bool',
|
698 |
-
),
|
699 |
-
),
|
700 |
-
);
|
701 |
-
}
|
702 |
-
|
703 |
-
/**
|
704 |
-
* Database
|
705 |
-
*
|
706 |
-
* @since 1.5.0
|
707 |
-
* @return array
|
708 |
-
*/
|
709 |
-
private static function database_1_5_0() {
|
710 |
-
return array(
|
711 |
-
'items' => array(
|
712 |
-
'field' => array(
|
713 |
-
'ID' => 'first++',
|
714 |
-
'wishlist_id' => 'int_0',
|
715 |
-
'product_id' => 'int_0',
|
716 |
-
'variation_id' => 'int_0',
|
717 |
-
'formdata' => 'text',
|
718 |
-
'author' => 'int_0',
|
719 |
-
'date' => 'date',
|
720 |
-
'quantity' => 'int_1',
|
721 |
-
'price' => array( 'VARCHAR', 255 ),
|
722 |
-
'in_stock' => 'bool',
|
723 |
-
),
|
724 |
-
'upgrade' => array(
|
725 |
-
array(
|
726 |
-
'action' => 'update_fields',
|
727 |
-
),
|
728 |
-
),
|
729 |
-
),
|
730 |
-
);
|
731 |
-
}
|
732 |
-
|
733 |
-
/**
|
734 |
-
* Set localisation
|
735 |
-
*/
|
736 |
-
private static function set_locale() {
|
737 |
-
$locale = apply_filters( 'plugin_locale', get_locale(), TINVWL_DOMAIN );
|
738 |
-
$mofile = sprintf( '%1$s-%2$s.mo', TINVWL_DOMAIN, $locale );
|
739 |
-
$mofiles = array();
|
740 |
-
|
741 |
-
$mofiles[] = WP_LANG_DIR . DIRECTORY_SEPARATOR . basename( TINVWL_PATH ) . DIRECTORY_SEPARATOR . $mofile;
|
742 |
-
$mofiles[] = WP_LANG_DIR . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . $mofile;
|
743 |
-
$mofiles[] = TINVWL_PATH . 'languages' . DIRECTORY_SEPARATOR . $mofile;
|
744 |
-
foreach ( $mofiles as $mofile ) {
|
745 |
-
if ( file_exists( $mofile ) && load_textdomain( TINVWL_DOMAIN, $mofile ) ) {
|
746 |
-
return;
|
747 |
-
}
|
748 |
-
}
|
749 |
-
|
750 |
-
load_plugin_textdomain( TINVWL_DOMAIN, false, basename( TINVWL_PATH ) . DIRECTORY_SEPARATOR . 'languages' );
|
751 |
-
}
|
752 |
-
|
753 |
-
/**
|
754 |
-
* Load default data
|
755 |
-
*/
|
756 |
-
public static function load_data() {
|
757 |
-
self::set_locale();
|
758 |
-
$settings = tinv_get_option_defaults( 'all' );
|
759 |
-
foreach ( $settings as $setting => $array ) {
|
760 |
-
add_option( sprintf( '%s-%s', self::$
|
761 |
-
}
|
762 |
-
}
|
763 |
-
|
764 |
-
/**
|
765 |
-
* Upgrade default data
|
766 |
-
*/
|
767 |
-
public static function upgrade_data() {
|
768 |
-
self::set_locale();
|
769 |
-
$settings = tinv_get_option_defaults( 'all' );
|
770 |
-
foreach ( $settings as $setting => $array ) {
|
771 |
-
$_array = get_option( sprintf( '%s-%s', self::$
|
772 |
-
if ( false === $_array ) {
|
773 |
-
add_option( sprintf( '%s-%s', self::$
|
774 |
-
} else {
|
775 |
-
$need_upgrade = false;
|
776 |
-
foreach ( (array) $array as $key => $value ) {
|
777 |
-
if ( ! array_key_exists( $key, (array) $_array ) ) {
|
778 |
-
$_array[ $key ] = $value;
|
779 |
-
$need_upgrade = true;
|
780 |
-
}
|
781 |
-
}
|
782 |
-
if ( $need_upgrade ) {
|
783 |
-
update_option( sprintf( '%s-%s', self::$
|
784 |
-
}
|
785 |
-
}
|
786 |
-
}
|
787 |
-
}
|
788 |
-
|
789 |
-
/**
|
790 |
-
* Unload default data
|
791 |
-
*/
|
792 |
-
public static function unload_data() {
|
793 |
-
$settings = array_keys( tinv_get_option_defaults( 'all' ) );
|
794 |
-
foreach ( $settings as $setting ) {
|
795 |
-
delete_option( sprintf( '%s-%s', self::$
|
796 |
-
}
|
797 |
-
delete_option( self::$
|
798 |
-
delete_option( self::$
|
799 |
-
}
|
800 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Activation/Deactivation plugin class
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Activation/Deactivation plugin class
|
16 |
+
*/
|
17 |
+
class TInvWL_Activator {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Plugin name
|
21 |
+
*
|
22 |
+
* @var string Using defined constant.
|
23 |
+
*/
|
24 |
+
static $_name = TINVWL_PREFIX;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Prefix database
|
28 |
+
*
|
29 |
+
* @see wpdb
|
30 |
+
* @var string
|
31 |
+
*/
|
32 |
+
static $wpdb_prefix;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Database version
|
36 |
+
*
|
37 |
+
* @var string
|
38 |
+
*/
|
39 |
+
static $_version = TINVWL_FVERSION;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Current installed database version
|
43 |
+
*
|
44 |
+
* @var string
|
45 |
+
*/
|
46 |
+
static $_prev;
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Regular expression for sorting database version function
|
50 |
+
*
|
51 |
+
* @var string
|
52 |
+
*/
|
53 |
+
const REGEXP = '/^database_/i';
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Method activation plugin.
|
57 |
+
*/
|
58 |
+
public static function activate() {
|
59 |
+
if ( self::update() ) {
|
60 |
+
return false;
|
61 |
+
}
|
62 |
+
if ( is_null( get_option( self::$_name . '_db_ver', null ) ) ) {
|
63 |
+
TInvWL_WizardSetup::setup();
|
64 |
+
}
|
65 |
+
self::database();
|
66 |
+
self::load_data();
|
67 |
+
TInvWL_Public_TInvWL::update_rewrite_rules();
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Method deactivation plugin.
|
72 |
+
*/
|
73 |
+
public static function uninstall() {
|
74 |
+
self::database( 'destroy' );
|
75 |
+
self::unload_data();
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Method update plugin.
|
80 |
+
*/
|
81 |
+
public static function update() {
|
82 |
+
$current_version = get_option( self::$_name . '_db_ver', self::$_version );
|
83 |
+
if ( version_compare( self::$_version, $current_version, 'gt' ) ) {
|
84 |
+
self::database( 'upgrade', $current_version );
|
85 |
+
self::upgrade_data();
|
86 |
+
TInvWL_Public_TInvWL::update_rewrite_rules();
|
87 |
+
return true;
|
88 |
+
}
|
89 |
+
return false;
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Require function database and apply method
|
94 |
+
*
|
95 |
+
* @param string $action create|destroy.
|
96 |
+
* @param string $prev Current installed version.
|
97 |
+
*/
|
98 |
+
private static function database( $action = 'create', $prev = 'f.0' ) {
|
99 |
+
|
100 |
+
$activator = new TInvWL_Activator();
|
101 |
+
$lists = get_class_methods( $activator );
|
102 |
+
unset( $activator );
|
103 |
+
|
104 |
+
self::$_prev = $prev;
|
105 |
+
$lists = array_filter( $lists, array( __CLASS__, 'filter_database' ) );
|
106 |
+
uasort( $lists, array( __CLASS__, 'sort_database' ) );
|
107 |
+
|
108 |
+
$tables = array();
|
109 |
+
foreach ( $lists as $method ) {
|
110 |
+
$tables = self::merge_database( $tables, $method );
|
111 |
+
}
|
112 |
+
if ( ! empty( $tables ) && is_array( $tables ) ) {
|
113 |
+
self::$action( $tables );
|
114 |
+
}
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* Merge table wit upgrade attributes
|
119 |
+
*
|
120 |
+
* @param array $tables1 Collecting tables.
|
121 |
+
* @param string $method Method for get new tables.
|
122 |
+
* @return array
|
123 |
+
*/
|
124 |
+
public static function merge_database( $tables1, $method ) {
|
125 |
+
$tables2 = self::$method();
|
126 |
+
foreach ( (array) $tables2 as $name => $table ) {
|
127 |
+
if ( empty( $table ) ) {
|
128 |
+
continue;
|
129 |
+
}
|
130 |
+
if ( array_key_exists( 'upgrade', $table ) ) {
|
131 |
+
$_upgrade = $table['upgrade'];
|
132 |
+
$table['upgrade'] = array();
|
133 |
+
$table['upgrade'][ self::pre_database( $method ) ] = $_upgrade;
|
134 |
+
}
|
135 |
+
if ( array_key_exists( $name, $tables1 ) ) {
|
136 |
+
if ( ! array_key_exists( 'upgrade', $tables1[ $name ] ) ) {
|
137 |
+
$tables1[ $name ]['upgrade'] = array();
|
138 |
+
}
|
139 |
+
if ( ! array_key_exists( 'upgrade', $table ) ) {
|
140 |
+
$table['upgrade'] = array();
|
141 |
+
}
|
142 |
+
$table['upgrade'] = tinv_array_merge( $tables1[ $name ]['upgrade'], $table['upgrade'] );
|
143 |
+
}
|
144 |
+
if ( empty( $table['field'] ) ) {
|
145 |
+
$tables1[ $name ]['upgrade'] = $table['upgrade'];
|
146 |
+
} else {
|
147 |
+
$tables1[ $name ] = $table;
|
148 |
+
}
|
149 |
+
}
|
150 |
+
return $tables1;
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Filter methods for creating database
|
155 |
+
*
|
156 |
+
* @param string $method Method name from this class.
|
157 |
+
* @return boolean
|
158 |
+
*/
|
159 |
+
public static function filter_database( $method ) {
|
160 |
+
if ( ! preg_match( self::REGEXP, $method ) ) {
|
161 |
+
return false;
|
162 |
+
}
|
163 |
+
if ( version_compare( self::$_prev, self::pre_database( $method ), 'ge' ) ) {
|
164 |
+
return false;
|
165 |
+
}
|
166 |
+
return version_compare( self::$_version, self::pre_database( $method ), 'ge' );
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Sort methods for creating database
|
171 |
+
*
|
172 |
+
* @param string $method1 Method name first from this class.
|
173 |
+
* @param string $method2 Method name second from this class.
|
174 |
+
* @return type
|
175 |
+
*/
|
176 |
+
public static function sort_database( $method1, $method2 ) {
|
177 |
+
return version_compare( self::pre_database( $method1 ), self::pre_database( $method2 ) );
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Convert method name to version
|
182 |
+
*
|
183 |
+
* @param string $method Method name from this class.
|
184 |
+
* @return string
|
185 |
+
*/
|
186 |
+
public static function pre_database( $method ) {
|
187 |
+
$method = preg_replace( self::REGEXP, '', $method );
|
188 |
+
$method = str_replace( '_', '.', $method );
|
189 |
+
return $method;
|
190 |
+
}
|
191 |
+
|
192 |
+
/**
|
193 |
+
* Creation SQL request for creation table
|
194 |
+
*
|
195 |
+
* @param string $name Name Table.
|
196 |
+
* @param array $table Structured array table.
|
197 |
+
* array 'field' Array fields.
|
198 |
+
* string 'charset' Charset table.
|
199 |
+
* string 'key' Primary key.
|
200 |
+
* string 'post' Custom elements in format SQL.
|
201 |
+
* @return string
|
202 |
+
*/
|
203 |
+
public static function table( $name, $table ) {
|
204 |
+
$name = self::$wpdb_prefix . self::$_name . '_' . $name;
|
205 |
+
$fields = $table['field'];
|
206 |
+
$table = filter_var_array( $table, array(
|
207 |
+
'charset' => FILTER_SANITIZE_STRING,
|
208 |
+
'key' => FILTER_SANITIZE_STRING,
|
209 |
+
'post' => FILTER_DEFAULT,
|
210 |
+
) );
|
211 |
+
|
212 |
+
$table['charset'] = ( empty( $table['charset'] ) ) ? 'utf8' : $table['charset'];
|
213 |
+
$table['charset'] = sprintf( 'DEFAULT CHARSET=%s', $table['charset'] );
|
214 |
+
|
215 |
+
$keys = array_keys( $fields );
|
216 |
+
if ( ! in_array( $table['key'], $keys ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
217 |
+
$table['key'] = null;
|
218 |
+
}
|
219 |
+
$t = self::column_database();
|
220 |
+
foreach ( $fields as $key => $flags ) {
|
221 |
+
if ( is_string( $flags ) ) {
|
222 |
+
if ( array_key_exists( $flags, $t ) ) {
|
223 |
+
$flags = $t[ $flags ];
|
224 |
+
} else {
|
225 |
+
$flags = $t['text'];
|
226 |
+
}
|
227 |
+
}
|
228 |
+
$fields[ $key ] = $flags;
|
229 |
+
}
|
230 |
+
if ( empty( $table['key'] ) ) {
|
231 |
+
foreach ( $fields as $key => $flags ) {
|
232 |
+
if ( array_key_exists( 4, $flags ) ) {
|
233 |
+
if ( $flags[4] ) {
|
234 |
+
$table['key'] = $key;
|
235 |
+
break;
|
236 |
+
}
|
237 |
+
}
|
238 |
+
}
|
239 |
+
if ( empty( $table['key'] ) ) {
|
240 |
+
foreach ( $keys as $key ) {
|
241 |
+
if ( preg_match( '/id$/i', $key ) ) {
|
242 |
+
$table['key'] = $key;
|
243 |
+
break;
|
244 |
+
}
|
245 |
+
}
|
246 |
+
}
|
247 |
+
}
|
248 |
+
unset( $keys );
|
249 |
+
if ( empty( $table['key'] ) ) {
|
250 |
+
$table['key'] = '';
|
251 |
+
} else {
|
252 |
+
$table['key'] = sprintf( ', PRIMARY KEY (`%s`)', $table['key'] );
|
253 |
+
}
|
254 |
+
|
255 |
+
if ( empty( $table['post'] ) ) {
|
256 |
+
$table['post'] = '';
|
257 |
+
} else {
|
258 |
+
$table['post'] = ', ' . $table['post'];
|
259 |
+
}
|
260 |
+
|
261 |
+
foreach ( $fields as $key => $format ) {
|
262 |
+
$fields[ $key ] = self::field( $key, $format );
|
263 |
+
}
|
264 |
+
$fields = implode( ', ', $fields );
|
265 |
+
|
266 |
+
$sql = sprintf( 'CREATE TABLE IF NOT EXISTS `%s` ( %s%s%s) %s; ', $name, $fields, $table['key'], $table['post'], $table['charset'] );
|
267 |
+
return $sql;
|
268 |
+
}
|
269 |
+
|
270 |
+
/**
|
271 |
+
* Created SQL field
|
272 |
+
*
|
273 |
+
* @param string $name Name field.
|
274 |
+
* @param array $newformat Structure field.
|
275 |
+
* string 0 Data Types column.
|
276 |
+
* integer|string 1 Length or Size column.
|
277 |
+
* boolean 2 is NULL?
|
278 |
+
* integer|string 3 Specifies a default value for a column.
|
279 |
+
* boolean 4 is AUTO_INCREMENT?.
|
280 |
+
* @return string
|
281 |
+
*/
|
282 |
+
public static function field( $name, $newformat ) {
|
283 |
+
$format = array( 'TEXT', null, false, null, false );
|
284 |
+
|
285 |
+
foreach ( $format as $key => $value ) {
|
286 |
+
if ( array_key_exists( $key, $newformat ) ) {
|
287 |
+
$format[ $key ] = $newformat[ $key ];
|
288 |
+
}
|
289 |
+
}
|
290 |
+
|
291 |
+
if ( ! is_null( $format[1] ) ) {
|
292 |
+
$format[1] = sprintf( '(%s)', $format[1] );
|
293 |
+
}
|
294 |
+
|
295 |
+
$format[2] = ( filter_var( $format[2], FILTER_VALIDATE_BOOLEAN ) ? '' : 'NOT ' ) . 'NULL';
|
296 |
+
|
297 |
+
if ( ! is_null( $format[3] ) ) {
|
298 |
+
if ( ! in_array( $format[3], array( 'CURRENT_TIMESTAMP' ) ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
299 |
+
$format[3] = is_string( $format[3] ) ? "'" . $format[3] . "'" : $format[3];
|
300 |
+
}
|
301 |
+
$format[3] = sprintf( 'DEFAULT %s', $format[3] );
|
302 |
+
}
|
303 |
+
|
304 |
+
$format[4] = ( filter_var( $format[4], FILTER_VALIDATE_BOOLEAN ) ? 'AUTO_INCREMENT' : null );
|
305 |
+
|
306 |
+
array_unshift( $format, '`' . $name . '`' );
|
307 |
+
$format = array_filter( $format );
|
308 |
+
return implode( ' ', $format );
|
309 |
+
}
|
310 |
+
|
311 |
+
/**
|
312 |
+
* Created tables from array
|
313 |
+
*
|
314 |
+
* @global wpdb $wpdb
|
315 |
+
* @param array $tables Array tables.
|
316 |
+
* @return boolean
|
317 |
+
*/
|
318 |
+
public static function create( $tables ) {
|
319 |
+
global $wpdb;
|
320 |
+
self::$wpdb_prefix = $wpdb->prefix;
|
321 |
+
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
322 |
+
|
323 |
+
foreach ( $tables as $name => $table ) {
|
324 |
+
if ( array_key_exists( 'field', $table ) && ! empty( $table['field'] ) ) {
|
325 |
+
$table = self::table( $name, $table );
|
326 |
+
$tables[ $name ] = dbDelta( $table );
|
327 |
+
}
|
328 |
+
}
|
329 |
+
|
330 |
+
add_option( self::$_name . '_db_ver', self::$_version );
|
331 |
+
|
332 |
+
return true;
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Upgrade tables from array
|
337 |
+
*
|
338 |
+
* @global wpdb $wpdb
|
339 |
+
* @param array $tables Array tables.
|
340 |
+
* @return boolean
|
341 |
+
*/
|
342 |
+
public static function upgrade( $tables ) {
|
343 |
+
|
344 |
+
self::create( $tables );
|
345 |
+
|
346 |
+
foreach ( $tables as $name => $table ) {
|
347 |
+
self::upgrade_action( $name, $table );
|
348 |
+
}
|
349 |
+
|
350 |
+
update_option( self::$_name . '_db_ver', self::$_version );
|
351 |
+
|
352 |
+
return true;
|
353 |
+
}
|
354 |
+
|
355 |
+
/**
|
356 |
+
* Get columns for exist table.
|
357 |
+
*
|
358 |
+
* @global wpdb $wpdb
|
359 |
+
* @param string $name Table name.
|
360 |
+
* @return array
|
361 |
+
*/
|
362 |
+
public static function upgrade_get_columns( $name ) {
|
363 |
+
global $wpdb;
|
364 |
+
|
365 |
+
$_fields = array();
|
366 |
+
$fields = $wpdb->get_results( "DESCRIBE `{$name}`", ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
367 |
+
foreach ( $fields as $field ) {
|
368 |
+
$_fields[ $field['Field'] ] = $field;
|
369 |
+
}
|
370 |
+
return $_fields;
|
371 |
+
}
|
372 |
+
|
373 |
+
/**
|
374 |
+
* Apply upgrade action
|
375 |
+
*
|
376 |
+
* @global wpdb $wpdb
|
377 |
+
* @param string $name Name Table.
|
378 |
+
* @param array $table Structured array table.
|
379 |
+
* @return boolean
|
380 |
+
*/
|
381 |
+
public static function upgrade_action( $name, $table ) {
|
382 |
+
|
383 |
+
if ( ! array_key_exists( 'upgrade' , $table ) ) {
|
384 |
+
return false;
|
385 |
+
}
|
386 |
+
|
387 |
+
$t = self::column_database();
|
388 |
+
foreach ( $table['field'] as $key => $flags ) {
|
389 |
+
if ( is_string( $flags ) ) {
|
390 |
+
if ( array_key_exists( $flags, $t ) ) {
|
391 |
+
$flags = $t[ $flags ];
|
392 |
+
} else {
|
393 |
+
$flags = $t['text'];
|
394 |
+
}
|
395 |
+
$table['field'][ $key ] = $flags;
|
396 |
+
}
|
397 |
+
}
|
398 |
+
$name = self::$wpdb_prefix . self::$_name . '_' . $name;
|
399 |
+
$upgrades = (array) $table['upgrade'];
|
400 |
+
foreach ( $upgrades as $ver_upgrades ) {
|
401 |
+
foreach ( $ver_upgrades as $upgrade ) {
|
402 |
+
$action = $upgrade;
|
403 |
+
if ( is_array( $upgrade ) ) {
|
404 |
+
$action = $upgrade['action'];
|
405 |
+
unset( $upgrade['action'] );
|
406 |
+
}
|
407 |
+
if ( ! is_string( $action ) ) {
|
408 |
+
continue;
|
409 |
+
}
|
410 |
+
$action = preg_replace( '/[^a-z0-9_]/i', '', (string) $action );
|
411 |
+
if ( empty( $action ) ) {
|
412 |
+
continue;
|
413 |
+
}
|
414 |
+
|
415 |
+
if ( method_exists( __CLASS__, __FUNCTION__ . '_' . $action ) ) {
|
416 |
+
call_user_func( array( __CLASS__, __FUNCTION__ . '_' . $action ), $name, $table, $upgrade );
|
417 |
+
}
|
418 |
+
}
|
419 |
+
}
|
420 |
+
}
|
421 |
+
|
422 |
+
/**
|
423 |
+
* Apply upgrade action
|
424 |
+
* Truncate table
|
425 |
+
*
|
426 |
+
* @global wpdb $wpdb
|
427 |
+
* @param string $name Table name.
|
428 |
+
*/
|
429 |
+
public static function upgrade_action_truncate( $name ) {
|
430 |
+
global $wpdb;
|
431 |
+
$wpdb->query( "TRUNCATE `{$name}`" ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
432 |
+
}
|
433 |
+
|
434 |
+
/**
|
435 |
+
* Apply upgrade action
|
436 |
+
* Drop table
|
437 |
+
*
|
438 |
+
* @global wpdb $wpdb
|
439 |
+
* @param string $name Table name.
|
440 |
+
*/
|
441 |
+
public static function upgrade_action_drop( $name ) {
|
442 |
+
global $wpdb;
|
443 |
+
$sql = sprintf( 'DROP TABLE IF EXISTS `%s`;', $name );
|
444 |
+
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
445 |
+
}
|
446 |
+
|
447 |
+
/**
|
448 |
+
* Apply upgrade action
|
449 |
+
* Rename table
|
450 |
+
*
|
451 |
+
* @global wpdb $wpdb
|
452 |
+
* @param string $name Table name.
|
453 |
+
* @param array $table Not used.
|
454 |
+
* @param array $upgrade Upgrade fields.
|
455 |
+
* @return boolean
|
456 |
+
*/
|
457 |
+
public static function upgrade_action_rename_table( $name, $table, $upgrade ) {
|
458 |
+
global $wpdb;
|
459 |
+
if ( ! array_key_exists( 'from', $upgrade ) ) {
|
460 |
+
return false;
|
461 |
+
}
|
462 |
+
$_name = self::$wpdb_prefix . self::$_name . '_' . $upgrade['from'];
|
463 |
+
|
464 |
+
$_t_name = $wpdb->get_var( "SHOW TABLES LIKE '{$_name}'" ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
465 |
+
if ( $_t_name == $_name ) { // WPCS: loose comparison ok.
|
466 |
+
self::upgrade_action_drop( $name );
|
467 |
+
}
|
468 |
+
$wpdb->query( sprintf( 'RENAME TABLE `%s` TO `%s`;', $_name, $name ) ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
469 |
+
}
|
470 |
+
|
471 |
+
/**
|
472 |
+
* Apply upgrade action
|
473 |
+
* Update fields table
|
474 |
+
*
|
475 |
+
* @global wpdb $wpdb
|
476 |
+
* @param string $name Table name.
|
477 |
+
* @param array $table Table array.
|
478 |
+
*/
|
479 |
+
public static function upgrade_action_update_fields( $name, $table ) {
|
480 |
+
global $wpdb;
|
481 |
+
|
482 |
+
$_fields = self::upgrade_get_columns( $name );
|
483 |
+
$fields = $table['field'];
|
484 |
+
|
485 |
+
// Search excess fields.
|
486 |
+
foreach ( $_fields as $field => $attr ) {
|
487 |
+
if ( ! array_key_exists( $field, $fields ) ) {
|
488 |
+
$sql = sprintf( 'ALTER TABLE `%s` DROP COLUMN `%s`;', $name, $field );
|
489 |
+
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
490 |
+
}
|
491 |
+
}
|
492 |
+
|
493 |
+
$prev_field = '';
|
494 |
+
|
495 |
+
foreach ( $fields as $field => $attr ) {
|
496 |
+
$attr = self::field( $field, $attr );
|
497 |
+
|
498 |
+
$sql = sprintf( 'ALTER TABLE `%s` MODIFY %s;', $name, $attr );
|
499 |
+
if ( ! array_key_exists( $field, $_fields ) ) {
|
500 |
+
$_prev_field = empty( $prev_field ) ? '' : " AFTER `{$prev_field}`";
|
501 |
+
$sql = sprintf( 'ALTER TABLE `%s` ADD %s;', $name, $attr . $_prev_field );
|
502 |
+
}
|
503 |
+
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
504 |
+
|
505 |
+
$prev_field = $field;
|
506 |
+
}
|
507 |
+
}
|
508 |
+
|
509 |
+
/**
|
510 |
+
* Apply upgrade action
|
511 |
+
* Update field table
|
512 |
+
*
|
513 |
+
* @global wpdb $wpdb
|
514 |
+
* @param string $name Table name.
|
515 |
+
* @param array $table Table array.
|
516 |
+
* @param array $upgrade Upgrade fields.
|
517 |
+
* @return boolean
|
518 |
+
*/
|
519 |
+
public static function upgrade_action_update_field( $name, $table, $upgrade ) {
|
520 |
+
global $wpdb;
|
521 |
+
if ( ! array_key_exists( 'field', $upgrade ) ) {
|
522 |
+
return false;
|
523 |
+
}
|
524 |
+
$name_field = $upgrade['field'];
|
525 |
+
|
526 |
+
$_fields = self::upgrade_get_columns( $name );
|
527 |
+
$fields = $table['field'];
|
528 |
+
|
529 |
+
$sql = '';
|
530 |
+
|
531 |
+
if ( array_key_exists( $name_field, $fields ) ) {
|
532 |
+
$prev_field = '';
|
533 |
+
foreach ( $fields as $field => $attr ) {
|
534 |
+
if ( $name_field == $field ) { // WPCS: loose comparison ok.
|
535 |
+
break;
|
536 |
+
}
|
537 |
+
$prev_field = $field;
|
538 |
+
}
|
539 |
+
|
540 |
+
$attr = self::field( $name_field, $fields[ $name_field ] );
|
541 |
+
|
542 |
+
$sql = sprintf( 'ALTER TABLE `%s` MODIFY %s;', $name, $attr );
|
543 |
+
if ( ! array_key_exists( $name_field, $_fields ) ) {
|
544 |
+
$_prev_field = empty( $prev_field ) ? '' : " AFTER `{$prev_field}`";
|
545 |
+
$sql = sprintf( 'ALTER TABLE `%s` ADD %s;', $name, $attr . $_prev_field );
|
546 |
+
}
|
547 |
+
} else {
|
548 |
+
if ( ! array_key_exists( $name_field, $fields ) ) {
|
549 |
+
$sql = sprintf( 'ALTER TABLE `%s` DROP COLUMN `%s`;', $name, $name_field );
|
550 |
+
}
|
551 |
+
}
|
552 |
+
if ( ! empty( $sql ) ) {
|
553 |
+
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
554 |
+
}
|
555 |
+
}
|
556 |
+
|
557 |
+
/**
|
558 |
+
* Apply upgrade action
|
559 |
+
* Rename field.
|
560 |
+
*
|
561 |
+
* @global wpdb $wpdb
|
562 |
+
* @param string $name Table name.
|
563 |
+
* @param array $table Table array.
|
564 |
+
* @param array $upgrade Upgrade fields.
|
565 |
+
* @return boolean
|
566 |
+
*/
|
567 |
+
public static function upgrade_action_rename_field( $name, $table, $upgrade ) {
|
568 |
+
global $wpdb;
|
569 |
+
if ( ! array_key_exists( 'from', $upgrade ) || ! array_key_exists( 'to', $upgrade ) ) {
|
570 |
+
return false;
|
571 |
+
}
|
572 |
+
$old_field = $upgrade['from'];
|
573 |
+
$new_field = $upgrade['to'];
|
574 |
+
|
575 |
+
$_fields = self::upgrade_get_columns( $name );
|
576 |
+
$fields = $table['field'];
|
577 |
+
|
578 |
+
if ( ! array_key_exists( $old_field, $_fields ) || ! array_key_exists( $new_field, $fields ) ) {
|
579 |
+
return false;
|
580 |
+
}
|
581 |
+
|
582 |
+
if ( array_key_exists( $new_field, $_fields ) ) {
|
583 |
+
$sql = sprintf( 'ALTER TABLE `%s` DROP COLUMN `%s`;', $name, $new_field );
|
584 |
+
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
585 |
+
}
|
586 |
+
|
587 |
+
$attr = self::field( $new_field, $fields[ $new_field ] );
|
588 |
+
|
589 |
+
$sql = sprintf( 'ALTER TABLE `%s` CHANGE `%s` %s;', $name, $old_field, $attr );
|
590 |
+
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
591 |
+
return true;
|
592 |
+
}
|
593 |
+
|
594 |
+
/**
|
595 |
+
* Apply upgrade action
|
596 |
+
* Use sql.
|
597 |
+
*
|
598 |
+
* @global wpdb $wpdb
|
599 |
+
* @param string $name Table name.
|
600 |
+
* @param array $table Not used.
|
601 |
+
* @param array $upgrade Upgrade fields.
|
602 |
+
* @return boolean
|
603 |
+
*/
|
604 |
+
public static function upgrade_action_sql( $name, $table, $upgrade ) {
|
605 |
+
global $wpdb;
|
606 |
+
if ( ! array_key_exists( 'sql', $upgrade ) ) {
|
607 |
+
return false;
|
608 |
+
}
|
609 |
+
$name = self::$wpdb_prefix . self::$_name . '_' . $name;
|
610 |
+
|
611 |
+
$wpdb->query( str_replace( '{table_name}', $name, $upgrade['sql'] ) ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
612 |
+
}
|
613 |
+
|
614 |
+
/**
|
615 |
+
* Destroy tables from array
|
616 |
+
*
|
617 |
+
* @global wpdb $wpdb
|
618 |
+
* @param type $tables Array tables.
|
619 |
+
* @return boolean
|
620 |
+
*/
|
621 |
+
public static function destroy( $tables ) {
|
622 |
+
global $wpdb;
|
623 |
+
self::$wpdb_prefix = $wpdb->prefix;
|
624 |
+
|
625 |
+
foreach ( $tables as $name => $table ) {
|
626 |
+
$table = self::$wpdb_prefix . self::$_name . '_' . $name;
|
627 |
+
$sql = sprintf( 'DROP TABLE IF EXISTS `%s`;', $table );
|
628 |
+
$wpdb->query( $sql ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
629 |
+
}
|
630 |
+
|
631 |
+
delete_option( self::$_name . '_db_ver' );
|
632 |
+
|
633 |
+
return true;
|
634 |
+
}
|
635 |
+
|
636 |
+
/**
|
637 |
+
* Predefined fields attributes
|
638 |
+
*
|
639 |
+
* @return array
|
640 |
+
*/
|
641 |
+
public static function column_database() {
|
642 |
+
/**
|
643 |
+
* Array format for fields
|
644 |
+
*
|
645 |
+
* @param string TYPE
|
646 |
+
* @param integer|string SIZE
|
647 |
+
* @param boolean NULL
|
648 |
+
* @param integer|string DEFAULT
|
649 |
+
* @param boolean AUTO_INCREMENT
|
650 |
+
*/
|
651 |
+
return array(
|
652 |
+
'first++' => array( 'INT', null, false, null, true ),
|
653 |
+
'int_0' => array( 'INT', null, false, 0 ),
|
654 |
+
'int_1' => array( 'INT', null, false, 1 ),
|
655 |
+
'text' => array( 'TEXT' ),
|
656 |
+
'longtext' => array( 'LONGTEXT' ),
|
657 |
+
'date' => array( 'DATETIME', null, false, '0000-00-00 00:00:00' ),
|
658 |
+
'bool' => array( 'TINYINT', 1, false, 1 ),
|
659 |
+
);
|
660 |
+
}
|
661 |
+
|
662 |
+
/**
|
663 |
+
* Database
|
664 |
+
*
|
665 |
+
* @since 1.0.0
|
666 |
+
* @return array
|
667 |
+
*/
|
668 |
+
private static function database_1_0_0() {
|
669 |
+
$t = array(
|
670 |
+
'status' => array( 'VARCHAR', 20, false, 'public' ),
|
671 |
+
'type' => array( 'VARCHAR', 20, false, 'list' ),
|
672 |
+
'key_elem' => array( 'VARCHAR', 45 ),
|
673 |
+
'key_user' => array( 'TINYINT', 1, false, 7 ),
|
674 |
+
);
|
675 |
+
return array(
|
676 |
+
'lists' => array(
|
677 |
+
'field' => array(
|
678 |
+
'ID' => 'first++',
|
679 |
+
'author' => 'int_0',
|
680 |
+
'date' => 'date',
|
681 |
+
'title' => 'text',
|
682 |
+
'status' => $t['status'],
|
683 |
+
'type' => $t['type'],
|
684 |
+
'share_key' => $t['key_elem'],
|
685 |
+
),
|
686 |
+
),
|
687 |
+
'items' => array(
|
688 |
+
'field' => array(
|
689 |
+
'ID' => 'first++',
|
690 |
+
'wishlist_id' => 'int_0',
|
691 |
+
'product_id' => 'int_0',
|
692 |
+
'variation_id' => 'int_0',
|
693 |
+
'author' => 'int_0',
|
694 |
+
'date' => 'date',
|
695 |
+
'quantity' => 'int_1',
|
696 |
+
'price' => $t['key_elem'],
|
697 |
+
'in_stock' => 'bool',
|
698 |
+
),
|
699 |
+
),
|
700 |
+
);
|
701 |
+
}
|
702 |
+
|
703 |
+
/**
|
704 |
+
* Database
|
705 |
+
*
|
706 |
+
* @since 1.5.0
|
707 |
+
* @return array
|
708 |
+
*/
|
709 |
+
private static function database_1_5_0() {
|
710 |
+
return array(
|
711 |
+
'items' => array(
|
712 |
+
'field' => array(
|
713 |
+
'ID' => 'first++',
|
714 |
+
'wishlist_id' => 'int_0',
|
715 |
+
'product_id' => 'int_0',
|
716 |
+
'variation_id' => 'int_0',
|
717 |
+
'formdata' => 'text',
|
718 |
+
'author' => 'int_0',
|
719 |
+
'date' => 'date',
|
720 |
+
'quantity' => 'int_1',
|
721 |
+
'price' => array( 'VARCHAR', 255 ),
|
722 |
+
'in_stock' => 'bool',
|
723 |
+
),
|
724 |
+
'upgrade' => array(
|
725 |
+
array(
|
726 |
+
'action' => 'update_fields',
|
727 |
+
),
|
728 |
+
),
|
729 |
+
),
|
730 |
+
);
|
731 |
+
}
|
732 |
+
|
733 |
+
/**
|
734 |
+
* Set localisation
|
735 |
+
*/
|
736 |
+
private static function set_locale() {
|
737 |
+
$locale = apply_filters( 'plugin_locale', get_locale(), TINVWL_DOMAIN );
|
738 |
+
$mofile = sprintf( '%1$s-%2$s.mo', TINVWL_DOMAIN, $locale );
|
739 |
+
$mofiles = array();
|
740 |
+
|
741 |
+
$mofiles[] = WP_LANG_DIR . DIRECTORY_SEPARATOR . basename( TINVWL_PATH ) . DIRECTORY_SEPARATOR . $mofile;
|
742 |
+
$mofiles[] = WP_LANG_DIR . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . $mofile;
|
743 |
+
$mofiles[] = TINVWL_PATH . 'languages' . DIRECTORY_SEPARATOR . $mofile;
|
744 |
+
foreach ( $mofiles as $mofile ) {
|
745 |
+
if ( file_exists( $mofile ) && load_textdomain( TINVWL_DOMAIN, $mofile ) ) {
|
746 |
+
return;
|
747 |
+
}
|
748 |
+
}
|
749 |
+
|
750 |
+
load_plugin_textdomain( TINVWL_DOMAIN, false, basename( TINVWL_PATH ) . DIRECTORY_SEPARATOR . 'languages' );
|
751 |
+
}
|
752 |
+
|
753 |
+
/**
|
754 |
+
* Load default data
|
755 |
+
*/
|
756 |
+
public static function load_data() {
|
757 |
+
self::set_locale();
|
758 |
+
$settings = tinv_get_option_defaults( 'all' );
|
759 |
+
foreach ( $settings as $setting => $array ) {
|
760 |
+
add_option( sprintf( '%s-%s', self::$_name, $setting ), $array );
|
761 |
+
}
|
762 |
+
}
|
763 |
+
|
764 |
+
/**
|
765 |
+
* Upgrade default data
|
766 |
+
*/
|
767 |
+
public static function upgrade_data() {
|
768 |
+
self::set_locale();
|
769 |
+
$settings = tinv_get_option_defaults( 'all' );
|
770 |
+
foreach ( $settings as $setting => $array ) {
|
771 |
+
$_array = get_option( sprintf( '%s-%s', self::$_name, $setting ) );
|
772 |
+
if ( false === $_array ) {
|
773 |
+
add_option( sprintf( '%s-%s', self::$_name, $setting ), $array );
|
774 |
+
} else {
|
775 |
+
$need_upgrade = false;
|
776 |
+
foreach ( (array) $array as $key => $value ) {
|
777 |
+
if ( ! array_key_exists( $key, (array) $_array ) ) {
|
778 |
+
$_array[ $key ] = $value;
|
779 |
+
$need_upgrade = true;
|
780 |
+
}
|
781 |
+
}
|
782 |
+
if ( $need_upgrade ) {
|
783 |
+
update_option( sprintf( '%s-%s', self::$_name, $setting ), $_array );
|
784 |
+
}
|
785 |
+
}
|
786 |
+
}
|
787 |
+
}
|
788 |
+
|
789 |
+
/**
|
790 |
+
* Unload default data
|
791 |
+
*/
|
792 |
+
public static function unload_data() {
|
793 |
+
$settings = array_keys( tinv_get_option_defaults( 'all' ) );
|
794 |
+
foreach ( $settings as $setting ) {
|
795 |
+
delete_option( sprintf( '%s-%s', self::$_name, $setting ) );
|
796 |
+
}
|
797 |
+
delete_option( self::$_name . '_ver' );
|
798 |
+
delete_option( self::$_name . '_wizard' );
|
799 |
+
}
|
800 |
+
}
|
includes/api/yoasti18n/i18n-module.php
CHANGED
@@ -1,351 +1,351 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* This class defines a promo box and checks your translation site's API for stats about it, then shows them to the user.
|
4 |
-
*
|
5 |
-
* @since 1.4.0
|
6 |
-
* @package TInvWishlist\API
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* This class defines a promo box and checks your translation site's API for stats about it, then shows them to the user.
|
16 |
-
*/
|
17 |
-
class TInvWL_Yoast_I18n_V2 {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Your translation site's logo
|
21 |
-
*
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
private $glotpress_logo;
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Your translation site's name
|
28 |
-
*
|
29 |
-
* @var string
|
30 |
-
*/
|
31 |
-
private $glotpress_name;
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Your translation site's URL
|
35 |
-
*
|
36 |
-
* @var string
|
37 |
-
*/
|
38 |
-
private $glotpress_url;
|
39 |
-
|
40 |
-
/**
|
41 |
-
* The URL to actually do the API request to
|
42 |
-
*
|
43 |
-
* @var string
|
44 |
-
*/
|
45 |
-
private $api_url;
|
46 |
-
|
47 |
-
/**
|
48 |
-
* Hook where you want to show the promo box
|
49 |
-
*
|
50 |
-
* @var string
|
51 |
-
*/
|
52 |
-
private $hook;
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Will contain the site's locale
|
56 |
-
*
|
57 |
-
* @access private
|
58 |
-
* @var string
|
59 |
-
*/
|
60 |
-
private $locale;
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Will contain the locale's name, obtained from your translation site
|
64 |
-
*
|
65 |
-
* @access private
|
66 |
-
* @var string
|
67 |
-
*/
|
68 |
-
private $locale_name;
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Will contain the percentage translated for the plugin translation project in the locale
|
72 |
-
*
|
73 |
-
* @access private
|
74 |
-
* @var int
|
75 |
-
*/
|
76 |
-
private $percent_translated;
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Name of your plugin
|
80 |
-
*
|
81 |
-
* @var string
|
82 |
-
*/
|
83 |
-
private $plugin_name;
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Project slug for the project on your translation site
|
87 |
-
*
|
88 |
-
* @var string
|
89 |
-
*/
|
90 |
-
private $project_slug;
|
91 |
-
|
92 |
-
/**
|
93 |
-
* URL to point to for registration links
|
94 |
-
*
|
95 |
-
* @var string
|
96 |
-
*/
|
97 |
-
private $register_url;
|
98 |
-
|
99 |
-
/**
|
100 |
-
* Your plugins textdomain
|
101 |
-
*
|
102 |
-
* @var string
|
103 |
-
*/
|
104 |
-
private $textdomain;
|
105 |
-
|
106 |
-
/**
|
107 |
-
* Indicates whether there's a translation available at all.
|
108 |
-
*
|
109 |
-
* @access private
|
110 |
-
* @var bool
|
111 |
-
*/
|
112 |
-
private $translation_exists;
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Indicates whether the translation's loaded.
|
116 |
-
*
|
117 |
-
* @access private
|
118 |
-
* @var bool
|
119 |
-
*/
|
120 |
-
private $translation_loaded;
|
121 |
-
|
122 |
-
/**
|
123 |
-
* Class constructor
|
124 |
-
*
|
125 |
-
* @param array $args Contains the settings for the class.
|
126 |
-
*/
|
127 |
-
public function __construct( $args ) {
|
128 |
-
if ( ! is_admin() ) {
|
129 |
-
return;
|
130 |
-
}
|
131 |
-
|
132 |
-
$this->locale = $this->get_admin_locale();
|
133 |
-
if ( 'en_US' === $this->locale ) {
|
134 |
-
return;
|
135 |
-
}
|
136 |
-
|
137 |
-
$this->init( $args );
|
138 |
-
|
139 |
-
if ( ! $this->hide_promo() ) {
|
140 |
-
add_action( $this->hook, array( $this, 'promo' ) );
|
141 |
-
}
|
142 |
-
}
|
143 |
-
|
144 |
-
/**
|
145 |
-
* Returns the locale used in the admin.
|
146 |
-
*
|
147 |
-
* WordPress 4.7 introduced the ability for users to specify an Admin language
|
148 |
-
* different from the language used on the front end. This checks if the feature
|
149 |
-
* is available and returns the user's language, with a fallback to the site's language.
|
150 |
-
* Can be removed when support for WordPress 4.6 will be dropped, in favor
|
151 |
-
* of WordPress get_user_locale() that already fallbacks to the site’s locale.
|
152 |
-
*
|
153 |
-
* @returns string The locale.
|
154 |
-
*/
|
155 |
-
private function get_admin_locale() {
|
156 |
-
if ( function_exists( 'get_user_locale' ) ) {
|
157 |
-
return get_user_locale();
|
158 |
-
}
|
159 |
-
|
160 |
-
return get_locale();
|
161 |
-
}
|
162 |
-
|
163 |
-
/**
|
164 |
-
* This is where you decide where to display the messages and where you set the plugin specific variables.
|
165 |
-
*
|
166 |
-
* @access private
|
167 |
-
*
|
168 |
-
* @param array $args Array wit arguments.
|
169 |
-
*/
|
170 |
-
private function init( $args ) {
|
171 |
-
foreach ( $args as $key => $arg ) {
|
172 |
-
$this->$key = $arg;
|
173 |
-
}
|
174 |
-
}
|
175 |
-
|
176 |
-
/**
|
177 |
-
* Check whether the promo should be hidden or not
|
178 |
-
*
|
179 |
-
* @access private
|
180 |
-
*
|
181 |
-
* @return bool
|
182 |
-
*/
|
183 |
-
private function hide_promo() {
|
184 |
-
$hide_promo = get_transient( 'yoast_i18n_' . $this->project_slug . '_promo_hide' );
|
185 |
-
if ( ! $hide_promo ) {
|
186 |
-
if ( filter_input( INPUT_GET, 'remove_i18n_promo', FILTER_VALIDATE_INT ) === 1 ) {
|
187 |
-
// No expiration time, so this would normally not expire, but it wouldn't be copied to other sites etc.
|
188 |
-
set_transient( 'yoast_i18n_' . $this->project_slug . '_promo_hide', true );
|
189 |
-
$hide_promo = true;
|
190 |
-
}
|
191 |
-
}
|
192 |
-
|
193 |
-
return $hide_promo;
|
194 |
-
}
|
195 |
-
|
196 |
-
/**
|
197 |
-
* Generates a promo message
|
198 |
-
*
|
199 |
-
* @access private
|
200 |
-
*
|
201 |
-
* @return bool|string $message
|
202 |
-
*/
|
203 |
-
private function promo_message() {
|
204 |
-
$message = false;
|
205 |
-
|
206 |
-
if ( $this->translation_exists && $this->translation_loaded && $this->percent_translated < 90 ) {
|
207 |
-
$message = __( 'As you can see, there is a translation of this plugin in %1$s. This translation is currently %3$d%% complete. We need your help to make it complete and to fix any errors. Please register at %4$s to help complete the translation to %1$s!',
|
208 |
-
} elseif ( ! $this->translation_loaded && $this->translation_exists ) {
|
209 |
-
$message = __( 'You\'re using WordPress in <strong>%1$s</strong>. While %2$s has been translated to %1$s for <strong>%3$d%%</strong>, it\'s not been shipped with the plugin yet.<br> You can help! Register at %4$s to help complete the translation to %1$s!',
|
210 |
-
} elseif ( ! $this->translation_exists ) {
|
211 |
-
$message = __( 'You\'re using WordPress in a language we don\'t support yet. We\'d love for %2$s to be translated in that language too, but unfortunately, it isn\'t right now. You can change that! Register at %4$s to help translate it!',
|
212 |
-
}
|
213 |
-
|
214 |
-
$registration_link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $this->register_url ), esc_html( $this->glotpress_name ) );
|
215 |
-
$message = sprintf( $message, esc_html( $this->locale_name ), esc_html( $this->plugin_name ), $this->percent_translated, $registration_link );
|
216 |
-
|
217 |
-
return $message;
|
218 |
-
}
|
219 |
-
|
220 |
-
/**
|
221 |
-
* Outputs a promo box
|
222 |
-
*/
|
223 |
-
public function promo() {
|
224 |
-
$this->translation_details();
|
225 |
-
|
226 |
-
$message = $this->promo_message();
|
227 |
-
|
228 |
-
if ( $message ) {
|
229 |
-
echo '<div id="i18n_promo_box" style="position: relative" class="notice notice-warning tinv-notice-translation">';
|
230 |
-
echo '<a href="' . esc_url( add_query_arg( array( 'remove_i18n_promo' => '1' ) ) ) . '" class="notice-dismiss" style="text-decoration: none;"><span class="screen-reader-text">Hide</span></a>';
|
231 |
-
|
232 |
-
echo '<div style="overflow: hidden;padding:20px 10px 10px">';
|
233 |
-
|
234 |
-
if ( isset( $this->glotpress_logo ) && '' != $this->glotpress_logo ) {
|
235 |
-
echo '<a href="' . esc_url( $this->register_url ) . '"><img class="alignleft" style="margin:0 15px 10px 0;max-width:200px;" src="' . esc_url( $this->glotpress_logo ) . '" alt="' . esc_attr( $this->glotpress_name ) . '"/></a>';
|
236 |
-
}
|
237 |
-
echo '<h2>' . sprintf( __( 'Translation of %s',
|
238 |
-
echo '<p>' . $message . '</p>'; // WPCS: xss ok.
|
239 |
-
echo '<p><a href="' . esc_url( $this->register_url ) . '">' . __( 'Register now »',
|
240 |
-
echo '</div>';
|
241 |
-
echo '</div>';
|
242 |
-
}
|
243 |
-
}
|
244 |
-
|
245 |
-
/**
|
246 |
-
* Try to find the transient for the translation set or retrieve them.
|
247 |
-
*
|
248 |
-
* @access private
|
249 |
-
*
|
250 |
-
* @return object|null
|
251 |
-
*/
|
252 |
-
private function find_or_initialize_translation_details() {
|
253 |
-
$set = get_transient( 'yoast_i18n_' . $this->project_slug . '_' . $this->locale );
|
254 |
-
|
255 |
-
if ( ! $set ) {
|
256 |
-
$set = $this->retrieve_translation_details();
|
257 |
-
set_transient( 'yoast_i18n_' . $this->project_slug . '_' . $this->locale, $set, DAY_IN_SECONDS );
|
258 |
-
}
|
259 |
-
|
260 |
-
return $set;
|
261 |
-
}
|
262 |
-
|
263 |
-
/**
|
264 |
-
* Try to get translation details from cache, otherwise retrieve them, then parse them.
|
265 |
-
*
|
266 |
-
* @access private
|
267 |
-
*/
|
268 |
-
private function translation_details() {
|
269 |
-
$set = $this->find_or_initialize_translation_details();
|
270 |
-
|
271 |
-
$this->translation_exists = ! is_null( $set );
|
272 |
-
$this->translation_loaded = is_textdomain_loaded(
|
273 |
-
|
274 |
-
$this->parse_translation_set( $set );
|
275 |
-
}
|
276 |
-
|
277 |
-
/**
|
278 |
-
* The API URL to use when requesting translation information.
|
279 |
-
*
|
280 |
-
* @param string $api_url The new API URL.
|
281 |
-
*/
|
282 |
-
public function set_api_url( $api_url ) {
|
283 |
-
$this->api_url = $api_url;
|
284 |
-
}
|
285 |
-
|
286 |
-
/**
|
287 |
-
* Returns the API URL to use when requesting translation information.
|
288 |
-
*
|
289 |
-
* @return string
|
290 |
-
*/
|
291 |
-
private function get_api_url() {
|
292 |
-
if ( empty( $this->api_url ) ) {
|
293 |
-
$this->api_url = trailingslashit( $this->glotpress_url ) . 'api/projects/' . $this->project_slug;
|
294 |
-
}
|
295 |
-
|
296 |
-
return $this->api_url;
|
297 |
-
}
|
298 |
-
|
299 |
-
/**
|
300 |
-
* Retrieve the translation details from Yoast Translate
|
301 |
-
*
|
302 |
-
* @access private
|
303 |
-
*
|
304 |
-
* @return object|null
|
305 |
-
*/
|
306 |
-
private function retrieve_translation_details() {
|
307 |
-
$api_url = $this->get_api_url();
|
308 |
-
|
309 |
-
$resp = wp_remote_get( $api_url );
|
310 |
-
if ( is_wp_error( $resp ) || wp_remote_retrieve_response_code( $resp ) !== 200 ) {
|
311 |
-
return null;
|
312 |
-
}
|
313 |
-
$body = wp_remote_retrieve_body( $resp );
|
314 |
-
unset( $resp );
|
315 |
-
|
316 |
-
if ( $body ) {
|
317 |
-
$body = json_decode( $body );
|
318 |
-
if ( empty( $body->translation_sets ) ) {
|
319 |
-
return null;
|
320 |
-
}
|
321 |
-
foreach ( $body->translation_sets as $set ) {
|
322 |
-
if ( ! property_exists( $set, 'wp_locale' ) ) {
|
323 |
-
continue;
|
324 |
-
}
|
325 |
-
|
326 |
-
if ( $this->locale === $set->wp_locale ) {
|
327 |
-
return $set;
|
328 |
-
}
|
329 |
-
}
|
330 |
-
}
|
331 |
-
|
332 |
-
return null;
|
333 |
-
}
|
334 |
-
|
335 |
-
/**
|
336 |
-
* Set the needed private variables based on the results from Yoast Translate
|
337 |
-
*
|
338 |
-
* @param object $set The translation set.
|
339 |
-
*
|
340 |
-
* @access private
|
341 |
-
*/
|
342 |
-
private function parse_translation_set( $set ) {
|
343 |
-
if ( $this->translation_exists && is_object( $set ) ) {
|
344 |
-
$this->locale_name = $set->name;
|
345 |
-
$this->percent_translated = $set->percent_translated;
|
346 |
-
} else {
|
347 |
-
$this->locale_name = '';
|
348 |
-
$this->percent_translated = '';
|
349 |
-
}
|
350 |
-
}
|
351 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* This class defines a promo box and checks your translation site's API for stats about it, then shows them to the user.
|
4 |
+
*
|
5 |
+
* @since 1.4.0
|
6 |
+
* @package TInvWishlist\API
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* This class defines a promo box and checks your translation site's API for stats about it, then shows them to the user.
|
16 |
+
*/
|
17 |
+
class TInvWL_Yoast_I18n_V2 {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Your translation site's logo
|
21 |
+
*
|
22 |
+
* @var string
|
23 |
+
*/
|
24 |
+
private $glotpress_logo;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Your translation site's name
|
28 |
+
*
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
private $glotpress_name;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Your translation site's URL
|
35 |
+
*
|
36 |
+
* @var string
|
37 |
+
*/
|
38 |
+
private $glotpress_url;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* The URL to actually do the API request to
|
42 |
+
*
|
43 |
+
* @var string
|
44 |
+
*/
|
45 |
+
private $api_url;
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Hook where you want to show the promo box
|
49 |
+
*
|
50 |
+
* @var string
|
51 |
+
*/
|
52 |
+
private $hook;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Will contain the site's locale
|
56 |
+
*
|
57 |
+
* @access private
|
58 |
+
* @var string
|
59 |
+
*/
|
60 |
+
private $locale;
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Will contain the locale's name, obtained from your translation site
|
64 |
+
*
|
65 |
+
* @access private
|
66 |
+
* @var string
|
67 |
+
*/
|
68 |
+
private $locale_name;
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Will contain the percentage translated for the plugin translation project in the locale
|
72 |
+
*
|
73 |
+
* @access private
|
74 |
+
* @var int
|
75 |
+
*/
|
76 |
+
private $percent_translated;
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Name of your plugin
|
80 |
+
*
|
81 |
+
* @var string
|
82 |
+
*/
|
83 |
+
private $plugin_name;
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Project slug for the project on your translation site
|
87 |
+
*
|
88 |
+
* @var string
|
89 |
+
*/
|
90 |
+
private $project_slug;
|
91 |
+
|
92 |
+
/**
|
93 |
+
* URL to point to for registration links
|
94 |
+
*
|
95 |
+
* @var string
|
96 |
+
*/
|
97 |
+
private $register_url;
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Your plugins textdomain
|
101 |
+
*
|
102 |
+
* @var string
|
103 |
+
*/
|
104 |
+
private $textdomain;
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Indicates whether there's a translation available at all.
|
108 |
+
*
|
109 |
+
* @access private
|
110 |
+
* @var bool
|
111 |
+
*/
|
112 |
+
private $translation_exists;
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Indicates whether the translation's loaded.
|
116 |
+
*
|
117 |
+
* @access private
|
118 |
+
* @var bool
|
119 |
+
*/
|
120 |
+
private $translation_loaded;
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Class constructor
|
124 |
+
*
|
125 |
+
* @param array $args Contains the settings for the class.
|
126 |
+
*/
|
127 |
+
public function __construct( $args ) {
|
128 |
+
if ( ! is_admin() ) {
|
129 |
+
return;
|
130 |
+
}
|
131 |
+
|
132 |
+
$this->locale = $this->get_admin_locale();
|
133 |
+
if ( 'en_US' === $this->locale ) {
|
134 |
+
return;
|
135 |
+
}
|
136 |
+
|
137 |
+
$this->init( $args );
|
138 |
+
|
139 |
+
if ( ! $this->hide_promo() ) {
|
140 |
+
add_action( $this->hook, array( $this, 'promo' ) );
|
141 |
+
}
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Returns the locale used in the admin.
|
146 |
+
*
|
147 |
+
* WordPress 4.7 introduced the ability for users to specify an Admin language
|
148 |
+
* different from the language used on the front end. This checks if the feature
|
149 |
+
* is available and returns the user's language, with a fallback to the site's language.
|
150 |
+
* Can be removed when support for WordPress 4.6 will be dropped, in favor
|
151 |
+
* of WordPress get_user_locale() that already fallbacks to the site’s locale.
|
152 |
+
*
|
153 |
+
* @returns string The locale.
|
154 |
+
*/
|
155 |
+
private function get_admin_locale() {
|
156 |
+
if ( function_exists( 'get_user_locale' ) ) {
|
157 |
+
return get_user_locale();
|
158 |
+
}
|
159 |
+
|
160 |
+
return get_locale();
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* This is where you decide where to display the messages and where you set the plugin specific variables.
|
165 |
+
*
|
166 |
+
* @access private
|
167 |
+
*
|
168 |
+
* @param array $args Array wit arguments.
|
169 |
+
*/
|
170 |
+
private function init( $args ) {
|
171 |
+
foreach ( $args as $key => $arg ) {
|
172 |
+
$this->$key = $arg;
|
173 |
+
}
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* Check whether the promo should be hidden or not
|
178 |
+
*
|
179 |
+
* @access private
|
180 |
+
*
|
181 |
+
* @return bool
|
182 |
+
*/
|
183 |
+
private function hide_promo() {
|
184 |
+
$hide_promo = get_transient( 'yoast_i18n_' . $this->project_slug . '_promo_hide' );
|
185 |
+
if ( ! $hide_promo ) {
|
186 |
+
if ( filter_input( INPUT_GET, 'remove_i18n_promo', FILTER_VALIDATE_INT ) === 1 ) {
|
187 |
+
// No expiration time, so this would normally not expire, but it wouldn't be copied to other sites etc.
|
188 |
+
set_transient( 'yoast_i18n_' . $this->project_slug . '_promo_hide', true );
|
189 |
+
$hide_promo = true;
|
190 |
+
}
|
191 |
+
}
|
192 |
+
|
193 |
+
return $hide_promo;
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* Generates a promo message
|
198 |
+
*
|
199 |
+
* @access private
|
200 |
+
*
|
201 |
+
* @return bool|string $message
|
202 |
+
*/
|
203 |
+
private function promo_message() {
|
204 |
+
$message = false;
|
205 |
+
|
206 |
+
if ( $this->translation_exists && $this->translation_loaded && $this->percent_translated < 90 ) {
|
207 |
+
$message = __( 'As you can see, there is a translation of this plugin in %1$s. This translation is currently %3$d%% complete. We need your help to make it complete and to fix any errors. Please register at %4$s to help complete the translation to %1$s!', 'ti-woocommerce-wishlist' ); // @codingStandardsIgnoreLine WordPress.WP.I18n.NonSingularStringLiteralDomain
|
208 |
+
} elseif ( ! $this->translation_loaded && $this->translation_exists ) {
|
209 |
+
$message = __( 'You\'re using WordPress in <strong>%1$s</strong>. While %2$s has been translated to %1$s for <strong>%3$d%%</strong>, it\'s not been shipped with the plugin yet.<br> You can help! Register at %4$s to help complete the translation to %1$s!', 'ti-woocommerce-wishlist' ); // @codingStandardsIgnoreLine WordPress.WP.I18n.NonSingularStringLiteralDomain
|
210 |
+
} elseif ( ! $this->translation_exists ) {
|
211 |
+
$message = __( 'You\'re using WordPress in a language we don\'t support yet. We\'d love for %2$s to be translated in that language too, but unfortunately, it isn\'t right now. You can change that! Register at %4$s to help translate it!', 'ti-woocommerce-wishlist' ); // @codingStandardsIgnoreLine WordPress.WP.I18n.NonSingularStringLiteralDomain
|
212 |
+
}
|
213 |
+
|
214 |
+
$registration_link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $this->register_url ), esc_html( $this->glotpress_name ) );
|
215 |
+
$message = sprintf( $message, esc_html( $this->locale_name ), esc_html( $this->plugin_name ), $this->percent_translated, $registration_link );
|
216 |
+
|
217 |
+
return $message;
|
218 |
+
}
|
219 |
+
|
220 |
+
/**
|
221 |
+
* Outputs a promo box
|
222 |
+
*/
|
223 |
+
public function promo() {
|
224 |
+
$this->translation_details();
|
225 |
+
|
226 |
+
$message = $this->promo_message();
|
227 |
+
|
228 |
+
if ( $message ) {
|
229 |
+
echo '<div id="i18n_promo_box" style="position: relative" class="notice notice-warning tinv-notice-translation">';
|
230 |
+
echo '<a href="' . esc_url( add_query_arg( array( 'remove_i18n_promo' => '1' ) ) ) . '" class="notice-dismiss" style="text-decoration: none;"><span class="screen-reader-text">Hide</span></a>';
|
231 |
+
|
232 |
+
echo '<div style="overflow: hidden;padding:20px 10px 10px">';
|
233 |
+
|
234 |
+
if ( isset( $this->glotpress_logo ) && '' != $this->glotpress_logo ) {
|
235 |
+
echo '<a href="' . esc_url( $this->register_url ) . '"><img class="alignleft" style="margin:0 15px 10px 0;max-width:200px;" src="' . esc_url( $this->glotpress_logo ) . '" alt="' . esc_attr( $this->glotpress_name ) . '"/></a>';
|
236 |
+
}
|
237 |
+
echo '<h2>' . sprintf( __( 'Translation of %s', 'ti-woocommerce-wishlist' ), $this->plugin_name ) . '</h2>'; // @codingStandardsIgnoreLine WordPress.WP.I18n.NonSingularStringLiteralDomain
|
238 |
+
echo '<p>' . $message . '</p>'; // WPCS: xss ok.
|
239 |
+
echo '<p><a href="' . esc_url( $this->register_url ) . '">' . __( 'Register now »', 'ti-woocommerce-wishlist' ) . '</a></p>'; // @codingStandardsIgnoreLine WordPress.WP.I18n.NonSingularStringLiteralDomain
|
240 |
+
echo '</div>';
|
241 |
+
echo '</div>';
|
242 |
+
}
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* Try to find the transient for the translation set or retrieve them.
|
247 |
+
*
|
248 |
+
* @access private
|
249 |
+
*
|
250 |
+
* @return object|null
|
251 |
+
*/
|
252 |
+
private function find_or_initialize_translation_details() {
|
253 |
+
$set = get_transient( 'yoast_i18n_' . $this->project_slug . '_' . $this->locale );
|
254 |
+
|
255 |
+
if ( ! $set ) {
|
256 |
+
$set = $this->retrieve_translation_details();
|
257 |
+
set_transient( 'yoast_i18n_' . $this->project_slug . '_' . $this->locale, $set, DAY_IN_SECONDS );
|
258 |
+
}
|
259 |
+
|
260 |
+
return $set;
|
261 |
+
}
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Try to get translation details from cache, otherwise retrieve them, then parse them.
|
265 |
+
*
|
266 |
+
* @access private
|
267 |
+
*/
|
268 |
+
private function translation_details() {
|
269 |
+
$set = $this->find_or_initialize_translation_details();
|
270 |
+
|
271 |
+
$this->translation_exists = ! is_null( $set );
|
272 |
+
$this->translation_loaded = is_textdomain_loaded( 'ti-woocommerce-wishlist' );
|
273 |
+
|
274 |
+
$this->parse_translation_set( $set );
|
275 |
+
}
|
276 |
+
|
277 |
+
/**
|
278 |
+
* The API URL to use when requesting translation information.
|
279 |
+
*
|
280 |
+
* @param string $api_url The new API URL.
|
281 |
+
*/
|
282 |
+
public function set_api_url( $api_url ) {
|
283 |
+
$this->api_url = $api_url;
|
284 |
+
}
|
285 |
+
|
286 |
+
/**
|
287 |
+
* Returns the API URL to use when requesting translation information.
|
288 |
+
*
|
289 |
+
* @return string
|
290 |
+
*/
|
291 |
+
private function get_api_url() {
|
292 |
+
if ( empty( $this->api_url ) ) {
|
293 |
+
$this->api_url = trailingslashit( $this->glotpress_url ) . 'api/projects/' . $this->project_slug;
|
294 |
+
}
|
295 |
+
|
296 |
+
return $this->api_url;
|
297 |
+
}
|
298 |
+
|
299 |
+
/**
|
300 |
+
* Retrieve the translation details from Yoast Translate
|
301 |
+
*
|
302 |
+
* @access private
|
303 |
+
*
|
304 |
+
* @return object|null
|
305 |
+
*/
|
306 |
+
private function retrieve_translation_details() {
|
307 |
+
$api_url = $this->get_api_url();
|
308 |
+
|
309 |
+
$resp = wp_remote_get( $api_url );
|
310 |
+
if ( is_wp_error( $resp ) || wp_remote_retrieve_response_code( $resp ) !== 200 ) {
|
311 |
+
return null;
|
312 |
+
}
|
313 |
+
$body = wp_remote_retrieve_body( $resp );
|
314 |
+
unset( $resp );
|
315 |
+
|
316 |
+
if ( $body ) {
|
317 |
+
$body = json_decode( $body );
|
318 |
+
if ( empty( $body->translation_sets ) ) {
|
319 |
+
return null;
|
320 |
+
}
|
321 |
+
foreach ( $body->translation_sets as $set ) {
|
322 |
+
if ( ! property_exists( $set, 'wp_locale' ) ) {
|
323 |
+
continue;
|
324 |
+
}
|
325 |
+
|
326 |
+
if ( $this->locale === $set->wp_locale ) {
|
327 |
+
return $set;
|
328 |
+
}
|
329 |
+
}
|
330 |
+
}
|
331 |
+
|
332 |
+
return null;
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Set the needed private variables based on the results from Yoast Translate
|
337 |
+
*
|
338 |
+
* @param object $set The translation set.
|
339 |
+
*
|
340 |
+
* @access private
|
341 |
+
*/
|
342 |
+
private function parse_translation_set( $set ) {
|
343 |
+
if ( $this->translation_exists && is_object( $set ) ) {
|
344 |
+
$this->locale_name = $set->name;
|
345 |
+
$this->percent_translated = $set->percent_translated;
|
346 |
+
} else {
|
347 |
+
$this->locale_name = '';
|
348 |
+
$this->percent_translated = '';
|
349 |
+
}
|
350 |
+
}
|
351 |
+
}
|
includes/form.helper.php
CHANGED
@@ -21,7 +21,7 @@ class TInvWL_Form {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
static $
|
25 |
|
26 |
/**
|
27 |
* Form value for elements
|
@@ -43,7 +43,7 @@ class TInvWL_Form {
|
|
43 |
* @param string $plugin_name Plugin name.
|
44 |
*/
|
45 |
public static function _init( $plugin_name = TINVWL_PREFIX ) {
|
46 |
-
self::$
|
47 |
}
|
48 |
|
49 |
/**
|
@@ -87,8 +87,8 @@ class TInvWL_Form {
|
|
87 |
* @return mixed
|
88 |
*/
|
89 |
public static function __callStatic( $name, $arg ) {
|
90 |
-
if ( empty( self::$
|
91 |
-
self::$
|
92 |
}
|
93 |
$_arg = array(
|
94 |
0 => null,
|
@@ -151,7 +151,7 @@ class TInvWL_Form {
|
|
151 |
* @return string
|
152 |
*/
|
153 |
public static function _number( $data, $value = 0, $extra = '' ) {
|
154 |
-
$class = sprintf( ' %s-form-number', self::$
|
155 |
if ( is_array( $extra ) ) {
|
156 |
if ( isset( $extra['class'] ) ) {
|
157 |
$extra['class'] .= $class;
|
@@ -174,7 +174,7 @@ class TInvWL_Form {
|
|
174 |
* @return string
|
175 |
*/
|
176 |
public static function _color( $data = '', $value = '', $extra = '' ) {
|
177 |
-
$class = sprintf( ' %s-form-color', self::$
|
178 |
$load = true;
|
179 |
if ( is_array( $extra ) ) {
|
180 |
if ( isset( $extra['class'] ) ) {
|
@@ -215,7 +215,7 @@ class TInvWL_Form {
|
|
215 |
}
|
216 |
$extra_js = '';
|
217 |
$value = self::getvalue( $data['name'], $value );
|
218 |
-
$class = sprintf( ' %s-date', self::$
|
219 |
if ( is_array( $extra ) ) {
|
220 |
if ( isset( $extra['class'] ) ) {
|
221 |
$extra['class'] .= $class;
|
@@ -245,7 +245,7 @@ class TInvWL_Form {
|
|
245 |
* @return string
|
246 |
*/
|
247 |
public static function _time( $data = '', $value = '', $extra = '' ) {
|
248 |
-
$class = sprintf( ' %s-time', self::$
|
249 |
if ( is_array( $extra ) ) {
|
250 |
if ( isset( $extra['class'] ) ) {
|
251 |
$extra['class'] .= $class;
|
@@ -434,7 +434,7 @@ class TInvWL_Form {
|
|
434 |
if ( ! is_array( $data ) ) {
|
435 |
$data = array( 'name' => $data );
|
436 |
}
|
437 |
-
$class = sprintf( ' %s-form-preview-select', self::$
|
438 |
$extra_select = array( 'class' => 'form-control' );
|
439 |
$extra_button = array();
|
440 |
$extra_url = '';
|
@@ -579,7 +579,7 @@ class TInvWL_Form {
|
|
579 |
* @return string
|
580 |
*/
|
581 |
public static function _multicheckbox( $data = '', $value = array(), $extra = '', $options = array() ) {
|
582 |
-
$class = sprintf( ' %s-multicheckbox', self::$
|
583 |
if ( is_array( $extra ) ) {
|
584 |
if ( isset( $extra['class'] ) ) {
|
585 |
$extra['class'] .= $class;
|
@@ -606,11 +606,11 @@ class TInvWL_Form {
|
|
606 |
$after = '';
|
607 |
if ( is_array( $extra ) ) {
|
608 |
if ( isset( $extra['before'] ) ) {
|
609 |
-
$before = sprintf( '<div class="%s-before">%s</div>', self::$
|
610 |
unset( $extra['before'] );
|
611 |
}
|
612 |
if ( isset( $extra['after'] ) ) {
|
613 |
-
$after = sprintf( '<div class="%s-after">%s</div>', self::$
|
614 |
unset( $extra['after'] );
|
615 |
}
|
616 |
}
|
@@ -715,7 +715,7 @@ class TInvWL_Form {
|
|
715 |
$label_extra[ $i ]['after'] = self::_time( $_data, (isset( $value[ $i ] ) ? $value[ $i ] : '' ), $extra );
|
716 |
$form[] = self::_label( $_data['name'], $label[ $i ], $label_extra[ $i ] );
|
717 |
}
|
718 |
-
$form = sprintf( '<div class="%s-timeperiod">%s</div>', self::$
|
719 |
return $form;
|
720 |
}
|
721 |
|
@@ -763,7 +763,7 @@ class TInvWL_Form {
|
|
763 |
$label_extra[ $i ]['after'] = self::_date( $_data, (isset( $value[ $i ] ) ? $value[ $i ] : '' ), $extra );
|
764 |
$form[] = self::_label( $_data['name'], $label[ $i ], $label_extra[ $i ] );
|
765 |
}
|
766 |
-
$form = sprintf( '<div class="%s-dateperiod">%s</div>', self::$
|
767 |
return $form;
|
768 |
}
|
769 |
|
@@ -810,7 +810,7 @@ class TInvWL_Form {
|
|
810 |
* @return type
|
811 |
*/
|
812 |
public static function _button_submit_quick( $data = '', $value = '', $extra = '' ) {
|
813 |
-
return sprintf( '<div class="%s-quick-btns">%s</div>', self::$
|
814 |
}
|
815 |
|
816 |
/**
|
@@ -872,8 +872,8 @@ class TInvWL_Form {
|
|
872 |
*/
|
873 |
private static function __createid( $name = '', $separator = '_' ) { // @codingStandardsIgnoreLine WordPress.NamingConventions.ValidFunctionName.MethodDoubleUnderscore
|
874 |
$name = preg_replace( '/[^A-Za-z0-9_-]{1}/i', $separator, $name );
|
875 |
-
if ( false === strpos( $name, self::$
|
876 |
-
$name = self::$
|
877 |
}
|
878 |
return $name;
|
879 |
}
|
@@ -1125,7 +1125,7 @@ class TInvWL_Form {
|
|
1125 |
* @return string
|
1126 |
*/
|
1127 |
public static function _checkboxonoff( $data = '', $checked = false, $extra = '', $value = 'on' ) {
|
1128 |
-
$class = sprintf( ' %s-form-onoff', self::$
|
1129 |
if ( is_array( $extra ) ) {
|
1130 |
if ( isset( $extra['class'] ) ) {
|
1131 |
$extra['class'] .= $class;
|
@@ -1152,7 +1152,7 @@ class TInvWL_Form {
|
|
1152 |
$data = array( 'name' => $data );
|
1153 |
}
|
1154 |
$extra_input = '';
|
1155 |
-
$class = sprintf( ' %s-form-multirbox', self::$
|
1156 |
if ( is_array( $extra ) ) {
|
1157 |
if ( isset( $extra['class'] ) ) {
|
1158 |
$extra['class'] .= $class;
|
@@ -1182,7 +1182,7 @@ class TInvWL_Form {
|
|
1182 |
$data = array( 'name' => $data );
|
1183 |
}
|
1184 |
$data['type'] = 'range';
|
1185 |
-
$class = sprintf( ' %s-form-range', self::$
|
1186 |
if ( is_array( $extra ) ) {
|
1187 |
if ( isset( $extra['class'] ) ) {
|
1188 |
$extra['class'] = $class;
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
static $_name;
|
25 |
|
26 |
/**
|
27 |
* Form value for elements
|
43 |
* @param string $plugin_name Plugin name.
|
44 |
*/
|
45 |
public static function _init( $plugin_name = TINVWL_PREFIX ) {
|
46 |
+
self::$_name = $plugin_name;
|
47 |
}
|
48 |
|
49 |
/**
|
87 |
* @return mixed
|
88 |
*/
|
89 |
public static function __callStatic( $name, $arg ) {
|
90 |
+
if ( empty( self::$_name ) ) {
|
91 |
+
self::$_name = TINVWL_PREFIX;
|
92 |
}
|
93 |
$_arg = array(
|
94 |
0 => null,
|
151 |
* @return string
|
152 |
*/
|
153 |
public static function _number( $data, $value = 0, $extra = '' ) {
|
154 |
+
$class = sprintf( ' %s-form-number', self::$_name );
|
155 |
if ( is_array( $extra ) ) {
|
156 |
if ( isset( $extra['class'] ) ) {
|
157 |
$extra['class'] .= $class;
|
174 |
* @return string
|
175 |
*/
|
176 |
public static function _color( $data = '', $value = '', $extra = '' ) {
|
177 |
+
$class = sprintf( ' %s-form-color', self::$_name );
|
178 |
$load = true;
|
179 |
if ( is_array( $extra ) ) {
|
180 |
if ( isset( $extra['class'] ) ) {
|
215 |
}
|
216 |
$extra_js = '';
|
217 |
$value = self::getvalue( $data['name'], $value );
|
218 |
+
$class = sprintf( ' %s-date', self::$_name );
|
219 |
if ( is_array( $extra ) ) {
|
220 |
if ( isset( $extra['class'] ) ) {
|
221 |
$extra['class'] .= $class;
|
245 |
* @return string
|
246 |
*/
|
247 |
public static function _time( $data = '', $value = '', $extra = '' ) {
|
248 |
+
$class = sprintf( ' %s-time', self::$_name );
|
249 |
if ( is_array( $extra ) ) {
|
250 |
if ( isset( $extra['class'] ) ) {
|
251 |
$extra['class'] .= $class;
|
434 |
if ( ! is_array( $data ) ) {
|
435 |
$data = array( 'name' => $data );
|
436 |
}
|
437 |
+
$class = sprintf( ' %s-form-preview-select', self::$_name );
|
438 |
$extra_select = array( 'class' => 'form-control' );
|
439 |
$extra_button = array();
|
440 |
$extra_url = '';
|
579 |
* @return string
|
580 |
*/
|
581 |
public static function _multicheckbox( $data = '', $value = array(), $extra = '', $options = array() ) {
|
582 |
+
$class = sprintf( ' %s-multicheckbox', self::$_name );
|
583 |
if ( is_array( $extra ) ) {
|
584 |
if ( isset( $extra['class'] ) ) {
|
585 |
$extra['class'] .= $class;
|
606 |
$after = '';
|
607 |
if ( is_array( $extra ) ) {
|
608 |
if ( isset( $extra['before'] ) ) {
|
609 |
+
$before = sprintf( '<div class="%s-before">%s</div>', self::$_name, $extra['before'] );
|
610 |
unset( $extra['before'] );
|
611 |
}
|
612 |
if ( isset( $extra['after'] ) ) {
|
613 |
+
$after = sprintf( '<div class="%s-after">%s</div>', self::$_name, $extra['after'] );
|
614 |
unset( $extra['after'] );
|
615 |
}
|
616 |
}
|
715 |
$label_extra[ $i ]['after'] = self::_time( $_data, (isset( $value[ $i ] ) ? $value[ $i ] : '' ), $extra );
|
716 |
$form[] = self::_label( $_data['name'], $label[ $i ], $label_extra[ $i ] );
|
717 |
}
|
718 |
+
$form = sprintf( '<div class="%s-timeperiod">%s</div>', self::$_name, implode( $separator, $form ) );
|
719 |
return $form;
|
720 |
}
|
721 |
|
763 |
$label_extra[ $i ]['after'] = self::_date( $_data, (isset( $value[ $i ] ) ? $value[ $i ] : '' ), $extra );
|
764 |
$form[] = self::_label( $_data['name'], $label[ $i ], $label_extra[ $i ] );
|
765 |
}
|
766 |
+
$form = sprintf( '<div class="%s-dateperiod">%s</div>', self::$_name, implode( $separator, $form ) );
|
767 |
return $form;
|
768 |
}
|
769 |
|
810 |
* @return type
|
811 |
*/
|
812 |
public static function _button_submit_quick( $data = '', $value = '', $extra = '' ) {
|
813 |
+
return sprintf( '<div class="%s-quick-btns">%s</div>', self::$_name, self::_button_submit( $data, $value, $extra ) );
|
814 |
}
|
815 |
|
816 |
/**
|
872 |
*/
|
873 |
private static function __createid( $name = '', $separator = '_' ) { // @codingStandardsIgnoreLine WordPress.NamingConventions.ValidFunctionName.MethodDoubleUnderscore
|
874 |
$name = preg_replace( '/[^A-Za-z0-9_-]{1}/i', $separator, $name );
|
875 |
+
if ( false === strpos( $name, self::$_name ) ) {
|
876 |
+
$name = self::$_name . $separator . $name;
|
877 |
}
|
878 |
return $name;
|
879 |
}
|
1125 |
* @return string
|
1126 |
*/
|
1127 |
public static function _checkboxonoff( $data = '', $checked = false, $extra = '', $value = 'on' ) {
|
1128 |
+
$class = sprintf( ' %s-form-onoff', self::$_name );
|
1129 |
if ( is_array( $extra ) ) {
|
1130 |
if ( isset( $extra['class'] ) ) {
|
1131 |
$extra['class'] .= $class;
|
1152 |
$data = array( 'name' => $data );
|
1153 |
}
|
1154 |
$extra_input = '';
|
1155 |
+
$class = sprintf( ' %s-form-multirbox', self::$_name );
|
1156 |
if ( is_array( $extra ) ) {
|
1157 |
if ( isset( $extra['class'] ) ) {
|
1158 |
$extra['class'] .= $class;
|
1182 |
$data = array( 'name' => $data );
|
1183 |
}
|
1184 |
$data['type'] = 'range';
|
1185 |
+
$class = sprintf( ' %s-form-range', self::$_name );
|
1186 |
if ( is_array( $extra ) ) {
|
1187 |
if ( isset( $extra['class'] ) ) {
|
1188 |
$extra['class'] = $class;
|
includes/notice.helper.php
CHANGED
@@ -1,379 +1,396 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Notice plugin class
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Notice plugin class
|
16 |
-
*/
|
17 |
-
class TInvWL_Notice {
|
18 |
-
|
19 |
-
private static $shownotices
|
20 |
-
private static $notices
|
21 |
-
static $_instance;
|
22 |
-
protected $curent;
|
23 |
-
|
24 |
-
function __construct() {
|
25 |
-
self::$shownotices
|
26 |
-
self::$notices
|
27 |
-
self::define_hooks();
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Instance Class
|
32 |
-
*
|
33 |
-
* @return \TInvWL_Notice
|
34 |
-
*/
|
35 |
-
public static function instance() {
|
36 |
-
if ( is_null( self::$_instance ) ) {
|
37 |
-
self::$_instance = new self();
|
38 |
-
}
|
39 |
-
self::$_instance->curent = null;
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
add_action( '
|
46 |
-
add_action( '
|
47 |
-
|
48 |
-
self::
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
update_option( '
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
$
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
if (
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
if (
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
self::$shownotices[ $name ]
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
}
|
162 |
-
|
163 |
-
public static function
|
164 |
-
|
165 |
-
}
|
166 |
-
|
167 |
-
public static function
|
168 |
-
self
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
}
|
182 |
-
self::
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
if (
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
$
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
if ( empty( $
|
292 |
-
$
|
293 |
-
}
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
}
|
325 |
-
|
326 |
-
public static function
|
327 |
-
|
328 |
-
self::
|
329 |
-
}
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
}
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Notice plugin class
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Notice plugin class
|
16 |
+
*/
|
17 |
+
class TInvWL_Notice {
|
18 |
+
|
19 |
+
private static $shownotices = array();
|
20 |
+
private static $notices = array();
|
21 |
+
static $_instance;
|
22 |
+
protected $curent;
|
23 |
+
|
24 |
+
function __construct() {
|
25 |
+
self::$shownotices = get_option( 'ti_admin_shownotices', array() );
|
26 |
+
self::$notices = get_option( 'ti_admin_notices', array() );
|
27 |
+
self::define_hooks();
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Instance Class
|
32 |
+
*
|
33 |
+
* @return \TInvWL_Notice
|
34 |
+
*/
|
35 |
+
public static function instance() {
|
36 |
+
if ( is_null( self::$_instance ) ) {
|
37 |
+
self::$_instance = new self();
|
38 |
+
}
|
39 |
+
self::$_instance->curent = null;
|
40 |
+
|
41 |
+
return self::$_instance;
|
42 |
+
}
|
43 |
+
|
44 |
+
public static function define_hooks() {
|
45 |
+
add_action( 'admin_init', array( __CLASS__, 'hide_notices' ) );
|
46 |
+
add_action( 'shutdown', array( __CLASS__, 'save' ) );
|
47 |
+
add_action( 'admin_notices', array( __CLASS__, 'output' ) );
|
48 |
+
self::apply_triggers();
|
49 |
+
self::apply_resets();
|
50 |
+
}
|
51 |
+
|
52 |
+
public static function save() {
|
53 |
+
update_option( 'ti_admin_shownotices', self::$shownotices );
|
54 |
+
update_option( 'ti_admin_notices', self::$notices );
|
55 |
+
}
|
56 |
+
|
57 |
+
public static function add( $name ) {
|
58 |
+
self::$notices = array_unique( array_merge( self::$notices, array( $name ) ) );
|
59 |
+
if ( ! array_key_exists( $name, self::$shownotices ) ) {
|
60 |
+
self::$shownotices[ $name ] = array();
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
public static function has( $name ) {
|
65 |
+
return in_array( $name, self::$notices );
|
66 |
+
}
|
67 |
+
|
68 |
+
public static function filter() {
|
69 |
+
$notice = self::$shownotices;
|
70 |
+
foreach ( $notice as $name => $data ) {
|
71 |
+
if ( ! is_array( $data ) ) {
|
72 |
+
continue;
|
73 |
+
}
|
74 |
+
$data = array_reverse( $data, true );
|
75 |
+
$_data = array();
|
76 |
+
foreach ( $data as $key => $value ) {
|
77 |
+
$_data[ $key ] = $value;
|
78 |
+
break;
|
79 |
+
}
|
80 |
+
$notice[ $name ] = array_filter( $_data );
|
81 |
+
}
|
82 |
+
$notice = array_filter( $notice );
|
83 |
+
|
84 |
+
return $notice;
|
85 |
+
}
|
86 |
+
|
87 |
+
public static function output() {
|
88 |
+
$notices = self::filter();
|
89 |
+
|
90 |
+
foreach ( $notices as $name => $notice_data ) {
|
91 |
+
$notice = get_option( 'ti_admin_notice_' . $name, array() );
|
92 |
+
if ( empty( $notice ) ) {
|
93 |
+
continue;
|
94 |
+
}
|
95 |
+
foreach ( $notice_data as $key => $status ) {
|
96 |
+
if ( is_integer( $status ) ) {
|
97 |
+
if ( array_key_exists( $status - 1, $notice ) ) {
|
98 |
+
$message = $notice[ $status - 1 ];
|
99 |
+
} else {
|
100 |
+
$message = array_shift( $notice );
|
101 |
+
}
|
102 |
+
} else {
|
103 |
+
$message = array_shift( $notice );
|
104 |
+
}
|
105 |
+
self::template( $name, $key, $message );
|
106 |
+
break;
|
107 |
+
}
|
108 |
+
}
|
109 |
+
}
|
110 |
+
|
111 |
+
public static function template( $name, $key, $message ) {
|
112 |
+
if ( empty( $message ) ) {
|
113 |
+
return;
|
114 |
+
}
|
115 |
+
$output = '<div id="message" class="updated woocommerce-message"><a class="woocommerce-message-close notice-dismiss" href="' . esc_url( wp_nonce_url( add_query_arg( 'ti-hide-notice', $name, add_query_arg( 'ti-hide-notice-trigger', $key ) ), 'ti_hide', '_ti_notice_nonce' ) ) . '">' . __( 'Dismiss', 'ti-woocommerce-wishlist' ) . '</a>' . wp_kses_post( wpautop( $message ) ) . '</div>';
|
116 |
+
|
117 |
+
echo apply_filters( 'tinv_notice_' . $name, $output, $key, $message );
|
118 |
+
}
|
119 |
+
|
120 |
+
public static function remove( $name ) {
|
121 |
+
unset( self::$notices[ $name ] );
|
122 |
+
self::$shownotices[ $name ] = false;
|
123 |
+
}
|
124 |
+
|
125 |
+
public static function show( $name, $tag = null, $arg = true ) {
|
126 |
+
if ( is_array( self::$shownotices[ $name ] ) ) {
|
127 |
+
$notice = get_option( 'ti_admin_notice_' . $name, array() );
|
128 |
+
if ( ! is_array( $notice ) ) {
|
129 |
+
$notice = array( $notice );
|
130 |
+
$notice = array_filter( $notice );
|
131 |
+
}
|
132 |
+
if ( empty( $notice ) ) {
|
133 |
+
return;
|
134 |
+
}
|
135 |
+
$notice_key = $arg;
|
136 |
+
if ( ! is_integer( $arg ) || ! array_key_exists( $arg, $notice ) ) {
|
137 |
+
$notice_keys = array_keys( $notice );
|
138 |
+
if ( 1 < count( $notice ) ) {
|
139 |
+
$notice_key = $notice_keys[ rand( 0, count( $notice_keys ) ) ];
|
140 |
+
} else {
|
141 |
+
$notice_key = $notice_keys[0];
|
142 |
+
}
|
143 |
+
$notice_key = absint( $notice_key ) + 1;
|
144 |
+
}
|
145 |
+
self::$shownotices[ $name ][ $tag ] = $notice_key;
|
146 |
+
}
|
147 |
+
}
|
148 |
+
|
149 |
+
public static function hide( $name, $tag = null ) {
|
150 |
+
if ( is_array( self::$shownotices[ $name ] ) ) {
|
151 |
+
if ( array_key_exists( $name, self::$shownotices ) ) {
|
152 |
+
if ( empty( $tag ) ) {
|
153 |
+
foreach ( self::$shownotices[ $name ] as $tag => $value ) {
|
154 |
+
self::hide( $name, $tag );
|
155 |
+
}
|
156 |
+
} else {
|
157 |
+
self::$shownotices[ $name ][ $tag ] = false;
|
158 |
+
}
|
159 |
+
}
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
public static function reset( $name ) {
|
164 |
+
self::$shownotices[ $name ] = array();
|
165 |
+
}
|
166 |
+
|
167 |
+
public static function get() {
|
168 |
+
return self::$notices;
|
169 |
+
}
|
170 |
+
|
171 |
+
public static function remove_notice( $name ) {
|
172 |
+
self::remove( $name );
|
173 |
+
delete_option( 'ti_admin_notice_' . $name );
|
174 |
+
delete_option( 'ti_admin_notice_trigger_' . $name );
|
175 |
+
delete_option( 'ti_admin_notice_reset_' . $name );
|
176 |
+
}
|
177 |
+
|
178 |
+
function add_notice( $name, $notice ) {
|
179 |
+
if ( ! is_array( $notice ) ) {
|
180 |
+
$notice = array( $notice );
|
181 |
+
}
|
182 |
+
if ( self::has( $name ) ) {
|
183 |
+
$this->curent = null;
|
184 |
+
|
185 |
+
return $this;
|
186 |
+
}
|
187 |
+
self::add( $name );
|
188 |
+
update_option( 'ti_admin_notice_' . $name, $notice );
|
189 |
+
$this->curent = $name;
|
190 |
+
|
191 |
+
return $this;
|
192 |
+
}
|
193 |
+
|
194 |
+
function modify_notice( $name, $notice, $index = 0 ) {
|
195 |
+
if ( ! is_array( $notice ) ) {
|
196 |
+
$notice = array( $notice );
|
197 |
+
}
|
198 |
+
self::add( $name );
|
199 |
+
$_notice = get_option( 'ti_admin_notice_' . $name, array() );
|
200 |
+
foreach ( $notice as $key => $value ) {
|
201 |
+
$_value = wp_kses_post( $value );
|
202 |
+
if ( ! in_array( $_value, $_notice ) ) {
|
203 |
+
$_notice[ $index ] = $_value;
|
204 |
+
}
|
205 |
+
$index ++;
|
206 |
+
}
|
207 |
+
update_option( 'ti_admin_notice_' . $name, $_notice );
|
208 |
+
$this->curent = $name;
|
209 |
+
|
210 |
+
return $this;
|
211 |
+
}
|
212 |
+
|
213 |
+
function set_notice( $name ) {
|
214 |
+
$this->curent = $name;
|
215 |
+
|
216 |
+
return $this;
|
217 |
+
}
|
218 |
+
|
219 |
+
function add_trigger( $tag, $function_to_add = null, $priority = 10, $accepted_args = 1, $name = null ) {
|
220 |
+
if ( empty( $name ) ) {
|
221 |
+
$name = $this->curent;
|
222 |
+
}
|
223 |
+
if ( empty( $name ) ) {
|
224 |
+
return $this;
|
225 |
+
}
|
226 |
+
if ( empty( $function_to_add ) ) {
|
227 |
+
$function_to_add = '__return_true';
|
228 |
+
}
|
229 |
+
$priority = absint( $priority );
|
230 |
+
|
231 |
+
$data = get_option( 'ti_admin_notice_trigger_' . $name, array() );
|
232 |
+
$idx = md5( serialize( array( $tag, $function_to_add, $priority ) ) );
|
233 |
+
$data[ $idx ] = array( $tag, $function_to_add, $priority, $accepted_args );
|
234 |
+
update_option( 'ti_admin_notice_trigger_' . $name, $data );
|
235 |
+
$this->curent = $name;
|
236 |
+
|
237 |
+
return $this;
|
238 |
+
}
|
239 |
+
|
240 |
+
function remove_trigger( $tag, $function_to_add = null, $priority = 10, $name = null ) {
|
241 |
+
if ( empty( $name ) ) {
|
242 |
+
$name = $this->curent;
|
243 |
+
}
|
244 |
+
if ( empty( $name ) ) {
|
245 |
+
return $this;
|
246 |
+
}
|
247 |
+
$priority = absint( $priority );
|
248 |
+
$data = get_option( 'ti_admin_notice_trigger_' . $name, array() );
|
249 |
+
$idx = md5( serialize( array( $tag, $function_to_add, $priority ) ) );
|
250 |
+
if ( array_key_exists( $idx, $data ) ) {
|
251 |
+
unset( $data[ $idx ] );
|
252 |
+
update_option( 'ti_admin_notice_trigger_' . $name, $data );
|
253 |
+
}
|
254 |
+
$this->curent = $name;
|
255 |
+
|
256 |
+
return $this;
|
257 |
+
}
|
258 |
+
|
259 |
+
public static function apply_triggers() {
|
260 |
+
foreach ( self::$notices as $notice ) {
|
261 |
+
self::apply_trigger( $notice );
|
262 |
+
}
|
263 |
+
}
|
264 |
+
|
265 |
+
public static function apply_trigger( $name ) {
|
266 |
+
$data = get_option( 'ti_admin_notice_trigger_' . $name, array() );
|
267 |
+
$trigger = new TInvWL_Notice_Trigger( 'ti_admin_notice_trigger_' );
|
268 |
+
if ( empty( $data ) ) {
|
269 |
+
self::show( $name );
|
270 |
+
} else {
|
271 |
+
foreach ( $data as $idx => $_data ) {
|
272 |
+
if ( ! array_key_exists( $idx, (array) @self::$shownotices[ $name ] ) ) {
|
273 |
+
add_filter( $_data[0], array( $trigger, $name . '__' . $idx ), $_data[2], $_data[3] );
|
274 |
+
|
275 |
+
return;
|
276 |
+
}
|
277 |
+
}
|
278 |
+
if ( 0 == count( array_filter( self::$shownotices[ $name ] ) ) ) {
|
279 |
+
self::remove( $name );
|
280 |
+
}
|
281 |
+
}
|
282 |
+
}
|
283 |
+
|
284 |
+
function add_reset( $tag, $function_to_add = null, $priority = 10, $accepted_args = 1, $name = null ) {
|
285 |
+
if ( empty( $name ) ) {
|
286 |
+
$name = $this->curent;
|
287 |
+
}
|
288 |
+
if ( empty( $name ) ) {
|
289 |
+
return $this;
|
290 |
+
}
|
291 |
+
if ( empty( $function_to_add ) ) {
|
292 |
+
$function_to_add = '__return_true';
|
293 |
+
}
|
294 |
+
$priority = absint( $priority );
|
295 |
+
$data = get_option( 'ti_admin_notice_reset_' . $name, array() );
|
296 |
+
$idx = md5( serialize( array( $tag, $function_to_add, $priority ) ) );
|
297 |
+
$data[ $idx ] = array( $tag, $function_to_add, $priority, $accepted_args );
|
298 |
+
update_option( 'ti_admin_notice_reset_' . $name, $data );
|
299 |
+
$this->curent = $name;
|
300 |
+
|
301 |
+
return $this;
|
302 |
+
}
|
303 |
+
|
304 |
+
function remove_reset( $tag, $function_to_add = null, $priority = 10, $name = null ) {
|
305 |
+
if ( empty( $name ) ) {
|
306 |
+
$name = $this->curent;
|
307 |
+
}
|
308 |
+
if ( empty( $name ) ) {
|
309 |
+
return $this;
|
310 |
+
}
|
311 |
+
if ( empty( $function_to_add ) ) {
|
312 |
+
$function_to_add = '__return_true';
|
313 |
+
}
|
314 |
+
$priority = absint( $priority );
|
315 |
+
$data = get_option( 'ti_admin_notice_reset_' . $name, array() );
|
316 |
+
$idx = md5( serialize( array( $tag, $function_to_add, $priority ) ) );
|
317 |
+
if ( array_key_exists( $idx, $data ) ) {
|
318 |
+
unset( $data[ $idx ] );
|
319 |
+
update_option( 'ti_admin_notice_reset_' . $name, $data );
|
320 |
+
}
|
321 |
+
$this->curent = $name;
|
322 |
+
|
323 |
+
return $this;
|
324 |
+
}
|
325 |
+
|
326 |
+
public static function apply_resets() {
|
327 |
+
foreach ( self::$notices as $notice ) {
|
328 |
+
self::apply_reset( $notice );
|
329 |
+
}
|
330 |
+
}
|
331 |
+
|
332 |
+
public static function apply_reset( $name ) {
|
333 |
+
$data = get_option( 'ti_admin_notice_reset_' . $name, array() );
|
334 |
+
$trigger = new TInvWL_Notice_Trigger( 'ti_admin_notice_reset_' );
|
335 |
+
if ( ! empty( $data ) ) {
|
336 |
+
foreach ( $data as $idx => $_data ) {
|
337 |
+
add_filter( $_data[0], array( $trigger, $name . '__' . $idx ), $_data[2], $_data[3] );
|
338 |
+
}
|
339 |
+
}
|
340 |
+
}
|
341 |
+
|
342 |
+
public static function hide_notices( $name = null ) {
|
343 |
+
if ( ! empty( $name ) ) {
|
344 |
+
self::hide( $name );
|
345 |
+
} else {
|
346 |
+
$data = filter_input_array( INPUT_GET, array(
|
347 |
+
'_ti_notice_nonce' => FILTER_DEFAULT,
|
348 |
+
'ti-hide-notice-trigger' => FILTER_DEFAULT,
|
349 |
+
'ti-hide-notice' => FILTER_DEFAULT,
|
350 |
+
) );
|
351 |
+
$name = $data['ti-hide-notice'];
|
352 |
+
if ( ! empty( $name ) ) {
|
353 |
+
if ( isset( $data['_ti_notice_nonce'] ) && wp_verify_nonce( $data['_ti_notice_nonce'], 'ti_hide' ) ) {
|
354 |
+
self::hide( $name, $data['ti-hide-notice-trigger'] );
|
355 |
+
do_action( 'tinv_notice_hide_' . $name );
|
356 |
+
} elseif ( isset( $data['_ti_notice_nonce'] ) && wp_verify_nonce( $data['_ti_notice_nonce'], 'ti_remove' ) ) {
|
357 |
+
self::remove_notice( $name );
|
358 |
+
do_action( 'tinv_notice_remove_' . $name );
|
359 |
+
}
|
360 |
+
}
|
361 |
+
}
|
362 |
+
}
|
363 |
+
|
364 |
+
}
|
365 |
+
|
366 |
+
|
367 |
+
if ( ! class_exists( 'TInvWL_Notice_Trigger' ) ) {
|
368 |
+
class TInvWL_Notice_Trigger {
|
369 |
+
|
370 |
+
private $prefix;
|
371 |
+
|
372 |
+
function __construct( $prefix ) {
|
373 |
+
$this->prefix = $prefix;
|
374 |
+
}
|
375 |
+
|
376 |
+
function __call( $name, $arguments ) {
|
377 |
+
list( $name, $idx ) = explode( '__', $name );
|
378 |
+
if ( empty( $idx ) ) {
|
379 |
+
return;
|
380 |
+
}
|
381 |
+
$data = get_option( $this->prefix . $name, array() );
|
382 |
+
if ( array_key_exists( $idx, $data ) ) {
|
383 |
+
$result = call_user_func_array( $data[ $idx ][1], array_slice( $arguments, 0, (int) $data[ $idx ][3] ) );
|
384 |
+
if ( ! empty( $result ) ) {
|
385 |
+
TInvWL_Notice::show( $name, $idx, $result );
|
386 |
+
}
|
387 |
+
}
|
388 |
+
|
389 |
+
return array_shift( $arguments );
|
390 |
+
}
|
391 |
+
}
|
392 |
+
}
|
393 |
+
|
394 |
+
if ( is_admin() ) {
|
395 |
+
TInvWL_Notice::instance();
|
396 |
+
}
|
includes/pluginextend.helper.php
CHANGED
@@ -1,567 +1,567 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Dependency plugin class
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Dependency plugin class
|
16 |
-
*/
|
17 |
-
class TInvWL_PluginExtend {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Plugin name
|
21 |
-
*
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
public $
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Plugin transient name
|
28 |
-
*
|
29 |
-
* @var string
|
30 |
-
*/
|
31 |
-
private $transient;
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Plugin dependency array
|
35 |
-
*
|
36 |
-
* @var array
|
37 |
-
*/
|
38 |
-
private $dependency;
|
39 |
-
|
40 |
-
/**
|
41 |
-
* Current dependency name
|
42 |
-
*
|
43 |
-
* @var string
|
44 |
-
*/
|
45 |
-
private $dependency_current;
|
46 |
-
|
47 |
-
/**
|
48 |
-
* Current dependency nice name
|
49 |
-
*
|
50 |
-
* @var string
|
51 |
-
*/
|
52 |
-
private $dependency_current_nice_name;
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Plugin path dir
|
56 |
-
*
|
57 |
-
* @var string
|
58 |
-
*/
|
59 |
-
private $plugin_path;
|
60 |
-
|
61 |
-
/**
|
62 |
-
* Cached plugin data
|
63 |
-
*
|
64 |
-
* @var array
|
65 |
-
*/
|
66 |
-
private $plugin_data;
|
67 |
-
|
68 |
-
/**
|
69 |
-
* Plugin error message
|
70 |
-
*
|
71 |
-
* @var array
|
72 |
-
*/
|
73 |
-
public $message;
|
74 |
-
|
75 |
-
/**
|
76 |
-
* Constructor
|
77 |
-
*
|
78 |
-
* @param string $plugin Plugin transient name, or can use Plugin root file.
|
79 |
-
* @param string $root_file Plugin root file, or can use Plugin transient name.
|
80 |
-
* @param string $plugin_name Plugin name.
|
81 |
-
*/
|
82 |
-
public function __construct( $plugin, $root_file = null, $plugin_name = TINVWL_PREFIX ) {
|
83 |
-
$this->
|
84 |
-
if ( empty( $plugin ) ) {
|
85 |
-
$this->transient = plugin_basename( $root_file );
|
86 |
-
$this->plugin_path = trailingslashit( plugin_dir_path( dirname( $root_file ) ) );
|
87 |
-
} else {
|
88 |
-
$this->transient = $plugin;
|
89 |
-
$this->plugin_path = trailingslashit( dirname( TINVWL_PATH ) );
|
90 |
-
}
|
91 |
-
$this->dependency = array();
|
92 |
-
$this->plugin_data = array();
|
93 |
-
$this->message = array();
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* Run hooks dependency
|
98 |
-
*/
|
99 |
-
public function run() {
|
100 |
-
if ( 'plugins.php' === basename( $_SERVER['PHP_SELF'] ) && ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { // @codingStandardsIgnoreLine WordPress.VIP.SuperGlobalInputUsage.AccessDetected
|
101 |
-
add_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
102 |
-
|
103 |
-
$plugins = $this->get_dependency_plugins();
|
104 |
-
|
105 |
-
foreach ( $plugins as $plugin => $data ) {
|
106 |
-
add_filter( 'plugin_action_links_' . $plugin, array( $this, 'plugin_action_links_maybe_deactivate' ) );
|
107 |
-
add_filter( 'network_admin_plugin_action_links_' . $plugin, array( $this, 'plugin_action_links_maybe_deactivate' ) );
|
108 |
-
}
|
109 |
-
|
110 |
-
add_action( 'after_plugin_row_' . $this->transient, array( $this, 'plugin_row' ), 10 );
|
111 |
-
} else {
|
112 |
-
add_action( 'update_option_active_sitewide_plugins', array( $this, 'maybe_deactivate' ), 10, 2 );
|
113 |
-
add_action( 'update_option_active_plugins', array( $this, 'maybe_deactivate' ), 10, 2 );
|
114 |
-
}
|
115 |
-
}
|
116 |
-
|
117 |
-
/**
|
118 |
-
* Set dependency plugin transient name
|
119 |
-
*
|
120 |
-
* @param string $plugin Plugin transient name.
|
121 |
-
* @param string $nice_name Plugin nice name.
|
122 |
-
* @return \TInvWL_PluginExtend
|
123 |
-
*/
|
124 |
-
public function set_dependency( $plugin, $nice_name ) {
|
125 |
-
$this->dependency_current = $plugin;
|
126 |
-
$this->dependency_current_nice_name = $nice_name;
|
127 |
-
return $this;
|
128 |
-
}
|
129 |
-
|
130 |
-
/**
|
131 |
-
* Reset current dependency plugin transient name
|
132 |
-
*
|
133 |
-
* @return \TInvWL_PluginExtend
|
134 |
-
*/
|
135 |
-
public function reset_dependency() {
|
136 |
-
$this->dependency_current = null;
|
137 |
-
return $this;
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* Set dependency version by index rules
|
142 |
-
*
|
143 |
-
* @param integer $index Index rules.
|
144 |
-
* 0 Min version.
|
145 |
-
* 1 Max version.
|
146 |
-
* 2 Need plugin verion.
|
147 |
-
* 3 Conflict plugin verion.
|
148 |
-
* @param string $version Version dependency.
|
149 |
-
* @return boolean
|
150 |
-
*/
|
151 |
-
private function set_dependency_version( $index, $version = '1.0.0' ) {
|
152 |
-
if ( empty( $this->dependency_current ) ) {
|
153 |
-
return false;
|
154 |
-
}
|
155 |
-
if ( empty( $version ) ) {
|
156 |
-
$this->dependency[ $this->dependency_current ][ $index ] = null;
|
157 |
-
} else {
|
158 |
-
$this->dependency[ $this->dependency_current ][ $index ] = $version;
|
159 |
-
}
|
160 |
-
$this->dependency[ $this->dependency_current ]['nice_name'] = $this->dependency_current_nice_name;
|
161 |
-
}
|
162 |
-
|
163 |
-
/**
|
164 |
-
* Set minimal dependency version
|
165 |
-
*
|
166 |
-
* @param string $version Version dependency.
|
167 |
-
* @return \TInvWL_PluginExtend
|
168 |
-
*/
|
169 |
-
public function min( $version = '1.0.0' ) {
|
170 |
-
if ( '*' === $version ) {
|
171 |
-
$version = '';
|
172 |
-
}
|
173 |
-
$this->set_dependency_version( 0, $version );
|
174 |
-
return $this;
|
175 |
-
}
|
176 |
-
|
177 |
-
/**
|
178 |
-
* Set maximum dependency version
|
179 |
-
*
|
180 |
-
* @param string $version Version dependency.
|
181 |
-
* @return \TInvWL_PluginExtend
|
182 |
-
*/
|
183 |
-
public function max( $version = '1.0.0' ) {
|
184 |
-
if ( '*' === $version ) {
|
185 |
-
$version = '';
|
186 |
-
}
|
187 |
-
$this->set_dependency_version( 1, $version );
|
188 |
-
return $this;
|
189 |
-
}
|
190 |
-
|
191 |
-
/**
|
192 |
-
* Set need plugin dependency version
|
193 |
-
*
|
194 |
-
* @param string $version Version dependency. Can use '*' for check any version.
|
195 |
-
* @return \TInvWL_PluginExtend
|
196 |
-
*/
|
197 |
-
public function need( $version = '*' ) {
|
198 |
-
$this->set_dependency_version( 2, $version );
|
199 |
-
return $this;
|
200 |
-
}
|
201 |
-
|
202 |
-
/**
|
203 |
-
* Set conflict plugin dependency version
|
204 |
-
*
|
205 |
-
* @param string $version Version dependency. Can use '*' for check any version.
|
206 |
-
* @return \TInvWL_PluginExtend
|
207 |
-
*/
|
208 |
-
public function conflict( $version = '*' ) {
|
209 |
-
$this->set_dependency_version( 3, $version );
|
210 |
-
return $this;
|
211 |
-
}
|
212 |
-
|
213 |
-
/**
|
214 |
-
* Get dependency array
|
215 |
-
*
|
216 |
-
* @param string $plugin Plugin transient name.
|
217 |
-
* @return array
|
218 |
-
*/
|
219 |
-
private function get_dependency( $plugin ) {
|
220 |
-
if ( array_key_exists( $plugin, $this->dependency ) ) {
|
221 |
-
return $this->dependency[ $plugin ];
|
222 |
-
}
|
223 |
-
return array();
|
224 |
-
}
|
225 |
-
|
226 |
-
/**
|
227 |
-
* Get dependency version from array.
|
228 |
-
*
|
229 |
-
* @param string $plugin Plugin transient name.
|
230 |
-
* @param integer $index Index rules.
|
231 |
-
* 0 Min version.
|
232 |
-
* 1 Max version.
|
233 |
-
* 2 Need plugin verion.
|
234 |
-
* 3 Conflict plugin verion.
|
235 |
-
* @return array
|
236 |
-
*/
|
237 |
-
private function get_dep_ver( $plugin, $index ) {
|
238 |
-
$dependency = $this->get_dependency( $plugin );
|
239 |
-
if ( array_key_exists( $index, $dependency ) ) {
|
240 |
-
return $dependency[ $index ];
|
241 |
-
}
|
242 |
-
return null;
|
243 |
-
}
|
244 |
-
|
245 |
-
/**
|
246 |
-
* List dependency plugins
|
247 |
-
*
|
248 |
-
* @return array
|
249 |
-
*/
|
250 |
-
private function get_dependency_plugins() {
|
251 |
-
return $this->dependency;
|
252 |
-
}
|
253 |
-
|
254 |
-
/**
|
255 |
-
* Check all dependency.
|
256 |
-
*
|
257 |
-
* @return boolean
|
258 |
-
*/
|
259 |
-
public function status_dependency() {
|
260 |
-
$this->message = array();
|
261 |
-
$plugins = $this->get_dependency_plugins();
|
262 |
-
$status = true;
|
263 |
-
|
264 |
-
foreach ( $plugins as $plugin => $data ) {
|
265 |
-
if ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_conflict_version( $plugin ) ) {
|
266 |
-
$status = $this->set_message( 'conflict', $data['nice_name'] );
|
267 |
-
} elseif ( ! is_plugin_active( $plugin ) || ! $this->is_plugin_at_need_version( $plugin ) ) {
|
268 |
-
$status = $this->set_message( 'need', $data['nice_name'] );
|
269 |
-
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_min_version( $plugin ) ) {
|
270 |
-
$status = $this->set_message( 'upgrade', $data['nice_name'] );
|
271 |
-
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_max_version( $plugin ) ) {
|
272 |
-
$status = $this->set_message( 'downgrade', $plugin );
|
273 |
-
} elseif ( ! is_plugin_active( $plugin ) ) {
|
274 |
-
$status = $this->set_message( 'activate', $data['nice_name'] );
|
275 |
-
}
|
276 |
-
}
|
277 |
-
return $status;
|
278 |
-
}
|
279 |
-
|
280 |
-
/**
|
281 |
-
* Check plugin minimal version dependency.
|
282 |
-
*
|
283 |
-
* @param string $plugin Plugin transient name.
|
284 |
-
* @return boolean
|
285 |
-
*/
|
286 |
-
private function is_plugin_at_min_version( $plugin ) {
|
287 |
-
return $this->is_plugin_at_version( 0, $plugin );
|
288 |
-
}
|
289 |
-
|
290 |
-
/**
|
291 |
-
* Check plugin maximal version dependency.
|
292 |
-
*
|
293 |
-
* @param string $plugin Plugin transient name.
|
294 |
-
* @return boolean
|
295 |
-
*/
|
296 |
-
private function is_plugin_at_max_version( $plugin ) {
|
297 |
-
return $this->is_plugin_at_version( 1, $plugin );
|
298 |
-
}
|
299 |
-
|
300 |
-
/**
|
301 |
-
* Check plugin need version dependency.
|
302 |
-
*
|
303 |
-
* @param string $plugin Plugin transient name.
|
304 |
-
* @return boolean
|
305 |
-
*/
|
306 |
-
private function is_plugin_at_need_version( $plugin ) {
|
307 |
-
return $this->is_plugin_at_version( 2, $plugin );
|
308 |
-
}
|
309 |
-
|
310 |
-
/**
|
311 |
-
* Check plugin conflict version dependency.
|
312 |
-
*
|
313 |
-
* @param string $plugin Plugin transient name.
|
314 |
-
* @return boolean
|
315 |
-
*/
|
316 |
-
private function is_plugin_at_conflict_version( $plugin ) {
|
317 |
-
return $this->is_plugin_at_version( 3, $plugin );
|
318 |
-
}
|
319 |
-
|
320 |
-
/**
|
321 |
-
* Check plugin version dependency.
|
322 |
-
*
|
323 |
-
* @param integer $i Index rules.
|
324 |
-
* 0 Min version.
|
325 |
-
* 1 Max version.
|
326 |
-
* 2 Need plugin verion.
|
327 |
-
* 3 Conflict plugin verion.
|
328 |
-
* @param string $plugin Plugin transient name.
|
329 |
-
* @return boolean
|
330 |
-
*/
|
331 |
-
private function is_plugin_at_version( $i = 0, $plugin ) {
|
332 |
-
|
333 |
-
switch ( $i ) {
|
334 |
-
case 3:
|
335 |
-
$type = 'ne';
|
336 |
-
$i = 3;
|
337 |
-
break;
|
338 |
-
case 2:
|
339 |
-
$type = 'eq';
|
340 |
-
$i = 2;
|
341 |
-
break;
|
342 |
-
case 1:
|
343 |
-
$type = 'le';
|
344 |
-
$i = 1;
|
345 |
-
break;
|
346 |
-
case 0:
|
347 |
-
default:
|
348 |
-
$type = 'ge';
|
349 |
-
$i = 0;
|
350 |
-
}
|
351 |
-
$version = $this->get_dep_ver( $plugin, $i );
|
352 |
-
if ( is_null( $version ) ) {
|
353 |
-
return true;
|
354 |
-
}
|
355 |
-
$version_plugin = $this->get_plugin_data( $plugin, 'Version' );
|
356 |
-
if ( '*' === $version ) {
|
357 |
-
if ( 3 === $i ) {
|
358 |
-
return empty( $version_plugin );
|
359 |
-
} else {
|
360 |
-
return ! empty( $version_plugin );
|
361 |
-
}
|
362 |
-
}
|
363 |
-
return version_compare( $version_plugin, $version, $type );
|
364 |
-
}
|
365 |
-
|
366 |
-
/**
|
367 |
-
* Get error messages
|
368 |
-
*
|
369 |
-
* @param boolean $first Get first or all error messages.
|
370 |
-
* @return string
|
371 |
-
*/
|
372 |
-
public function get_messages( $first = false ) {
|
373 |
-
if ( $first ) {
|
374 |
-
$message = array_shift( $this->message );
|
375 |
-
$this->message = array();
|
376 |
-
return $message;
|
377 |
-
}
|
378 |
-
|
379 |
-
$message = '<p>' . implode( '</p><p>', $this->message ) . '</p>';
|
380 |
-
$this->message = array();
|
381 |
-
return $message;
|
382 |
-
}
|
383 |
-
|
384 |
-
/**
|
385 |
-
* Deactivation plugin
|
386 |
-
*
|
387 |
-
* @param string $old_value Not used.
|
388 |
-
* @param string $value Not used.
|
389 |
-
* @return string
|
390 |
-
*/
|
391 |
-
public function maybe_deactivate( $old_value, $value ) {
|
392 |
-
if ( ! $this->status_dependency() ) {
|
393 |
-
self::deactivate_self( $this->transient );
|
394 |
-
|
395 |
-
if ( defined( 'WP_CLI' ) && WP_CLI ) {
|
396 |
-
$plugins = $this->get_dependency_plugins();
|
397 |
-
$this->get_messages();
|
398 |
-
|
399 |
-
foreach ( $plugins as $plugin => $data ) {
|
400 |
-
if ( ! is_plugin_active( $plugin ) || ! $this->is_plugin_at_need_version( $plugin ) ) {
|
401 |
-
return WP_CLI::error( $this->get_message( 'deactivate', $data['nice_name'] ) );
|
402 |
-
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_min_version( $plugin ) ) {
|
403 |
-
return WP_CLI::error( $this->get_message( 'deactivate', $data['nice_name'] ) );
|
404 |
-
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_max_version( $plugin ) ) {
|
405 |
-
return WP_CLI::error( $this->get_message( 'deactivate', $data['nice_name'] ) );
|
406 |
-
}
|
407 |
-
}
|
408 |
-
}
|
409 |
-
}
|
410 |
-
}
|
411 |
-
|
412 |
-
/**
|
413 |
-
* Deactivation plugin
|
414 |
-
*
|
415 |
-
* @param string $actions Not used.
|
416 |
-
* @return string
|
417 |
-
*/
|
418 |
-
public function plugin_action_links_maybe_deactivate( $actions ) {
|
419 |
-
if ( ! $this->status_dependency() ) {
|
420 |
-
self::deactivate_self( $this->transient );
|
421 |
-
}
|
422 |
-
return $actions;
|
423 |
-
}
|
424 |
-
|
425 |
-
/**
|
426 |
-
* Return message in plugin lists table
|
427 |
-
*
|
428 |
-
* @param string $file Plugin file path.
|
429 |
-
*/
|
430 |
-
public function plugin_row( $file ) {
|
431 |
-
if ( ! $this->status_dependency() ) {
|
432 |
-
$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
|
433 |
-
?>
|
434 |
-
<tr class="plugin-update-tr installer-plugin-update-tr">
|
435 |
-
<td colspan="<?php echo $wp_list_table->get_column_count(); // WPCS: xss ok. ?>" class="plugin-update colspanchange">
|
436 |
-
<div class="notice inline notice-warning notice-alt">
|
437 |
-
<p class="installer-q-icon">
|
438 |
-
<?php echo $this->get_messages( true ); // WPCS: xss ok. ?>
|
439 |
-
</p>
|
440 |
-
</div>
|
441 |
-
</td>
|
442 |
-
</tr>
|
443 |
-
<?php
|
444 |
-
}
|
445 |
-
}
|
446 |
-
|
447 |
-
/**
|
448 |
-
* Deactivation plugin
|
449 |
-
*
|
450 |
-
* @param string $file Plugin file path.
|
451 |
-
* @param boolean $network_wide Network wide.
|
452 |
-
*/
|
453 |
-
public static function deactivate_self( $file, $network_wide = false ) {
|
454 |
-
if ( is_multisite() && false !== $network_wide ) {
|
455 |
-
$network_wide = is_plugin_active_for_network( $file );
|
456 |
-
}
|
457 |
-
|
458 |
-
deactivate_plugins( $file, true, $network_wide );
|
459 |
-
}
|
460 |
-
|
461 |
-
/**
|
462 |
-
* Set message
|
463 |
-
*
|
464 |
-
* @param string $type Type error message.
|
465 |
-
* @param string $plugin Plugin transient name.
|
466 |
-
* @return boolean
|
467 |
-
*/
|
468 |
-
private function set_message( $type, $plugin ) {
|
469 |
-
$current = $this->get_plugin_data( 'current', 'Name' ) ? $this->get_plugin_data( 'current', 'Name' ) : $this->transient;
|
470 |
-
$version = $this->get_plugin_data( 'current', 'Version' );
|
471 |
-
$plugname = $this->get_plugin_data( $plugin, 'Name' ) ? $this->get_plugin_data( $plugin, 'Name' ) : $plugin;
|
472 |
-
|
473 |
-
$message = '';
|
474 |
-
switch ( $type ) {
|
475 |
-
case 'deactivate':
|
476 |
-
$version = $this->get_dep_ver( $plugin, 0 );
|
477 |
-
$message = __( '%2$s %3$s is required for %1$s. Deactivating %1$s.', 'ti-woocommerce-wishlist' );
|
478 |
-
if ( empty( $version ) ) {
|
479 |
-
$version = $this->get_dep_ver( $plugin, 1 );
|
480 |
-
}
|
481 |
-
if ( empty( $version ) ) {
|
482 |
-
$version = $this->get_dep_ver( $plugin, 2 );
|
483 |
-
}
|
484 |
-
if ( empty( $version ) ) {
|
485 |
-
$version = $this->get_dep_ver( $plugin, 3 );
|
486 |
-
$message = __( '%1$s is confilcted with %2$s %3$s. Deactivating %1$s.', 'ti-woocommerce-wishlist' );
|
487 |
-
}
|
488 |
-
if ( '*' === $version ) {
|
489 |
-
$version = $this->get_plugin_data( $plugin, 'Version' );
|
490 |
-
}
|
491 |
-
break;
|
492 |
-
case 'upgrade':
|
493 |
-
case 'update':
|
494 |
-
$version = $this->get_dep_ver( $plugin, 0 );
|
495 |
-
$message = __( '%2$s %3$s is required. Please update it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
496 |
-
break;
|
497 |
-
case 'downgrade':
|
498 |
-
case 'downdate':
|
499 |
-
$version = $this->get_dep_ver( $plugin, 1 );
|
500 |
-
$message = __( '%2$s %3$s is required. Please downgrade it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
501 |
-
break;
|
502 |
-
case 'need':
|
503 |
-
$version = '*' === $this->get_dep_ver( $plugin, 2 ) ? $this->get_plugin_data( $plugin, 'Version' ) : $this->get_dep_ver( $plugin, 2 );
|
504 |
-
$message = __( '%2$s %3$s is required. Please activate it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
505 |
-
break;
|
506 |
-
case 'conflict':
|
507 |
-
$version = '*' === $this->get_dep_ver( $plugin, 3 ) ? $this->get_plugin_data( $plugin, 'Version' ) : $this->get_dep_ver( $plugin, 3 );
|
508 |
-
$message = __( '%1$s is conflicted with %2$s %3$s. Please disable it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
509 |
-
break;
|
510 |
-
case 'activate':
|
511 |
-
$version = $this->get_dep_ver( $plugin, 1 );
|
512 |
-
$message = __( '%1$s %3$s is required. Please activate it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
513 |
-
break;
|
514 |
-
} // End switch().
|
515 |
-
if ( empty( $message ) ) {
|
516 |
-
return true;
|
517 |
-
}
|
518 |
-
if ( ! empty( $version ) ) {
|
519 |
-
$version = '(v' . $version . ')';
|
520 |
-
}
|
521 |
-
$message = sprintf( $message, $current, $plugname, $version );
|
522 |
-
|
523 |
-
$this->message[] = $message;
|
524 |
-
return false;
|
525 |
-
}
|
526 |
-
|
527 |
-
/**
|
528 |
-
* Add error admin notice
|
529 |
-
*/
|
530 |
-
public function admin_notices() {
|
531 |
-
if ( ! $this->status_dependency() ) {
|
532 |
-
printf( '<div class="error is-dismissible">%s</div>', $this->get_messages() ); // WPCS: xss ok.
|
533 |
-
}
|
534 |
-
}
|
535 |
-
|
536 |
-
/**
|
537 |
-
* Get plugin info
|
538 |
-
*
|
539 |
-
* @param string $plugin Plugin transient name.
|
540 |
-
* @param string $attr Plugin attribute name.
|
541 |
-
* @return mixed
|
542 |
-
*/
|
543 |
-
public function get_plugin_data( $plugin, $attr = null ) {
|
544 |
-
if ( 'current' === $plugin ) {
|
545 |
-
$plugin = $this->transient;
|
546 |
-
}
|
547 |
-
|
548 |
-
$plugin_path = $this->plugin_path . $plugin;
|
549 |
-
|
550 |
-
if ( ! array_key_exists( $plugin, $this->plugin_data ) ) {
|
551 |
-
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
552 |
-
$plugin_data = array_filter( @get_plugin_data( $plugin_path, false, false ) ); // @codingStandardsIgnoreLine Generic.PHP.NoSilencedErrors.Discouraged
|
553 |
-
if ( empty( $plugin_data ) ) {
|
554 |
-
$plugin_data = null;
|
555 |
-
}
|
556 |
-
$this->plugin_data[ $plugin ] = $plugin_data;
|
557 |
-
}
|
558 |
-
|
559 |
-
if ( empty( $attr ) ) {
|
560 |
-
return $this->plugin_data[ $plugin ];
|
561 |
-
}
|
562 |
-
if ( array_key_exists( $attr, (array) $this->plugin_data[ $plugin ] ) ) {
|
563 |
-
return $this->plugin_data[ $plugin ][ $attr ];
|
564 |
-
}
|
565 |
-
return null;
|
566 |
-
}
|
567 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Dependency plugin class
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Dependency plugin class
|
16 |
+
*/
|
17 |
+
class TInvWL_PluginExtend {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Plugin name
|
21 |
+
*
|
22 |
+
* @var string
|
23 |
+
*/
|
24 |
+
public $_name;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Plugin transient name
|
28 |
+
*
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
private $transient;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Plugin dependency array
|
35 |
+
*
|
36 |
+
* @var array
|
37 |
+
*/
|
38 |
+
private $dependency;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Current dependency name
|
42 |
+
*
|
43 |
+
* @var string
|
44 |
+
*/
|
45 |
+
private $dependency_current;
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Current dependency nice name
|
49 |
+
*
|
50 |
+
* @var string
|
51 |
+
*/
|
52 |
+
private $dependency_current_nice_name;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Plugin path dir
|
56 |
+
*
|
57 |
+
* @var string
|
58 |
+
*/
|
59 |
+
private $plugin_path;
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Cached plugin data
|
63 |
+
*
|
64 |
+
* @var array
|
65 |
+
*/
|
66 |
+
private $plugin_data;
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Plugin error message
|
70 |
+
*
|
71 |
+
* @var array
|
72 |
+
*/
|
73 |
+
public $message;
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Constructor
|
77 |
+
*
|
78 |
+
* @param string $plugin Plugin transient name, or can use Plugin root file.
|
79 |
+
* @param string $root_file Plugin root file, or can use Plugin transient name.
|
80 |
+
* @param string $plugin_name Plugin name.
|
81 |
+
*/
|
82 |
+
public function __construct( $plugin, $root_file = null, $plugin_name = TINVWL_PREFIX ) {
|
83 |
+
$this->_name = $plugin_name;
|
84 |
+
if ( empty( $plugin ) ) {
|
85 |
+
$this->transient = plugin_basename( $root_file );
|
86 |
+
$this->plugin_path = trailingslashit( plugin_dir_path( dirname( $root_file ) ) );
|
87 |
+
} else {
|
88 |
+
$this->transient = $plugin;
|
89 |
+
$this->plugin_path = trailingslashit( dirname( TINVWL_PATH ) );
|
90 |
+
}
|
91 |
+
$this->dependency = array();
|
92 |
+
$this->plugin_data = array();
|
93 |
+
$this->message = array();
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Run hooks dependency
|
98 |
+
*/
|
99 |
+
public function run() {
|
100 |
+
if ( 'plugins.php' === basename( $_SERVER['PHP_SELF'] ) && ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { // @codingStandardsIgnoreLine WordPress.VIP.SuperGlobalInputUsage.AccessDetected
|
101 |
+
add_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
102 |
+
|
103 |
+
$plugins = $this->get_dependency_plugins();
|
104 |
+
|
105 |
+
foreach ( $plugins as $plugin => $data ) {
|
106 |
+
add_filter( 'plugin_action_links_' . $plugin, array( $this, 'plugin_action_links_maybe_deactivate' ) );
|
107 |
+
add_filter( 'network_admin_plugin_action_links_' . $plugin, array( $this, 'plugin_action_links_maybe_deactivate' ) );
|
108 |
+
}
|
109 |
+
|
110 |
+
add_action( 'after_plugin_row_' . $this->transient, array( $this, 'plugin_row' ), 10 );
|
111 |
+
} else {
|
112 |
+
add_action( 'update_option_active_sitewide_plugins', array( $this, 'maybe_deactivate' ), 10, 2 );
|
113 |
+
add_action( 'update_option_active_plugins', array( $this, 'maybe_deactivate' ), 10, 2 );
|
114 |
+
}
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* Set dependency plugin transient name
|
119 |
+
*
|
120 |
+
* @param string $plugin Plugin transient name.
|
121 |
+
* @param string $nice_name Plugin nice name.
|
122 |
+
* @return \TInvWL_PluginExtend
|
123 |
+
*/
|
124 |
+
public function set_dependency( $plugin, $nice_name ) {
|
125 |
+
$this->dependency_current = $plugin;
|
126 |
+
$this->dependency_current_nice_name = $nice_name;
|
127 |
+
return $this;
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Reset current dependency plugin transient name
|
132 |
+
*
|
133 |
+
* @return \TInvWL_PluginExtend
|
134 |
+
*/
|
135 |
+
public function reset_dependency() {
|
136 |
+
$this->dependency_current = null;
|
137 |
+
return $this;
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Set dependency version by index rules
|
142 |
+
*
|
143 |
+
* @param integer $index Index rules.
|
144 |
+
* 0 Min version.
|
145 |
+
* 1 Max version.
|
146 |
+
* 2 Need plugin verion.
|
147 |
+
* 3 Conflict plugin verion.
|
148 |
+
* @param string $version Version dependency.
|
149 |
+
* @return boolean
|
150 |
+
*/
|
151 |
+
private function set_dependency_version( $index, $version = '1.0.0' ) {
|
152 |
+
if ( empty( $this->dependency_current ) ) {
|
153 |
+
return false;
|
154 |
+
}
|
155 |
+
if ( empty( $version ) ) {
|
156 |
+
$this->dependency[ $this->dependency_current ][ $index ] = null;
|
157 |
+
} else {
|
158 |
+
$this->dependency[ $this->dependency_current ][ $index ] = $version;
|
159 |
+
}
|
160 |
+
$this->dependency[ $this->dependency_current ]['nice_name'] = $this->dependency_current_nice_name;
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Set minimal dependency version
|
165 |
+
*
|
166 |
+
* @param string $version Version dependency.
|
167 |
+
* @return \TInvWL_PluginExtend
|
168 |
+
*/
|
169 |
+
public function min( $version = '1.0.0' ) {
|
170 |
+
if ( '*' === $version ) {
|
171 |
+
$version = '';
|
172 |
+
}
|
173 |
+
$this->set_dependency_version( 0, $version );
|
174 |
+
return $this;
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* Set maximum dependency version
|
179 |
+
*
|
180 |
+
* @param string $version Version dependency.
|
181 |
+
* @return \TInvWL_PluginExtend
|
182 |
+
*/
|
183 |
+
public function max( $version = '1.0.0' ) {
|
184 |
+
if ( '*' === $version ) {
|
185 |
+
$version = '';
|
186 |
+
}
|
187 |
+
$this->set_dependency_version( 1, $version );
|
188 |
+
return $this;
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Set need plugin dependency version
|
193 |
+
*
|
194 |
+
* @param string $version Version dependency. Can use '*' for check any version.
|
195 |
+
* @return \TInvWL_PluginExtend
|
196 |
+
*/
|
197 |
+
public function need( $version = '*' ) {
|
198 |
+
$this->set_dependency_version( 2, $version );
|
199 |
+
return $this;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Set conflict plugin dependency version
|
204 |
+
*
|
205 |
+
* @param string $version Version dependency. Can use '*' for check any version.
|
206 |
+
* @return \TInvWL_PluginExtend
|
207 |
+
*/
|
208 |
+
public function conflict( $version = '*' ) {
|
209 |
+
$this->set_dependency_version( 3, $version );
|
210 |
+
return $this;
|
211 |
+
}
|
212 |
+
|
213 |
+
/**
|
214 |
+
* Get dependency array
|
215 |
+
*
|
216 |
+
* @param string $plugin Plugin transient name.
|
217 |
+
* @return array
|
218 |
+
*/
|
219 |
+
private function get_dependency( $plugin ) {
|
220 |
+
if ( array_key_exists( $plugin, $this->dependency ) ) {
|
221 |
+
return $this->dependency[ $plugin ];
|
222 |
+
}
|
223 |
+
return array();
|
224 |
+
}
|
225 |
+
|
226 |
+
/**
|
227 |
+
* Get dependency version from array.
|
228 |
+
*
|
229 |
+
* @param string $plugin Plugin transient name.
|
230 |
+
* @param integer $index Index rules.
|
231 |
+
* 0 Min version.
|
232 |
+
* 1 Max version.
|
233 |
+
* 2 Need plugin verion.
|
234 |
+
* 3 Conflict plugin verion.
|
235 |
+
* @return array
|
236 |
+
*/
|
237 |
+
private function get_dep_ver( $plugin, $index ) {
|
238 |
+
$dependency = $this->get_dependency( $plugin );
|
239 |
+
if ( array_key_exists( $index, $dependency ) ) {
|
240 |
+
return $dependency[ $index ];
|
241 |
+
}
|
242 |
+
return null;
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* List dependency plugins
|
247 |
+
*
|
248 |
+
* @return array
|
249 |
+
*/
|
250 |
+
private function get_dependency_plugins() {
|
251 |
+
return $this->dependency;
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Check all dependency.
|
256 |
+
*
|
257 |
+
* @return boolean
|
258 |
+
*/
|
259 |
+
public function status_dependency() {
|
260 |
+
$this->message = array();
|
261 |
+
$plugins = $this->get_dependency_plugins();
|
262 |
+
$status = true;
|
263 |
+
|
264 |
+
foreach ( $plugins as $plugin => $data ) {
|
265 |
+
if ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_conflict_version( $plugin ) ) {
|
266 |
+
$status = $this->set_message( 'conflict', $data['nice_name'] );
|
267 |
+
} elseif ( ! is_plugin_active( $plugin ) || ! $this->is_plugin_at_need_version( $plugin ) ) {
|
268 |
+
$status = $this->set_message( 'need', $data['nice_name'] );
|
269 |
+
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_min_version( $plugin ) ) {
|
270 |
+
$status = $this->set_message( 'upgrade', $data['nice_name'] );
|
271 |
+
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_max_version( $plugin ) ) {
|
272 |
+
$status = $this->set_message( 'downgrade', $plugin );
|
273 |
+
} elseif ( ! is_plugin_active( $plugin ) ) {
|
274 |
+
$status = $this->set_message( 'activate', $data['nice_name'] );
|
275 |
+
}
|
276 |
+
}
|
277 |
+
return $status;
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Check plugin minimal version dependency.
|
282 |
+
*
|
283 |
+
* @param string $plugin Plugin transient name.
|
284 |
+
* @return boolean
|
285 |
+
*/
|
286 |
+
private function is_plugin_at_min_version( $plugin ) {
|
287 |
+
return $this->is_plugin_at_version( 0, $plugin );
|
288 |
+
}
|
289 |
+
|
290 |
+
/**
|
291 |
+
* Check plugin maximal version dependency.
|
292 |
+
*
|
293 |
+
* @param string $plugin Plugin transient name.
|
294 |
+
* @return boolean
|
295 |
+
*/
|
296 |
+
private function is_plugin_at_max_version( $plugin ) {
|
297 |
+
return $this->is_plugin_at_version( 1, $plugin );
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* Check plugin need version dependency.
|
302 |
+
*
|
303 |
+
* @param string $plugin Plugin transient name.
|
304 |
+
* @return boolean
|
305 |
+
*/
|
306 |
+
private function is_plugin_at_need_version( $plugin ) {
|
307 |
+
return $this->is_plugin_at_version( 2, $plugin );
|
308 |
+
}
|
309 |
+
|
310 |
+
/**
|
311 |
+
* Check plugin conflict version dependency.
|
312 |
+
*
|
313 |
+
* @param string $plugin Plugin transient name.
|
314 |
+
* @return boolean
|
315 |
+
*/
|
316 |
+
private function is_plugin_at_conflict_version( $plugin ) {
|
317 |
+
return $this->is_plugin_at_version( 3, $plugin );
|
318 |
+
}
|
319 |
+
|
320 |
+
/**
|
321 |
+
* Check plugin version dependency.
|
322 |
+
*
|
323 |
+
* @param integer $i Index rules.
|
324 |
+
* 0 Min version.
|
325 |
+
* 1 Max version.
|
326 |
+
* 2 Need plugin verion.
|
327 |
+
* 3 Conflict plugin verion.
|
328 |
+
* @param string $plugin Plugin transient name.
|
329 |
+
* @return boolean
|
330 |
+
*/
|
331 |
+
private function is_plugin_at_version( $i = 0, $plugin ) {
|
332 |
+
|
333 |
+
switch ( $i ) {
|
334 |
+
case 3:
|
335 |
+
$type = 'ne';
|
336 |
+
$i = 3;
|
337 |
+
break;
|
338 |
+
case 2:
|
339 |
+
$type = 'eq';
|
340 |
+
$i = 2;
|
341 |
+
break;
|
342 |
+
case 1:
|
343 |
+
$type = 'le';
|
344 |
+
$i = 1;
|
345 |
+
break;
|
346 |
+
case 0:
|
347 |
+
default:
|
348 |
+
$type = 'ge';
|
349 |
+
$i = 0;
|
350 |
+
}
|
351 |
+
$version = $this->get_dep_ver( $plugin, $i );
|
352 |
+
if ( is_null( $version ) ) {
|
353 |
+
return true;
|
354 |
+
}
|
355 |
+
$version_plugin = $this->get_plugin_data( $plugin, 'Version' );
|
356 |
+
if ( '*' === $version ) {
|
357 |
+
if ( 3 === $i ) {
|
358 |
+
return empty( $version_plugin );
|
359 |
+
} else {
|
360 |
+
return ! empty( $version_plugin );
|
361 |
+
}
|
362 |
+
}
|
363 |
+
return version_compare( $version_plugin, $version, $type );
|
364 |
+
}
|
365 |
+
|
366 |
+
/**
|
367 |
+
* Get error messages
|
368 |
+
*
|
369 |
+
* @param boolean $first Get first or all error messages.
|
370 |
+
* @return string
|
371 |
+
*/
|
372 |
+
public function get_messages( $first = false ) {
|
373 |
+
if ( $first ) {
|
374 |
+
$message = array_shift( $this->message );
|
375 |
+
$this->message = array();
|
376 |
+
return $message;
|
377 |
+
}
|
378 |
+
|
379 |
+
$message = '<p>' . implode( '</p><p>', $this->message ) . '</p>';
|
380 |
+
$this->message = array();
|
381 |
+
return $message;
|
382 |
+
}
|
383 |
+
|
384 |
+
/**
|
385 |
+
* Deactivation plugin
|
386 |
+
*
|
387 |
+
* @param string $old_value Not used.
|
388 |
+
* @param string $value Not used.
|
389 |
+
* @return string
|
390 |
+
*/
|
391 |
+
public function maybe_deactivate( $old_value, $value ) {
|
392 |
+
if ( ! $this->status_dependency() ) {
|
393 |
+
self::deactivate_self( $this->transient );
|
394 |
+
|
395 |
+
if ( defined( 'WP_CLI' ) && WP_CLI ) {
|
396 |
+
$plugins = $this->get_dependency_plugins();
|
397 |
+
$this->get_messages();
|
398 |
+
|
399 |
+
foreach ( $plugins as $plugin => $data ) {
|
400 |
+
if ( ! is_plugin_active( $plugin ) || ! $this->is_plugin_at_need_version( $plugin ) ) {
|
401 |
+
return WP_CLI::error( $this->get_message( 'deactivate', $data['nice_name'] ) );
|
402 |
+
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_min_version( $plugin ) ) {
|
403 |
+
return WP_CLI::error( $this->get_message( 'deactivate', $data['nice_name'] ) );
|
404 |
+
} elseif ( is_plugin_active( $plugin ) && ! $this->is_plugin_at_max_version( $plugin ) ) {
|
405 |
+
return WP_CLI::error( $this->get_message( 'deactivate', $data['nice_name'] ) );
|
406 |
+
}
|
407 |
+
}
|
408 |
+
}
|
409 |
+
}
|
410 |
+
}
|
411 |
+
|
412 |
+
/**
|
413 |
+
* Deactivation plugin
|
414 |
+
*
|
415 |
+
* @param string $actions Not used.
|
416 |
+
* @return string
|
417 |
+
*/
|
418 |
+
public function plugin_action_links_maybe_deactivate( $actions ) {
|
419 |
+
if ( ! $this->status_dependency() ) {
|
420 |
+
self::deactivate_self( $this->transient );
|
421 |
+
}
|
422 |
+
return $actions;
|
423 |
+
}
|
424 |
+
|
425 |
+
/**
|
426 |
+
* Return message in plugin lists table
|
427 |
+
*
|
428 |
+
* @param string $file Plugin file path.
|
429 |
+
*/
|
430 |
+
public function plugin_row( $file ) {
|
431 |
+
if ( ! $this->status_dependency() ) {
|
432 |
+
$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
|
433 |
+
?>
|
434 |
+
<tr class="plugin-update-tr installer-plugin-update-tr">
|
435 |
+
<td colspan="<?php echo $wp_list_table->get_column_count(); // WPCS: xss ok. ?>" class="plugin-update colspanchange">
|
436 |
+
<div class="notice inline notice-warning notice-alt">
|
437 |
+
<p class="installer-q-icon">
|
438 |
+
<?php echo $this->get_messages( true ); // WPCS: xss ok. ?>
|
439 |
+
</p>
|
440 |
+
</div>
|
441 |
+
</td>
|
442 |
+
</tr>
|
443 |
+
<?php
|
444 |
+
}
|
445 |
+
}
|
446 |
+
|
447 |
+
/**
|
448 |
+
* Deactivation plugin
|
449 |
+
*
|
450 |
+
* @param string $file Plugin file path.
|
451 |
+
* @param boolean $network_wide Network wide.
|
452 |
+
*/
|
453 |
+
public static function deactivate_self( $file, $network_wide = false ) {
|
454 |
+
if ( is_multisite() && false !== $network_wide ) {
|
455 |
+
$network_wide = is_plugin_active_for_network( $file );
|
456 |
+
}
|
457 |
+
|
458 |
+
deactivate_plugins( $file, true, $network_wide );
|
459 |
+
}
|
460 |
+
|
461 |
+
/**
|
462 |
+
* Set message
|
463 |
+
*
|
464 |
+
* @param string $type Type error message.
|
465 |
+
* @param string $plugin Plugin transient name.
|
466 |
+
* @return boolean
|
467 |
+
*/
|
468 |
+
private function set_message( $type, $plugin ) {
|
469 |
+
$current = $this->get_plugin_data( 'current', 'Name' ) ? $this->get_plugin_data( 'current', 'Name' ) : $this->transient;
|
470 |
+
$version = $this->get_plugin_data( 'current', 'Version' );
|
471 |
+
$plugname = $this->get_plugin_data( $plugin, 'Name' ) ? $this->get_plugin_data( $plugin, 'Name' ) : $plugin;
|
472 |
+
|
473 |
+
$message = '';
|
474 |
+
switch ( $type ) {
|
475 |
+
case 'deactivate':
|
476 |
+
$version = $this->get_dep_ver( $plugin, 0 );
|
477 |
+
$message = __( '%2$s %3$s is required for %1$s. Deactivating %1$s.', 'ti-woocommerce-wishlist' );
|
478 |
+
if ( empty( $version ) ) {
|
479 |
+
$version = $this->get_dep_ver( $plugin, 1 );
|
480 |
+
}
|
481 |
+
if ( empty( $version ) ) {
|
482 |
+
$version = $this->get_dep_ver( $plugin, 2 );
|
483 |
+
}
|
484 |
+
if ( empty( $version ) ) {
|
485 |
+
$version = $this->get_dep_ver( $plugin, 3 );
|
486 |
+
$message = __( '%1$s is confilcted with %2$s %3$s. Deactivating %1$s.', 'ti-woocommerce-wishlist' );
|
487 |
+
}
|
488 |
+
if ( '*' === $version ) {
|
489 |
+
$version = $this->get_plugin_data( $plugin, 'Version' );
|
490 |
+
}
|
491 |
+
break;
|
492 |
+
case 'upgrade':
|
493 |
+
case 'update':
|
494 |
+
$version = $this->get_dep_ver( $plugin, 0 );
|
495 |
+
$message = __( '%2$s %3$s is required. Please update it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
496 |
+
break;
|
497 |
+
case 'downgrade':
|
498 |
+
case 'downdate':
|
499 |
+
$version = $this->get_dep_ver( $plugin, 1 );
|
500 |
+
$message = __( '%2$s %3$s is required. Please downgrade it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
501 |
+
break;
|
502 |
+
case 'need':
|
503 |
+
$version = '*' === $this->get_dep_ver( $plugin, 2 ) ? $this->get_plugin_data( $plugin, 'Version' ) : $this->get_dep_ver( $plugin, 2 );
|
504 |
+
$message = __( '%2$s %3$s is required. Please activate it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
505 |
+
break;
|
506 |
+
case 'conflict':
|
507 |
+
$version = '*' === $this->get_dep_ver( $plugin, 3 ) ? $this->get_plugin_data( $plugin, 'Version' ) : $this->get_dep_ver( $plugin, 3 );
|
508 |
+
$message = __( '%1$s is conflicted with %2$s %3$s. Please disable it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
509 |
+
break;
|
510 |
+
case 'activate':
|
511 |
+
$version = $this->get_dep_ver( $plugin, 1 );
|
512 |
+
$message = __( '%1$s %3$s is required. Please activate it before activating this plugin.', 'ti-woocommerce-wishlist' );
|
513 |
+
break;
|
514 |
+
} // End switch().
|
515 |
+
if ( empty( $message ) ) {
|
516 |
+
return true;
|
517 |
+
}
|
518 |
+
if ( ! empty( $version ) ) {
|
519 |
+
$version = '(v' . $version . ')';
|
520 |
+
}
|
521 |
+
$message = sprintf( $message, $current, $plugname, $version );
|
522 |
+
|
523 |
+
$this->message[] = $message;
|
524 |
+
return false;
|
525 |
+
}
|
526 |
+
|
527 |
+
/**
|
528 |
+
* Add error admin notice
|
529 |
+
*/
|
530 |
+
public function admin_notices() {
|
531 |
+
if ( ! $this->status_dependency() ) {
|
532 |
+
printf( '<div class="error is-dismissible">%s</div>', $this->get_messages() ); // WPCS: xss ok.
|
533 |
+
}
|
534 |
+
}
|
535 |
+
|
536 |
+
/**
|
537 |
+
* Get plugin info
|
538 |
+
*
|
539 |
+
* @param string $plugin Plugin transient name.
|
540 |
+
* @param string $attr Plugin attribute name.
|
541 |
+
* @return mixed
|
542 |
+
*/
|
543 |
+
public function get_plugin_data( $plugin, $attr = null ) {
|
544 |
+
if ( 'current' === $plugin ) {
|
545 |
+
$plugin = $this->transient;
|
546 |
+
}
|
547 |
+
|
548 |
+
$plugin_path = $this->plugin_path . $plugin;
|
549 |
+
|
550 |
+
if ( ! array_key_exists( $plugin, $this->plugin_data ) ) {
|
551 |
+
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
552 |
+
$plugin_data = array_filter( @get_plugin_data( $plugin_path, false, false ) ); // @codingStandardsIgnoreLine Generic.PHP.NoSilencedErrors.Discouraged
|
553 |
+
if ( empty( $plugin_data ) ) {
|
554 |
+
$plugin_data = null;
|
555 |
+
}
|
556 |
+
$this->plugin_data[ $plugin ] = $plugin_data;
|
557 |
+
}
|
558 |
+
|
559 |
+
if ( empty( $attr ) ) {
|
560 |
+
return $this->plugin_data[ $plugin ];
|
561 |
+
}
|
562 |
+
if ( array_key_exists( $attr, (array) $this->plugin_data[ $plugin ] ) ) {
|
563 |
+
return $this->plugin_data[ $plugin ][ $attr ];
|
564 |
+
}
|
565 |
+
return null;
|
566 |
+
}
|
567 |
+
}
|
includes/product.helper.php
CHANGED
@@ -27,7 +27,7 @@ class TInvWL_Product {
|
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
-
private $
|
31 |
/**
|
32 |
* Wishlist object
|
33 |
*
|
@@ -53,8 +53,8 @@ class TInvWL_Product {
|
|
53 |
global $wpdb;
|
54 |
|
55 |
$this->wishlist = (array) $wishlist;
|
56 |
-
$this->
|
57 |
-
$this->table = sprintf( '%s%s_%s', $wpdb->prefix, $this->
|
58 |
$this->user = $this->wishlist_author();
|
59 |
if ( empty( $this->user ) ) {
|
60 |
$user = wp_get_current_user();
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
+
private $_name;
|
31 |
/**
|
32 |
* Wishlist object
|
33 |
*
|
53 |
global $wpdb;
|
54 |
|
55 |
$this->wishlist = (array) $wishlist;
|
56 |
+
$this->_name = $plugin_name;
|
57 |
+
$this->table = sprintf( '%s%s_%s', $wpdb->prefix, $this->_name, 'items' );
|
58 |
$this->user = $this->wishlist_author();
|
59 |
if ( empty( $this->user ) ) {
|
60 |
$user = wp_get_current_user();
|
includes/product/legacy.class.php
CHANGED
@@ -21,7 +21,7 @@ class TInvWL_Product_Legacy {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
private $
|
25 |
/**
|
26 |
* Array products
|
27 |
*
|
@@ -61,7 +61,7 @@ class TInvWL_Product_Legacy {
|
|
61 |
*/
|
62 |
function __construct( $plugin_name = TINVWL_PREFIX ) {
|
63 |
|
64 |
-
$this->
|
65 |
$this->products = array();
|
66 |
$this->products_autoinc = 0;
|
67 |
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
private $_name;
|
25 |
/**
|
26 |
* Array products
|
27 |
*
|
61 |
*/
|
62 |
function __construct( $plugin_name = TINVWL_PREFIX ) {
|
63 |
|
64 |
+
$this->_name = $plugin_name;
|
65 |
$this->products = array();
|
66 |
$this->products_autoinc = 0;
|
67 |
|
includes/tinvwl.class.php
CHANGED
@@ -21,13 +21,13 @@ class TInvWL {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
private $
|
25 |
/**
|
26 |
* Plugin version
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
-
private $
|
31 |
/**
|
32 |
* Admin class
|
33 |
*
|
@@ -46,30 +46,30 @@ class TInvWL {
|
|
46 |
* Created admin and public class
|
47 |
*/
|
48 |
function __construct() {
|
49 |
-
$this->
|
50 |
-
$this->
|
51 |
|
52 |
$this->set_locale();
|
53 |
$this->maybe_update();
|
54 |
$this->load_function();
|
55 |
$this->define_hooks();
|
56 |
-
$this->object_admin = new TInvWL_Admin_TInvWL( $this->
|
57 |
-
$this->object_public = TInvWL_Public_TInvWL::instance( $this->
|
58 |
}
|
59 |
|
60 |
/**
|
61 |
* Run plugin
|
62 |
*/
|
63 |
function run() {
|
64 |
-
if ( is_null( get_option( $this->
|
65 |
TInvWL_Activator::activate();
|
66 |
}
|
67 |
$object = null;
|
68 |
-
TInvWL_View::_init( $this->
|
69 |
-
TInvWL_Form::_init( $this->
|
70 |
|
71 |
if ( is_admin() ) {
|
72 |
-
new TInvWL_WizardSetup( $this->
|
73 |
$object = $this->object_admin;
|
74 |
} else {
|
75 |
$object = $this->object_public;
|
@@ -119,16 +119,16 @@ class TInvWL {
|
|
119 |
* Testing for the ability to update the functional
|
120 |
*/
|
121 |
function maybe_update() {
|
122 |
-
$prev = get_option( $this->
|
123 |
if ( false === $prev ) {
|
124 |
-
add_option( $this->
|
125 |
-
$prev = $this->
|
126 |
}
|
127 |
-
if ( version_compare( $this->
|
128 |
TInvWL_Activator::update();
|
129 |
-
new TInvWL_Update( $this->
|
130 |
-
update_option( $this->
|
131 |
-
do_action( 'tinvwl_updated', $this->
|
132 |
}
|
133 |
}
|
134 |
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
private $_name;
|
25 |
/**
|
26 |
* Plugin version
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
+
private $_version;
|
31 |
/**
|
32 |
* Admin class
|
33 |
*
|
46 |
* Created admin and public class
|
47 |
*/
|
48 |
function __construct() {
|
49 |
+
$this->_name = TINVWL_PREFIX;
|
50 |
+
$this->_version = TINVWL_FVERSION;
|
51 |
|
52 |
$this->set_locale();
|
53 |
$this->maybe_update();
|
54 |
$this->load_function();
|
55 |
$this->define_hooks();
|
56 |
+
$this->object_admin = new TInvWL_Admin_TInvWL( $this->_name, $this->_version );
|
57 |
+
$this->object_public = TInvWL_Public_TInvWL::instance( $this->_name, $this->_version );
|
58 |
}
|
59 |
|
60 |
/**
|
61 |
* Run plugin
|
62 |
*/
|
63 |
function run() {
|
64 |
+
if ( is_null( get_option( $this->_name . '_db_ver', null ) ) ) {
|
65 |
TInvWL_Activator::activate();
|
66 |
}
|
67 |
$object = null;
|
68 |
+
TInvWL_View::_init( $this->_name, $this->_version );
|
69 |
+
TInvWL_Form::_init( $this->_name );
|
70 |
|
71 |
if ( is_admin() ) {
|
72 |
+
new TInvWL_WizardSetup( $this->_name, $this->_version );
|
73 |
$object = $this->object_admin;
|
74 |
} else {
|
75 |
$object = $this->object_public;
|
119 |
* Testing for the ability to update the functional
|
120 |
*/
|
121 |
function maybe_update() {
|
122 |
+
$prev = get_option( $this->_name . '_ver' );
|
123 |
if ( false === $prev ) {
|
124 |
+
add_option( $this->_name . '_ver', $this->_version );
|
125 |
+
$prev = $this->_version;
|
126 |
}
|
127 |
+
if ( version_compare( $this->_version, $prev, 'gt' ) ) {
|
128 |
TInvWL_Activator::update();
|
129 |
+
new TInvWL_Update( $this->_version, $prev );
|
130 |
+
update_option( $this->_name . '_ver', $this->_version );
|
131 |
+
do_action( 'tinvwl_updated', $this->_version, $prev );
|
132 |
}
|
133 |
}
|
134 |
|
includes/update.helper.php
CHANGED
@@ -21,14 +21,14 @@ class TInvWL_Update {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
private $
|
25 |
|
26 |
/**
|
27 |
* Version
|
28 |
*
|
29 |
* @var string
|
30 |
*/
|
31 |
-
public $
|
32 |
|
33 |
/**
|
34 |
* Previous Version
|
@@ -54,8 +54,8 @@ class TInvWL_Update {
|
|
54 |
*/
|
55 |
function __construct( $version, $previous_version = 0 ) {
|
56 |
$lists = get_class_methods( $this );
|
57 |
-
$this->
|
58 |
-
$this->
|
59 |
$this->_prev = $previous_version;
|
60 |
$lists = array_filter( $lists, array( $this, 'filter' ) );
|
61 |
if ( empty( $lists ) ) {
|
@@ -84,7 +84,7 @@ class TInvWL_Update {
|
|
84 |
return false;
|
85 |
}
|
86 |
|
87 |
-
return version_compare( $this->
|
88 |
}
|
89 |
|
90 |
/**
|
@@ -160,8 +160,8 @@ class TInvWL_Update {
|
|
160 |
*/
|
161 |
function up_p_1_6_1() {
|
162 |
global $wpdb;
|
163 |
-
$wishlists_table = sprintf( '%s%s_%s', $wpdb->prefix, $this->
|
164 |
-
$wishlists_items_table = sprintf( '%s%s_%s', $wpdb->prefix, $this->
|
165 |
$sql = "DELETE FROM wl USING `{$wishlists_table}` AS wl WHERE NOT EXISTS( SELECT * FROM `{$wishlists_items_table}` WHERE {$wishlists_items_table}.wishlist_id = wl.ID ) AND wl.type='default'";
|
166 |
$cleanup = $wpdb->get_results( $sql, ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
167 |
}
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
private $_name;
|
25 |
|
26 |
/**
|
27 |
* Version
|
28 |
*
|
29 |
* @var string
|
30 |
*/
|
31 |
+
public $_version;
|
32 |
|
33 |
/**
|
34 |
* Previous Version
|
54 |
*/
|
55 |
function __construct( $version, $previous_version = 0 ) {
|
56 |
$lists = get_class_methods( $this );
|
57 |
+
$this->_name = TINVWL_PREFIX;
|
58 |
+
$this->_version = $version;
|
59 |
$this->_prev = $previous_version;
|
60 |
$lists = array_filter( $lists, array( $this, 'filter' ) );
|
61 |
if ( empty( $lists ) ) {
|
84 |
return false;
|
85 |
}
|
86 |
|
87 |
+
return version_compare( $this->_version, $this->prepare( $method ), 'ge' );
|
88 |
}
|
89 |
|
90 |
/**
|
160 |
*/
|
161 |
function up_p_1_6_1() {
|
162 |
global $wpdb;
|
163 |
+
$wishlists_table = sprintf( '%s%s_%s', $wpdb->prefix, $this->_name, 'lists' );
|
164 |
+
$wishlists_items_table = sprintf( '%s%s_%s', $wpdb->prefix, $this->_name, 'items' );
|
165 |
$sql = "DELETE FROM wl USING `{$wishlists_table}` AS wl WHERE NOT EXISTS( SELECT * FROM `{$wishlists_items_table}` WHERE {$wishlists_items_table}.wishlist_id = wl.ID ) AND wl.type='default'";
|
166 |
$cleanup = $wpdb->get_results( $sql, ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
167 |
}
|
includes/view.helper.php
CHANGED
@@ -21,13 +21,13 @@ class TInvWL_View {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
static $
|
25 |
/**
|
26 |
* Plugin version
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
-
static $
|
31 |
/**
|
32 |
* Redirect url
|
33 |
*
|
@@ -48,8 +48,8 @@ class TInvWL_View {
|
|
48 |
* @param string $version Plugin version.
|
49 |
*/
|
50 |
public static function _init( $plugin_name, $version ) {
|
51 |
-
self::$
|
52 |
-
self::$
|
53 |
}
|
54 |
|
55 |
/**
|
@@ -85,7 +85,7 @@ class TInvWL_View {
|
|
85 |
* @return mixed
|
86 |
*/
|
87 |
public static function get_session_arr( $name, $default = array() ) {
|
88 |
-
$data = get_option( self::$
|
89 |
if ( empty( $data ) ) {
|
90 |
return $default;
|
91 |
}
|
@@ -100,7 +100,7 @@ class TInvWL_View {
|
|
100 |
* @param mixed $value Value.
|
101 |
*/
|
102 |
public static function set_session_arr( $name, $value = array() ) {
|
103 |
-
update_option( self::$
|
104 |
}
|
105 |
|
106 |
/**
|
@@ -374,7 +374,7 @@ class TInvWL_View {
|
|
374 |
$protocol = is_ssl() ? 'https' : 'http';
|
375 |
$glue = '-';
|
376 |
$params = array(
|
377 |
-
'page' => implode( $glue, array_filter( array( self::$
|
378 |
'cat' => $cat,
|
379 |
);
|
380 |
if ( is_array( $arg ) ) {
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
static $_name;
|
25 |
/**
|
26 |
* Plugin version
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
+
static $_version;
|
31 |
/**
|
32 |
* Redirect url
|
33 |
*
|
48 |
* @param string $version Plugin version.
|
49 |
*/
|
50 |
public static function _init( $plugin_name, $version ) {
|
51 |
+
self::$_name = $plugin_name;
|
52 |
+
self::$_version = $version;
|
53 |
}
|
54 |
|
55 |
/**
|
85 |
* @return mixed
|
86 |
*/
|
87 |
public static function get_session_arr( $name, $default = array() ) {
|
88 |
+
$data = get_option( self::$_name . $name, $default );
|
89 |
if ( empty( $data ) ) {
|
90 |
return $default;
|
91 |
}
|
100 |
* @param mixed $value Value.
|
101 |
*/
|
102 |
public static function set_session_arr( $name, $value = array() ) {
|
103 |
+
update_option( self::$_name . $name, $value );
|
104 |
}
|
105 |
|
106 |
/**
|
374 |
$protocol = is_ssl() ? 'https' : 'http';
|
375 |
$glue = '-';
|
376 |
$params = array(
|
377 |
+
'page' => implode( $glue, array_filter( array( self::$_name, $page ) ) ),
|
378 |
'cat' => $cat,
|
379 |
);
|
380 |
if ( is_array( $arg ) ) {
|
includes/viewsection.helper.php
CHANGED
@@ -1,548 +1,548 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* View sction plugin class
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist\Helper
|
7 |
-
* @subpackage View
|
8 |
-
*/
|
9 |
-
|
10 |
-
// If this file is called directly, abort.
|
11 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
-
die;
|
13 |
-
}
|
14 |
-
|
15 |
-
/**
|
16 |
-
* View sction plugin class
|
17 |
-
*/
|
18 |
-
class TInvWL_ViewSection extends TInvWL_View {
|
19 |
-
|
20 |
-
/**
|
21 |
-
* Array form fields
|
22 |
-
*
|
23 |
-
* @var array
|
24 |
-
*/
|
25 |
-
private $data;
|
26 |
-
/**
|
27 |
-
* Array form value fields
|
28 |
-
*
|
29 |
-
* @var array
|
30 |
-
*/
|
31 |
-
private $value;
|
32 |
-
/**
|
33 |
-
* Helper show flag
|
34 |
-
*
|
35 |
-
* @var boolean
|
36 |
-
*/
|
37 |
-
private $helper;
|
38 |
-
|
39 |
-
/**
|
40 |
-
* Constructor
|
41 |
-
*
|
42 |
-
* @param string $plugin_name Plugin name.
|
43 |
-
* @param string $version Plugin version.
|
44 |
-
*/
|
45 |
-
function __construct( $plugin_name, $version ) {
|
46 |
-
self::$
|
47 |
-
self::$
|
48 |
-
$this->data = array();
|
49 |
-
$this->value = array();
|
50 |
-
$this->helper = false;
|
51 |
-
}
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Prepare section info
|
55 |
-
*
|
56 |
-
* @param array $content Array section info.
|
57 |
-
* @return array
|
58 |
-
*/
|
59 |
-
function section_data( $content ) {
|
60 |
-
$data = array();
|
61 |
-
if ( array_key_exists( 'fields', $content ) ) {
|
62 |
-
unset( $content['fields'] );
|
63 |
-
}
|
64 |
-
foreach ( array( 'id', 'title', 'desc', 'show_names' ) as $field ) {
|
65 |
-
if ( array_key_exists( $field, $content ) ) {
|
66 |
-
$data[ $field ] = $content[ $field ];
|
67 |
-
unset( $content[ $field ] );
|
68 |
-
} else {
|
69 |
-
$data[ $field ] = '';
|
70 |
-
}
|
71 |
-
}
|
72 |
-
$data['extra'] = $content;
|
73 |
-
$data['show_names'] = filter_var( $data['show_names'], FILTER_VALIDATE_BOOLEAN );
|
74 |
-
$data['show_helper'] = $this->helper;
|
75 |
-
return $data;
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Update section info for show helper block
|
80 |
-
*
|
81 |
-
* @param array $section Array section info.
|
82 |
-
*/
|
83 |
-
function section_helper( $section ) {
|
84 |
-
$this->helper = false;
|
85 |
-
if ( array_key_exists( 'desc', $section ) ) {
|
86 |
-
$this->helper = true;
|
87 |
-
}
|
88 |
-
if ( array_key_exists( 'fields', $section ) ) {
|
89 |
-
foreach ( $section['fields'] as $field ) {
|
90 |
-
if ( array_key_exists( 'desc', $field ) ) {
|
91 |
-
$this->helper = true;
|
92 |
-
}
|
93 |
-
}
|
94 |
-
}
|
95 |
-
}
|
96 |
-
|
97 |
-
/**
|
98 |
-
* Create show section
|
99 |
-
*
|
100 |
-
* @param array $data Array section.
|
101 |
-
* @return string
|
102 |
-
*/
|
103 |
-
function section( $data ) {
|
104 |
-
$fields = array();
|
105 |
-
$this->section_helper( $data );
|
106 |
-
if ( array_key_exists( 'fields', $data ) ) {
|
107 |
-
$fields = $data['fields'];
|
108 |
-
}
|
109 |
-
$skin = 'section-general';
|
110 |
-
if ( array_key_exists( 'skin', $data ) ) {
|
111 |
-
$skin = $data['skin'];
|
112 |
-
unset( $data['skin'] );
|
113 |
-
}
|
114 |
-
$field_counts = count( $fields );
|
115 |
-
$data = $this->section_data( $data );
|
116 |
-
|
117 |
-
$data['extra']['id'] = $this->section_id = $data['id'];
|
118 |
-
if ( array_key_exists( 'class', $data['extra'] ) ) {
|
119 |
-
$data['extra']['class'] .= ' tinvwl-panel w-bg w-shadow';
|
120 |
-
} else {
|
121 |
-
$data['extra']['class'] = 'tinvwl-panel w-bg w-shadow';
|
122 |
-
}
|
123 |
-
if ( array_key_exists( $this->section_id, $this->value ) ) {
|
124 |
-
foreach ( $this->value[ $this->section_id ] as $key => $value ) {
|
125 |
-
TInvWL_Form::setvalue( sprintf( '%s-%s', $this->section_id, $key ), $value );
|
126 |
-
}
|
127 |
-
}
|
128 |
-
|
129 |
-
$data['groups'] = $this->groups( $fields );
|
130 |
-
|
131 |
-
$data['extra'] = TInvWL_Form::__atrtostr( $data['extra'] );
|
132 |
-
ob_start();
|
133 |
-
do_action( self::$
|
134 |
-
self::view( $skin, $data, '' );
|
135 |
-
wp_nonce_field( self::$
|
136 |
-
do_action( self::$
|
137 |
-
return ob_get_clean();
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* Prepare group fields
|
142 |
-
*
|
143 |
-
* @param array $fields Array group fields.
|
144 |
-
* @return array
|
145 |
-
*/
|
146 |
-
function prepare_group( $fields ) {
|
147 |
-
$groups = array();
|
148 |
-
$group = array();
|
149 |
-
foreach ( $fields as $field ) {
|
150 |
-
switch ( $field['type'] ) {
|
151 |
-
case 'groupHTML':
|
152 |
-
if ( ! empty( $group ) ) {
|
153 |
-
$group['type'] = 'group';
|
154 |
-
$groups[] = $group;
|
155 |
-
}
|
156 |
-
$group = $field;
|
157 |
-
$group['type'] = 'groupHTML';
|
158 |
-
$groups[] = $group;
|
159 |
-
$group = array();
|
160 |
-
break;
|
161 |
-
case 'group':
|
162 |
-
if ( ! empty( $group ) ) {
|
163 |
-
$group['type'] = 'group';
|
164 |
-
$groups[] = $group;
|
165 |
-
}
|
166 |
-
$group = $field;
|
167 |
-
break;
|
168 |
-
case 'groupend':
|
169 |
-
$group['type'] = 'group';
|
170 |
-
$groups[] = $group;
|
171 |
-
$group = array();
|
172 |
-
break;
|
173 |
-
default:
|
174 |
-
$group['fields'][] = $field;
|
175 |
-
break;
|
176 |
-
}
|
177 |
-
}
|
178 |
-
if ( ! empty( $group ) ) {
|
179 |
-
$group['type'] = 'group';
|
180 |
-
$groups[] = $group;
|
181 |
-
}
|
182 |
-
return $groups;
|
183 |
-
}
|
184 |
-
|
185 |
-
|
186 |
-
/**
|
187 |
-
* Create show group
|
188 |
-
*
|
189 |
-
* @param array $data Array group.
|
190 |
-
* @return string
|
191 |
-
*/
|
192 |
-
function group( $data ) {
|
193 |
-
$fields = array();
|
194 |
-
if ( array_key_exists( 'fields', $data ) ) {
|
195 |
-
$fields = $data['fields'];
|
196 |
-
}
|
197 |
-
$html = false;
|
198 |
-
$html_content = '';
|
199 |
-
if ( 'groupHTML' === $data['type'] ) {
|
200 |
-
$html = true;
|
201 |
-
$html_content = $data['html'];
|
202 |
-
unset( $data['html'] );
|
203 |
-
}
|
204 |
-
$skin = 'section-group';
|
205 |
-
if ( array_key_exists( 'skin', $data ) ) {
|
206 |
-
$skin = $data['skin'];
|
207 |
-
unset( $data['skin'] );
|
208 |
-
}
|
209 |
-
$data = $this->section_data( $data );
|
210 |
-
|
211 |
-
if ( empty( $data['id'] ) ) {
|
212 |
-
$this->group_id = $this->section_id;
|
213 |
-
} else {
|
214 |
-
$data['id'] = sprintf( '%s-%s', $this->section_id, $data['id'] );
|
215 |
-
|
216 |
-
$data['extra']['id'] = $this->group_id = $data['id'];
|
217 |
-
}
|
218 |
-
if ( array_key_exists( 'class', $data['extra'] ) ) {
|
219 |
-
$data['extra']['class'] .= ' content-in';
|
220 |
-
} else {
|
221 |
-
$data['extra']['class'] = 'content-in';
|
222 |
-
}
|
223 |
-
unset( $data['extra']['type'] );
|
224 |
-
if ( $html ) {
|
225 |
-
$data['fields_count'] = 1;
|
226 |
-
ob_start();
|
227 |
-
self::view( 'section-field-html', array(
|
228 |
-
'html' => $html_content,
|
229 |
-
'show_field_desc' => true,
|
230 |
-
'show_helper' => $this->helper,
|
231 |
-
'desc' => '',
|
232 |
-
'extra_div' => '',
|
233 |
-
), '' );
|
234 |
-
$data['fields'] = ob_get_clean();
|
235 |
-
} else {
|
236 |
-
$data['fields_count'] = count( $fields ) + 1;
|
237 |
-
$data['fields'] = $this->fields( $fields, empty( $data['desc'] ) );
|
238 |
-
}
|
239 |
-
$data['extra']['id'] = $data['id'];
|
240 |
-
|
241 |
-
$data['extra'] = TInvWL_Form::__atrtostr( $data['extra'] );
|
242 |
-
ob_start();
|
243 |
-
do_action( self::$
|
244 |
-
self::view( $skin, $data, '' );
|
245 |
-
do_action( self::$
|
246 |
-
return ob_get_clean();
|
247 |
-
}
|
248 |
-
|
249 |
-
/**
|
250 |
-
* Build groups
|
251 |
-
*
|
252 |
-
* @param array $fields Array fields.
|
253 |
-
* @return string
|
254 |
-
*/
|
255 |
-
function groups( $fields ) {
|
256 |
-
$groups = $this->prepare_group( $fields );
|
257 |
-
$content = '';
|
258 |
-
foreach ( $groups as $data ) {
|
259 |
-
$content .= $this->group( $data );
|
260 |
-
}
|
261 |
-
return $content;
|
262 |
-
}
|
263 |
-
|
264 |
-
/**
|
265 |
-
* Prepare fields
|
266 |
-
*
|
267 |
-
* @param array $content Array fields info.
|
268 |
-
* @return array
|
269 |
-
*/
|
270 |
-
function field_data( $content ) {
|
271 |
-
$data = array();
|
272 |
-
if ( array_key_exists( 'fields', $content ) ) {
|
273 |
-
unset( $content['fields'] );
|
274 |
-
}
|
275 |
-
foreach ( array( 'type', 'name', 'text', 'std', 'desc', 'options', 'extra', 'extra_label', 'validate' ) as $field ) {
|
276 |
-
if ( array_key_exists( $field, $content ) ) {
|
277 |
-
$data[ $field ] = $content[ $field ];
|
278 |
-
unset( $content[ $field ] );
|
279 |
-
} else {
|
280 |
-
$data[ $field ] = '';
|
281 |
-
}
|
282 |
-
}
|
283 |
-
if ( empty( $data['extra'] ) ) {
|
284 |
-
$data['extra'] = array();
|
285 |
-
}
|
286 |
-
$data['extra_div'] = $content;
|
287 |
-
$data['show_helper'] = $this->helper;
|
288 |
-
return $data;
|
289 |
-
}
|
290 |
-
|
291 |
-
/**
|
292 |
-
* Create field
|
293 |
-
*
|
294 |
-
* @param array $data Array feild attributes.
|
295 |
-
* @param array $show_field_desc Show field descrioptions or field decriptions.
|
296 |
-
* @return string
|
297 |
-
*/
|
298 |
-
function field( $data, $show_field_desc = true ) {
|
299 |
-
$skin = 'section-field';
|
300 |
-
if ( array_key_exists( 'skin', $data ) ) {
|
301 |
-
$skin = $data['skin'];
|
302 |
-
unset( $data['skin'] );
|
303 |
-
}
|
304 |
-
$data = $this->field_data( $data );
|
305 |
-
$type = '_' . $data['type'];
|
306 |
-
$name = sprintf( '%s-%s', $this->section_id, $data['name'] );
|
307 |
-
|
308 |
-
$data['extra_div']['id'] = sprintf( '%s--%s', $this->group_id, $data['name'] );
|
309 |
-
$data['show_field_desc'] = $show_field_desc;
|
310 |
-
$data['extra_div'] = TInvWL_Form::__atrtostr( $data['extra_div'] );
|
311 |
-
if ( array_key_exists( 'text', $data ) && $data['text'] ) {
|
312 |
-
if ( 0 === strlen( trim( $data['text'] ) ) ) {
|
313 |
-
if ( array_key_exists( 'class', (array) $data['extra_label'] ) ) {
|
314 |
-
$data['extra_label']['class'] .= ' tinvwl-empty';
|
315 |
-
} else {
|
316 |
-
if ( ! is_array( $data['extra_label'] ) ) {
|
317 |
-
$data['extra_label'] = array();
|
318 |
-
}
|
319 |
-
$data['extra_label']['class'] = 'tinvwl-empty';
|
320 |
-
}
|
321 |
-
}
|
322 |
-
$data['label'] = apply_filters( self::$
|
323 |
-
unset( $data['extra_label'] );
|
324 |
-
} else {
|
325 |
-
$data['label'] = '';
|
326 |
-
}
|
327 |
-
if ( is_array( $data['extra'] ) ) {
|
328 |
-
if ( array_key_exists( 'class', $data['extra'] ) ) {
|
329 |
-
$data['extra']['class'] .= ' form-control';
|
330 |
-
} else {
|
331 |
-
$data['extra']['class'] = 'form-control';
|
332 |
-
}
|
333 |
-
} else {
|
334 |
-
$data['extra'] .= 'class="form-control"';
|
335 |
-
}
|
336 |
-
$data['field'] = apply_filters( self::$
|
337 |
-
$data['std'] = apply_filters( self::$
|
338 |
-
$data['extra'] = apply_filters( self::$
|
339 |
-
if ( empty( $data['options'] ) ) {
|
340 |
-
$data['field'] .= TInvWL_Form::$type( $name, $data['std'], $data['extra'] );
|
341 |
-
} else {
|
342 |
-
$data['options'] = apply_filters( self::$
|
343 |
-
$data['field'] .= TInvWL_Form::$type( $name, $data['std'], $data['extra'], $data['options'] );
|
344 |
-
}
|
345 |
-
$data['field'] .= apply_filters( self::$
|
346 |
-
|
347 |
-
ob_start();
|
348 |
-
do_action( self::$
|
349 |
-
self::view( $skin, $data, '' );
|
350 |
-
do_action( self::$
|
351 |
-
return ob_get_clean();
|
352 |
-
}
|
353 |
-
|
354 |
-
/**
|
355 |
-
* Build fields
|
356 |
-
*
|
357 |
-
* @param array $fields Array fields.
|
358 |
-
* @param array $show_field_desc Show field descrioptions or field decriptions.
|
359 |
-
* @return string
|
360 |
-
*/
|
361 |
-
function fields( $fields, $show_field_desc = true ) {
|
362 |
-
$content = '';
|
363 |
-
foreach ( $fields as $data ) {
|
364 |
-
$content .= $this->field( $data, $show_field_desc );
|
365 |
-
}
|
366 |
-
return $content;
|
367 |
-
}
|
368 |
-
|
369 |
-
/**
|
370 |
-
* Run view section
|
371 |
-
*
|
372 |
-
* @param bollean $echo output or return sections.
|
373 |
-
* @return string
|
374 |
-
*/
|
375 |
-
function Run( $echo = true ) {
|
376 |
-
$content = apply_filters( self::$
|
377 |
-
foreach ( $this->data as $data ) {
|
378 |
-
$content .= $this->section( $data );
|
379 |
-
}
|
380 |
-
$content .= apply_filters( self::$
|
381 |
-
if ( $echo ) {
|
382 |
-
echo $content; // WPCS: xss ok.
|
383 |
-
} else {
|
384 |
-
return $content;
|
385 |
-
}
|
386 |
-
}
|
387 |
-
|
388 |
-
/**
|
389 |
-
* Load section and fields structure
|
390 |
-
*
|
391 |
-
* @param array $sections Array sections.
|
392 |
-
*/
|
393 |
-
function load_data( $sections ) {
|
394 |
-
$this->data = $sections;
|
395 |
-
}
|
396 |
-
|
397 |
-
/**
|
398 |
-
* Load value for section fields
|
399 |
-
*
|
400 |
-
* @param array $sections Array values sections fields.
|
401 |
-
*/
|
402 |
-
function load_value( $sections ) {
|
403 |
-
$this->value = $sections;
|
404 |
-
}
|
405 |
-
|
406 |
-
/**
|
407 |
-
* Basic attributes for validation form elements
|
408 |
-
*
|
409 |
-
* @link http://php.net/manual/ru/filter.filters.php Types of filters.
|
410 |
-
* @param string $type Field name.
|
411 |
-
* @return mixed
|
412 |
-
*/
|
413 |
-
function validation_type( $type ) {
|
414 |
-
// @link http://php.net/manual/ru/filter.filters.php
|
415 |
-
$types = array(
|
416 |
-
'button' => FILTER_DEFAULT,
|
417 |
-
'button_submit' => FILTER_DEFAULT,
|
418 |
-
'checkbox' => FILTER_SANITIZE_STRING,
|
419 |
-
'checkboxonoff' => FILTER_VALIDATE_BOOLEAN,
|
420 |
-
'color' => array(
|
421 |
-
'filter' => FILTER_VALIDATE_REGEXP,
|
422 |
-
'options' => array(
|
423 |
-
'regexp' => '/\#[0-9a-f]{6}/i',
|
424 |
-
'default' => '#FFFFFF',
|
425 |
-
),
|
426 |
-
),
|
427 |
-
'date' => FILTER_SANITIZE_STRING,
|
428 |
-
'dateperiod' => array(
|
429 |
-
'filter' => FILTER_SANITIZE_STRING,
|
430 |
-
'flags' => FILTER_FORCE_ARRAY,
|
431 |
-
),
|
432 |
-
'multicheckbox' => array(
|
433 |
-
'filter' => FILTER_SANITIZE_STRING,
|
434 |
-
'flags' => FILTER_FORCE_ARRAY,
|
435 |
-
),
|
436 |
-
'multiradio' => FILTER_SANITIZE_STRING,
|
437 |
-
'multiradiobox' => FILTER_SANITIZE_STRING,
|
438 |
-
'multiselect' => array(
|
439 |
-
'filter' => FILTER_SANITIZE_STRING,
|
440 |
-
'flags' => FILTER_FORCE_ARRAY,
|
441 |
-
),
|
442 |
-
'number' => FILTER_VALIDATE_INT,
|
443 |
-
'numberrange' => FILTER_VALIDATE_INT,
|
444 |
-
'radio' => FILTER_SANITIZE_STRING,
|
445 |
-
'select' => FILTER_SANITIZE_STRING,
|
446 |
-
'text' => FILTER_SANITIZE_STRING,
|
447 |
-
'textarea' => FILTER_DEFAULT,
|
448 |
-
'time' => FILTER_VALIDATE_INT,
|
449 |
-
'timeperiod' => array(
|
450 |
-
'filter' => FILTER_VALIDATE_INT,
|
451 |
-
'flags' => FILTER_FORCE_ARRAY,
|
452 |
-
),
|
453 |
-
'uploadfile' => FILTER_SANITIZE_STRING,
|
454 |
-
);
|
455 |
-
if ( array_key_exists( $type, $types ) ) {
|
456 |
-
return $types[ $type ];
|
457 |
-
}
|
458 |
-
return FILTER_DEFAULT;
|
459 |
-
}
|
460 |
-
|
461 |
-
/**
|
462 |
-
* Validation field
|
463 |
-
*
|
464 |
-
* @param mixed $value Value.
|
465 |
-
* @param array $field Object fields.
|
466 |
-
* @return mixed
|
467 |
-
*/
|
468 |
-
function validation( $value, $field ) {
|
469 |
-
$name = array_key_exists( 'name', $field ) ? $field['name'] : '';
|
470 |
-
$options = array_key_exists( 'options', $field ) ? $field['options'] : null;
|
471 |
-
$default = array_key_exists( 'std', $field ) ? $field['std'] : '';
|
472 |
-
$type = array_key_exists( 'type', $field ) ? $field['type'] : '';
|
473 |
-
$filter = array_key_exists( 'validate', $field ) ? $field['validate'] : $this->validation_type( $type );
|
474 |
-
$flags = array();
|
475 |
-
if ( is_array( $filter ) ) {
|
476 |
-
$flags = $filter;
|
477 |
-
$filter = $flags['filter'];
|
478 |
-
unset( $flags['filter'] );
|
479 |
-
}
|
480 |
-
$flags['default'] = $default;
|
481 |
-
|
482 |
-
$value = trim( $value );
|
483 |
-
$value = filter_var( $value, $filter, $flags );
|
484 |
-
if ( is_array( $options ) ) {
|
485 |
-
if ( is_string( $value ) || is_numeric( $value ) ) {
|
486 |
-
if ( ! array_key_exists( $value, (array) $options ) ) {
|
487 |
-
$value = $default;
|
488 |
-
}
|
489 |
-
} else {
|
490 |
-
$value = $default;
|
491 |
-
}
|
492 |
-
}
|
493 |
-
|
494 |
-
return $value;
|
495 |
-
}
|
496 |
-
|
497 |
-
/**
|
498 |
-
* Check post data and validation form fields
|
499 |
-
*
|
500 |
-
* @return array
|
501 |
-
*/
|
502 |
-
function post_form() {
|
503 |
-
$result = array();
|
504 |
-
foreach ( $this->data as $data ) {
|
505 |
-
if ( array_key_exists( 'noform', $data ) && $data['noform'] ) {
|
506 |
-
continue;
|
507 |
-
}
|
508 |
-
$id = array_key_exists( 'id', $data ) ? $data['id'] : '';
|
509 |
-
$fields = array();
|
510 |
-
if ( array_key_exists( 'fields', $data ) ) {
|
511 |
-
$fields = $data['fields'];
|
512 |
-
}
|
513 |
-
$field_counts = count( $fields );
|
514 |
-
$nonce = filter_input( INPUT_POST, $id . '_nonce' );
|
515 |
-
if ( $nonce && wp_verify_nonce( $nonce, self::$
|
516 |
-
$result_field = array();
|
517 |
-
foreach ( $fields as $field ) {
|
518 |
-
$name = array_key_exists( 'name', $field ) ? $field['name'] : '';
|
519 |
-
$postname = sprintf( '%s-%s', $id, $name );
|
520 |
-
$value = filter_input( INPUT_POST, $postname );
|
521 |
-
$value = $this->validation( $value, $field );
|
522 |
-
|
523 |
-
$result_field[ $name ] = $value;
|
524 |
-
}
|
525 |
-
if ( array_key_exists( '', $result_field ) ) {
|
526 |
-
unset( $result_field[''] );
|
527 |
-
}
|
528 |
-
if ( ! empty( $result_field ) ) {
|
529 |
-
$result[ $id ] = $result_field;
|
530 |
-
}
|
531 |
-
}
|
532 |
-
}
|
533 |
-
if ( empty( $result ) ) {
|
534 |
-
return null;
|
535 |
-
}
|
536 |
-
return $result;
|
537 |
-
}
|
538 |
-
|
539 |
-
/**
|
540 |
-
* Returned data field info for custom global template
|
541 |
-
*
|
542 |
-
* @param array $data Sections array.
|
543 |
-
* @return array
|
544 |
-
*/
|
545 |
-
function form_data( $data ) {
|
546 |
-
return $data;
|
547 |
-
}
|
548 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* View sction plugin class
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist\Helper
|
7 |
+
* @subpackage View
|
8 |
+
*/
|
9 |
+
|
10 |
+
// If this file is called directly, abort.
|
11 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
+
die;
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* View sction plugin class
|
17 |
+
*/
|
18 |
+
class TInvWL_ViewSection extends TInvWL_View {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Array form fields
|
22 |
+
*
|
23 |
+
* @var array
|
24 |
+
*/
|
25 |
+
private $data;
|
26 |
+
/**
|
27 |
+
* Array form value fields
|
28 |
+
*
|
29 |
+
* @var array
|
30 |
+
*/
|
31 |
+
private $value;
|
32 |
+
/**
|
33 |
+
* Helper show flag
|
34 |
+
*
|
35 |
+
* @var boolean
|
36 |
+
*/
|
37 |
+
private $helper;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Constructor
|
41 |
+
*
|
42 |
+
* @param string $plugin_name Plugin name.
|
43 |
+
* @param string $version Plugin version.
|
44 |
+
*/
|
45 |
+
function __construct( $plugin_name, $version ) {
|
46 |
+
self::$_name = $plugin_name;
|
47 |
+
self::$_version = $version;
|
48 |
+
$this->data = array();
|
49 |
+
$this->value = array();
|
50 |
+
$this->helper = false;
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Prepare section info
|
55 |
+
*
|
56 |
+
* @param array $content Array section info.
|
57 |
+
* @return array
|
58 |
+
*/
|
59 |
+
function section_data( $content ) {
|
60 |
+
$data = array();
|
61 |
+
if ( array_key_exists( 'fields', $content ) ) {
|
62 |
+
unset( $content['fields'] );
|
63 |
+
}
|
64 |
+
foreach ( array( 'id', 'title', 'desc', 'show_names' ) as $field ) {
|
65 |
+
if ( array_key_exists( $field, $content ) ) {
|
66 |
+
$data[ $field ] = $content[ $field ];
|
67 |
+
unset( $content[ $field ] );
|
68 |
+
} else {
|
69 |
+
$data[ $field ] = '';
|
70 |
+
}
|
71 |
+
}
|
72 |
+
$data['extra'] = $content;
|
73 |
+
$data['show_names'] = filter_var( $data['show_names'], FILTER_VALIDATE_BOOLEAN );
|
74 |
+
$data['show_helper'] = $this->helper;
|
75 |
+
return $data;
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Update section info for show helper block
|
80 |
+
*
|
81 |
+
* @param array $section Array section info.
|
82 |
+
*/
|
83 |
+
function section_helper( $section ) {
|
84 |
+
$this->helper = false;
|
85 |
+
if ( array_key_exists( 'desc', $section ) ) {
|
86 |
+
$this->helper = true;
|
87 |
+
}
|
88 |
+
if ( array_key_exists( 'fields', $section ) ) {
|
89 |
+
foreach ( $section['fields'] as $field ) {
|
90 |
+
if ( array_key_exists( 'desc', $field ) ) {
|
91 |
+
$this->helper = true;
|
92 |
+
}
|
93 |
+
}
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Create show section
|
99 |
+
*
|
100 |
+
* @param array $data Array section.
|
101 |
+
* @return string
|
102 |
+
*/
|
103 |
+
function section( $data ) {
|
104 |
+
$fields = array();
|
105 |
+
$this->section_helper( $data );
|
106 |
+
if ( array_key_exists( 'fields', $data ) ) {
|
107 |
+
$fields = $data['fields'];
|
108 |
+
}
|
109 |
+
$skin = 'section-general';
|
110 |
+
if ( array_key_exists( 'skin', $data ) ) {
|
111 |
+
$skin = $data['skin'];
|
112 |
+
unset( $data['skin'] );
|
113 |
+
}
|
114 |
+
$field_counts = count( $fields );
|
115 |
+
$data = $this->section_data( $data );
|
116 |
+
|
117 |
+
$data['extra']['id'] = $this->section_id = $data['id'];
|
118 |
+
if ( array_key_exists( 'class', $data['extra'] ) ) {
|
119 |
+
$data['extra']['class'] .= ' tinvwl-panel w-bg w-shadow';
|
120 |
+
} else {
|
121 |
+
$data['extra']['class'] = 'tinvwl-panel w-bg w-shadow';
|
122 |
+
}
|
123 |
+
if ( array_key_exists( $this->section_id, $this->value ) ) {
|
124 |
+
foreach ( $this->value[ $this->section_id ] as $key => $value ) {
|
125 |
+
TInvWL_Form::setvalue( sprintf( '%s-%s', $this->section_id, $key ), $value );
|
126 |
+
}
|
127 |
+
}
|
128 |
+
|
129 |
+
$data['groups'] = $this->groups( $fields );
|
130 |
+
|
131 |
+
$data['extra'] = TInvWL_Form::__atrtostr( $data['extra'] );
|
132 |
+
ob_start();
|
133 |
+
do_action( self::$_name . "_section_{$this->section_id}_before", $data );
|
134 |
+
self::view( $skin, $data, '' );
|
135 |
+
wp_nonce_field( self::$_name . "_check_{$this->section_id}_{$field_counts}", $this->section_id . '_nonce' );
|
136 |
+
do_action( self::$_name . "_section_{$this->section_id}_after", $data );
|
137 |
+
return ob_get_clean();
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Prepare group fields
|
142 |
+
*
|
143 |
+
* @param array $fields Array group fields.
|
144 |
+
* @return array
|
145 |
+
*/
|
146 |
+
function prepare_group( $fields ) {
|
147 |
+
$groups = array();
|
148 |
+
$group = array();
|
149 |
+
foreach ( $fields as $field ) {
|
150 |
+
switch ( $field['type'] ) {
|
151 |
+
case 'groupHTML':
|
152 |
+
if ( ! empty( $group ) ) {
|
153 |
+
$group['type'] = 'group';
|
154 |
+
$groups[] = $group;
|
155 |
+
}
|
156 |
+
$group = $field;
|
157 |
+
$group['type'] = 'groupHTML';
|
158 |
+
$groups[] = $group;
|
159 |
+
$group = array();
|
160 |
+
break;
|
161 |
+
case 'group':
|
162 |
+
if ( ! empty( $group ) ) {
|
163 |
+
$group['type'] = 'group';
|
164 |
+
$groups[] = $group;
|
165 |
+
}
|
166 |
+
$group = $field;
|
167 |
+
break;
|
168 |
+
case 'groupend':
|
169 |
+
$group['type'] = 'group';
|
170 |
+
$groups[] = $group;
|
171 |
+
$group = array();
|
172 |
+
break;
|
173 |
+
default:
|
174 |
+
$group['fields'][] = $field;
|
175 |
+
break;
|
176 |
+
}
|
177 |
+
}
|
178 |
+
if ( ! empty( $group ) ) {
|
179 |
+
$group['type'] = 'group';
|
180 |
+
$groups[] = $group;
|
181 |
+
}
|
182 |
+
return $groups;
|
183 |
+
}
|
184 |
+
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Create show group
|
188 |
+
*
|
189 |
+
* @param array $data Array group.
|
190 |
+
* @return string
|
191 |
+
*/
|
192 |
+
function group( $data ) {
|
193 |
+
$fields = array();
|
194 |
+
if ( array_key_exists( 'fields', $data ) ) {
|
195 |
+
$fields = $data['fields'];
|
196 |
+
}
|
197 |
+
$html = false;
|
198 |
+
$html_content = '';
|
199 |
+
if ( 'groupHTML' === $data['type'] ) {
|
200 |
+
$html = true;
|
201 |
+
$html_content = $data['html'];
|
202 |
+
unset( $data['html'] );
|
203 |
+
}
|
204 |
+
$skin = 'section-group';
|
205 |
+
if ( array_key_exists( 'skin', $data ) ) {
|
206 |
+
$skin = $data['skin'];
|
207 |
+
unset( $data['skin'] );
|
208 |
+
}
|
209 |
+
$data = $this->section_data( $data );
|
210 |
+
|
211 |
+
if ( empty( $data['id'] ) ) {
|
212 |
+
$this->group_id = $this->section_id;
|
213 |
+
} else {
|
214 |
+
$data['id'] = sprintf( '%s-%s', $this->section_id, $data['id'] );
|
215 |
+
|
216 |
+
$data['extra']['id'] = $this->group_id = $data['id'];
|
217 |
+
}
|
218 |
+
if ( array_key_exists( 'class', $data['extra'] ) ) {
|
219 |
+
$data['extra']['class'] .= ' content-in';
|
220 |
+
} else {
|
221 |
+
$data['extra']['class'] = 'content-in';
|
222 |
+
}
|
223 |
+
unset( $data['extra']['type'] );
|
224 |
+
if ( $html ) {
|
225 |
+
$data['fields_count'] = 1;
|
226 |
+
ob_start();
|
227 |
+
self::view( 'section-field-html', array(
|
228 |
+
'html' => $html_content,
|
229 |
+
'show_field_desc' => true,
|
230 |
+
'show_helper' => $this->helper,
|
231 |
+
'desc' => '',
|
232 |
+
'extra_div' => '',
|
233 |
+
), '' );
|
234 |
+
$data['fields'] = ob_get_clean();
|
235 |
+
} else {
|
236 |
+
$data['fields_count'] = count( $fields ) + 1;
|
237 |
+
$data['fields'] = $this->fields( $fields, empty( $data['desc'] ) );
|
238 |
+
}
|
239 |
+
$data['extra']['id'] = $data['id'];
|
240 |
+
|
241 |
+
$data['extra'] = TInvWL_Form::__atrtostr( $data['extra'] );
|
242 |
+
ob_start();
|
243 |
+
do_action( self::$_name . "_sectiongroup_{$this->group_id}_before", $data );
|
244 |
+
self::view( $skin, $data, '' );
|
245 |
+
do_action( self::$_name . "_sectiongroup_{$this->group_id}_after", $data );
|
246 |
+
return ob_get_clean();
|
247 |
+
}
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Build groups
|
251 |
+
*
|
252 |
+
* @param array $fields Array fields.
|
253 |
+
* @return string
|
254 |
+
*/
|
255 |
+
function groups( $fields ) {
|
256 |
+
$groups = $this->prepare_group( $fields );
|
257 |
+
$content = '';
|
258 |
+
foreach ( $groups as $data ) {
|
259 |
+
$content .= $this->group( $data );
|
260 |
+
}
|
261 |
+
return $content;
|
262 |
+
}
|
263 |
+
|
264 |
+
/**
|
265 |
+
* Prepare fields
|
266 |
+
*
|
267 |
+
* @param array $content Array fields info.
|
268 |
+
* @return array
|
269 |
+
*/
|
270 |
+
function field_data( $content ) {
|
271 |
+
$data = array();
|
272 |
+
if ( array_key_exists( 'fields', $content ) ) {
|
273 |
+
unset( $content['fields'] );
|
274 |
+
}
|
275 |
+
foreach ( array( 'type', 'name', 'text', 'std', 'desc', 'options', 'extra', 'extra_label', 'validate' ) as $field ) {
|
276 |
+
if ( array_key_exists( $field, $content ) ) {
|
277 |
+
$data[ $field ] = $content[ $field ];
|
278 |
+
unset( $content[ $field ] );
|
279 |
+
} else {
|
280 |
+
$data[ $field ] = '';
|
281 |
+
}
|
282 |
+
}
|
283 |
+
if ( empty( $data['extra'] ) ) {
|
284 |
+
$data['extra'] = array();
|
285 |
+
}
|
286 |
+
$data['extra_div'] = $content;
|
287 |
+
$data['show_helper'] = $this->helper;
|
288 |
+
return $data;
|
289 |
+
}
|
290 |
+
|
291 |
+
/**
|
292 |
+
* Create field
|
293 |
+
*
|
294 |
+
* @param array $data Array feild attributes.
|
295 |
+
* @param array $show_field_desc Show field descrioptions or field decriptions.
|
296 |
+
* @return string
|
297 |
+
*/
|
298 |
+
function field( $data, $show_field_desc = true ) {
|
299 |
+
$skin = 'section-field';
|
300 |
+
if ( array_key_exists( 'skin', $data ) ) {
|
301 |
+
$skin = $data['skin'];
|
302 |
+
unset( $data['skin'] );
|
303 |
+
}
|
304 |
+
$data = $this->field_data( $data );
|
305 |
+
$type = '_' . $data['type'];
|
306 |
+
$name = sprintf( '%s-%s', $this->section_id, $data['name'] );
|
307 |
+
|
308 |
+
$data['extra_div']['id'] = sprintf( '%s--%s', $this->group_id, $data['name'] );
|
309 |
+
$data['show_field_desc'] = $show_field_desc;
|
310 |
+
$data['extra_div'] = TInvWL_Form::__atrtostr( $data['extra_div'] );
|
311 |
+
if ( array_key_exists( 'text', $data ) && $data['text'] ) {
|
312 |
+
if ( 0 === strlen( trim( $data['text'] ) ) ) {
|
313 |
+
if ( array_key_exists( 'class', (array) $data['extra_label'] ) ) {
|
314 |
+
$data['extra_label']['class'] .= ' tinvwl-empty';
|
315 |
+
} else {
|
316 |
+
if ( ! is_array( $data['extra_label'] ) ) {
|
317 |
+
$data['extra_label'] = array();
|
318 |
+
}
|
319 |
+
$data['extra_label']['class'] = 'tinvwl-empty';
|
320 |
+
}
|
321 |
+
}
|
322 |
+
$data['label'] = apply_filters( self::$_name . "_labelfor_{$name}", ($data['text']) ? TInvWL_Form::_label( $name, esc_html( $data['text'] ), $data['extra_label'] ) : '' );
|
323 |
+
unset( $data['extra_label'] );
|
324 |
+
} else {
|
325 |
+
$data['label'] = '';
|
326 |
+
}
|
327 |
+
if ( is_array( $data['extra'] ) ) {
|
328 |
+
if ( array_key_exists( 'class', $data['extra'] ) ) {
|
329 |
+
$data['extra']['class'] .= ' form-control';
|
330 |
+
} else {
|
331 |
+
$data['extra']['class'] = 'form-control';
|
332 |
+
}
|
333 |
+
} else {
|
334 |
+
$data['extra'] .= 'class="form-control"';
|
335 |
+
}
|
336 |
+
$data['field'] = apply_filters( self::$_name . "_field_{$name}_before", '' );
|
337 |
+
$data['std'] = apply_filters( self::$_name . "_field_{$name}_defaultvalue", $data['std'] );
|
338 |
+
$data['extra'] = apply_filters( self::$_name . "_field_{$name}_extra", $data['extra'] );
|
339 |
+
if ( empty( $data['options'] ) ) {
|
340 |
+
$data['field'] .= TInvWL_Form::$type( $name, $data['std'], $data['extra'] );
|
341 |
+
} else {
|
342 |
+
$data['options'] = apply_filters( self::$_name . "_field_{$name}_options", $data['options'] );
|
343 |
+
$data['field'] .= TInvWL_Form::$type( $name, $data['std'], $data['extra'], $data['options'] );
|
344 |
+
}
|
345 |
+
$data['field'] .= apply_filters( self::$_name . "_field_{$name}_after", '' );
|
346 |
+
|
347 |
+
ob_start();
|
348 |
+
do_action( self::$_name . "_sectionfield_{$name}_before", $data );
|
349 |
+
self::view( $skin, $data, '' );
|
350 |
+
do_action( self::$_name . "_sectionfield_{$name}_after", $data );
|
351 |
+
return ob_get_clean();
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* Build fields
|
356 |
+
*
|
357 |
+
* @param array $fields Array fields.
|
358 |
+
* @param array $show_field_desc Show field descrioptions or field decriptions.
|
359 |
+
* @return string
|
360 |
+
*/
|
361 |
+
function fields( $fields, $show_field_desc = true ) {
|
362 |
+
$content = '';
|
363 |
+
foreach ( $fields as $data ) {
|
364 |
+
$content .= $this->field( $data, $show_field_desc );
|
365 |
+
}
|
366 |
+
return $content;
|
367 |
+
}
|
368 |
+
|
369 |
+
/**
|
370 |
+
* Run view section
|
371 |
+
*
|
372 |
+
* @param bollean $echo output or return sections.
|
373 |
+
* @return string
|
374 |
+
*/
|
375 |
+
function Run( $echo = true ) {
|
376 |
+
$content = apply_filters( self::$_name . '_section_before', '' );
|
377 |
+
foreach ( $this->data as $data ) {
|
378 |
+
$content .= $this->section( $data );
|
379 |
+
}
|
380 |
+
$content .= apply_filters( self::$_name . '_section_after', '' );
|
381 |
+
if ( $echo ) {
|
382 |
+
echo $content; // WPCS: xss ok.
|
383 |
+
} else {
|
384 |
+
return $content;
|
385 |
+
}
|
386 |
+
}
|
387 |
+
|
388 |
+
/**
|
389 |
+
* Load section and fields structure
|
390 |
+
*
|
391 |
+
* @param array $sections Array sections.
|
392 |
+
*/
|
393 |
+
function load_data( $sections ) {
|
394 |
+
$this->data = $sections;
|
395 |
+
}
|
396 |
+
|
397 |
+
/**
|
398 |
+
* Load value for section fields
|
399 |
+
*
|
400 |
+
* @param array $sections Array values sections fields.
|
401 |
+
*/
|
402 |
+
function load_value( $sections ) {
|
403 |
+
$this->value = $sections;
|
404 |
+
}
|
405 |
+
|
406 |
+
/**
|
407 |
+
* Basic attributes for validation form elements
|
408 |
+
*
|
409 |
+
* @link http://php.net/manual/ru/filter.filters.php Types of filters.
|
410 |
+
* @param string $type Field name.
|
411 |
+
* @return mixed
|
412 |
+
*/
|
413 |
+
function validation_type( $type ) {
|
414 |
+
// @link http://php.net/manual/ru/filter.filters.php
|
415 |
+
$types = array(
|
416 |
+
'button' => FILTER_DEFAULT,
|
417 |
+
'button_submit' => FILTER_DEFAULT,
|
418 |
+
'checkbox' => FILTER_SANITIZE_STRING,
|
419 |
+
'checkboxonoff' => FILTER_VALIDATE_BOOLEAN,
|
420 |
+
'color' => array(
|
421 |
+
'filter' => FILTER_VALIDATE_REGEXP,
|
422 |
+
'options' => array(
|
423 |
+
'regexp' => '/\#[0-9a-f]{6}/i',
|
424 |
+
'default' => '#FFFFFF',
|
425 |
+
),
|
426 |
+
),
|
427 |
+
'date' => FILTER_SANITIZE_STRING,
|
428 |
+
'dateperiod' => array(
|
429 |
+
'filter' => FILTER_SANITIZE_STRING,
|
430 |
+
'flags' => FILTER_FORCE_ARRAY,
|
431 |
+
),
|
432 |
+
'multicheckbox' => array(
|
433 |
+
'filter' => FILTER_SANITIZE_STRING,
|
434 |
+
'flags' => FILTER_FORCE_ARRAY,
|
435 |
+
),
|
436 |
+
'multiradio' => FILTER_SANITIZE_STRING,
|
437 |
+
'multiradiobox' => FILTER_SANITIZE_STRING,
|
438 |
+
'multiselect' => array(
|
439 |
+
'filter' => FILTER_SANITIZE_STRING,
|
440 |
+
'flags' => FILTER_FORCE_ARRAY,
|
441 |
+
),
|
442 |
+
'number' => FILTER_VALIDATE_INT,
|
443 |
+
'numberrange' => FILTER_VALIDATE_INT,
|
444 |
+
'radio' => FILTER_SANITIZE_STRING,
|
445 |
+
'select' => FILTER_SANITIZE_STRING,
|
446 |
+
'text' => FILTER_SANITIZE_STRING,
|
447 |
+
'textarea' => FILTER_DEFAULT,
|
448 |
+
'time' => FILTER_VALIDATE_INT,
|
449 |
+
'timeperiod' => array(
|
450 |
+
'filter' => FILTER_VALIDATE_INT,
|
451 |
+
'flags' => FILTER_FORCE_ARRAY,
|
452 |
+
),
|
453 |
+
'uploadfile' => FILTER_SANITIZE_STRING,
|
454 |
+
);
|
455 |
+
if ( array_key_exists( $type, $types ) ) {
|
456 |
+
return $types[ $type ];
|
457 |
+
}
|
458 |
+
return FILTER_DEFAULT;
|
459 |
+
}
|
460 |
+
|
461 |
+
/**
|
462 |
+
* Validation field
|
463 |
+
*
|
464 |
+
* @param mixed $value Value.
|
465 |
+
* @param array $field Object fields.
|
466 |
+
* @return mixed
|
467 |
+
*/
|
468 |
+
function validation( $value, $field ) {
|
469 |
+
$name = array_key_exists( 'name', $field ) ? $field['name'] : '';
|
470 |
+
$options = array_key_exists( 'options', $field ) ? $field['options'] : null;
|
471 |
+
$default = array_key_exists( 'std', $field ) ? $field['std'] : '';
|
472 |
+
$type = array_key_exists( 'type', $field ) ? $field['type'] : '';
|
473 |
+
$filter = array_key_exists( 'validate', $field ) ? $field['validate'] : $this->validation_type( $type );
|
474 |
+
$flags = array();
|
475 |
+
if ( is_array( $filter ) ) {
|
476 |
+
$flags = $filter;
|
477 |
+
$filter = $flags['filter'];
|
478 |
+
unset( $flags['filter'] );
|
479 |
+
}
|
480 |
+
$flags['default'] = $default;
|
481 |
+
|
482 |
+
$value = trim( $value );
|
483 |
+
$value = filter_var( $value, $filter, $flags );
|
484 |
+
if ( is_array( $options ) ) {
|
485 |
+
if ( is_string( $value ) || is_numeric( $value ) ) {
|
486 |
+
if ( ! array_key_exists( $value, (array) $options ) ) {
|
487 |
+
$value = $default;
|
488 |
+
}
|
489 |
+
} else {
|
490 |
+
$value = $default;
|
491 |
+
}
|
492 |
+
}
|
493 |
+
|
494 |
+
return $value;
|
495 |
+
}
|
496 |
+
|
497 |
+
/**
|
498 |
+
* Check post data and validation form fields
|
499 |
+
*
|
500 |
+
* @return array
|
501 |
+
*/
|
502 |
+
function post_form() {
|
503 |
+
$result = array();
|
504 |
+
foreach ( $this->data as $data ) {
|
505 |
+
if ( array_key_exists( 'noform', $data ) && $data['noform'] ) {
|
506 |
+
continue;
|
507 |
+
}
|
508 |
+
$id = array_key_exists( 'id', $data ) ? $data['id'] : '';
|
509 |
+
$fields = array();
|
510 |
+
if ( array_key_exists( 'fields', $data ) ) {
|
511 |
+
$fields = $data['fields'];
|
512 |
+
}
|
513 |
+
$field_counts = count( $fields );
|
514 |
+
$nonce = filter_input( INPUT_POST, $id . '_nonce' );
|
515 |
+
if ( $nonce && wp_verify_nonce( $nonce, self::$_name . "_check_{$id}_{$field_counts}" ) ) {
|
516 |
+
$result_field = array();
|
517 |
+
foreach ( $fields as $field ) {
|
518 |
+
$name = array_key_exists( 'name', $field ) ? $field['name'] : '';
|
519 |
+
$postname = sprintf( '%s-%s', $id, $name );
|
520 |
+
$value = filter_input( INPUT_POST, $postname );
|
521 |
+
$value = $this->validation( $value, $field );
|
522 |
+
|
523 |
+
$result_field[ $name ] = $value;
|
524 |
+
}
|
525 |
+
if ( array_key_exists( '', $result_field ) ) {
|
526 |
+
unset( $result_field[''] );
|
527 |
+
}
|
528 |
+
if ( ! empty( $result_field ) ) {
|
529 |
+
$result[ $id ] = $result_field;
|
530 |
+
}
|
531 |
+
}
|
532 |
+
}
|
533 |
+
if ( empty( $result ) ) {
|
534 |
+
return null;
|
535 |
+
}
|
536 |
+
return $result;
|
537 |
+
}
|
538 |
+
|
539 |
+
/**
|
540 |
+
* Returned data field info for custom global template
|
541 |
+
*
|
542 |
+
* @param array $data Sections array.
|
543 |
+
* @return array
|
544 |
+
*/
|
545 |
+
function form_data( $data ) {
|
546 |
+
return $data;
|
547 |
+
}
|
548 |
+
}
|
includes/wishlist.class.php
CHANGED
@@ -27,7 +27,7 @@ class TInvWL_Wishlist {
|
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
-
private $
|
31 |
/**
|
32 |
* User id
|
33 |
*
|
@@ -69,8 +69,8 @@ class TInvWL_Wishlist {
|
|
69 |
function __construct( $plugin_name = TINVWL_PREFIX ) {
|
70 |
global $wpdb;
|
71 |
|
72 |
-
$this->
|
73 |
-
$this->table = sprintf( '%s%s_%s', $wpdb->prefix, $this->
|
74 |
$this->default_name = apply_filters( 'tinvwl-general-default_title', tinv_get_option( 'general', 'default_title' ) );
|
75 |
$this->default_privacy = 'share';
|
76 |
$this->privacy = array( 'public', 'share', 'private' );
|
27 |
*
|
28 |
* @var string
|
29 |
*/
|
30 |
+
private $_name;
|
31 |
/**
|
32 |
* User id
|
33 |
*
|
69 |
function __construct( $plugin_name = TINVWL_PREFIX ) {
|
70 |
global $wpdb;
|
71 |
|
72 |
+
$this->_name = $plugin_name;
|
73 |
+
$this->table = sprintf( '%s%s_%s', $wpdb->prefix, $this->_name, 'lists' );
|
74 |
$this->default_name = apply_filters( 'tinvwl-general-default_title', tinv_get_option( 'general', 'default_title' ) );
|
75 |
$this->default_privacy = 'share';
|
76 |
$this->privacy = array( 'public', 'share', 'private' );
|
includes/wizard.class.php
CHANGED
@@ -21,14 +21,14 @@ class TInvWL_Wizard {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
public $
|
25 |
|
26 |
/**
|
27 |
* Plugin version
|
28 |
*
|
29 |
* @var string
|
30 |
*/
|
31 |
-
public $
|
32 |
|
33 |
/**
|
34 |
* Constructor
|
@@ -37,12 +37,12 @@ class TInvWL_Wizard {
|
|
37 |
* @param string $version Plugin version.
|
38 |
*/
|
39 |
function __construct( $plugin_name, $version ) {
|
40 |
-
$this->
|
41 |
-
$this->
|
42 |
-
if ( apply_filters( $this->
|
43 |
$this->define_hooks();
|
44 |
}
|
45 |
-
update_option( $this->
|
46 |
}
|
47 |
|
48 |
/**
|
@@ -110,7 +110,7 @@ class TInvWL_Wizard {
|
|
110 |
}
|
111 |
if ( method_exists( $this, $method ) ) {
|
112 |
$nonce = filter_input( 0, '_wpnonce' );
|
113 |
-
if ( $nonce && wp_verify_nonce( $nonce, sprintf( '%s-setup-%s', $this->
|
114 |
$this->$method();
|
115 |
}
|
116 |
}
|
@@ -173,19 +173,19 @@ class TInvWL_Wizard {
|
|
173 |
*/
|
174 |
function enqueue_styles() {
|
175 |
wp_enqueue_style( 'gfonts', ( is_ssl() ? 'https' : 'http' ) . '://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800', '', null, 'all' );
|
176 |
-
wp_enqueue_style( $this->
|
177 |
-
wp_enqueue_style( $this->
|
178 |
-
wp_enqueue_style( $this->
|
179 |
'dashicons',
|
180 |
'install'
|
181 |
-
), $this->
|
182 |
}
|
183 |
|
184 |
/**
|
185 |
* Load javascript
|
186 |
*/
|
187 |
function enqueue_scripts() {
|
188 |
-
wp_enqueue_script( $this->
|
189 |
}
|
190 |
|
191 |
/**
|
@@ -193,14 +193,14 @@ class TInvWL_Wizard {
|
|
193 |
*/
|
194 |
function load_content() {
|
195 |
?>
|
196 |
-
<div class="<?php echo esc_attr( sprintf( '%s-content', $this->
|
197 |
<form method="POST" action="<?php echo esc_url( admin_url( $this->next_page() ) ) ?>">
|
198 |
<?php
|
199 |
$method = $this->method;
|
200 |
if ( method_exists( $this, $method ) ) {
|
201 |
$this->$method();
|
202 |
}
|
203 |
-
wp_nonce_field( sprintf( '%s-setup-%s', $this->
|
204 |
?>
|
205 |
</form>
|
206 |
</div>
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
public $_name;
|
25 |
|
26 |
/**
|
27 |
* Plugin version
|
28 |
*
|
29 |
* @var string
|
30 |
*/
|
31 |
+
public $_version;
|
32 |
|
33 |
/**
|
34 |
* Constructor
|
37 |
* @param string $version Plugin version.
|
38 |
*/
|
39 |
function __construct( $plugin_name, $version ) {
|
40 |
+
$this->_name = $plugin_name;
|
41 |
+
$this->_version = $version;
|
42 |
+
if ( apply_filters( $this->_name . '_enable_wizard', true ) ) {
|
43 |
$this->define_hooks();
|
44 |
}
|
45 |
+
update_option( $this->_name . '_wizard', true );
|
46 |
}
|
47 |
|
48 |
/**
|
110 |
}
|
111 |
if ( method_exists( $this, $method ) ) {
|
112 |
$nonce = filter_input( 0, '_wpnonce' );
|
113 |
+
if ( $nonce && wp_verify_nonce( $nonce, sprintf( '%s-setup-%s', $this->_name, $url_attr['step'] ) ) ) {
|
114 |
$this->$method();
|
115 |
}
|
116 |
}
|
173 |
*/
|
174 |
function enqueue_styles() {
|
175 |
wp_enqueue_style( 'gfonts', ( is_ssl() ? 'https' : 'http' ) . '://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800', '', null, 'all' );
|
176 |
+
wp_enqueue_style( $this->_name, TINVWL_URL . 'assets/css/admin.css', array(), $this->_version, 'all' );
|
177 |
+
wp_enqueue_style( $this->_name . '-form', TINVWL_URL . 'assets/css/admin-form.css', array(), $this->_version, 'all' );
|
178 |
+
wp_enqueue_style( $this->_name . '-setup', TINVWL_URL . 'assets/css/admin-setup.css', array(
|
179 |
'dashicons',
|
180 |
'install'
|
181 |
+
), $this->_version, 'all' );
|
182 |
}
|
183 |
|
184 |
/**
|
185 |
* Load javascript
|
186 |
*/
|
187 |
function enqueue_scripts() {
|
188 |
+
wp_enqueue_script( $this->_name, TINVWL_URL . 'assets/js/admin.js', array( 'jquery' ), $this->_version, 'all' );
|
189 |
}
|
190 |
|
191 |
/**
|
193 |
*/
|
194 |
function load_content() {
|
195 |
?>
|
196 |
+
<div class="<?php echo esc_attr( sprintf( '%s-content', $this->_name ) ); ?>">
|
197 |
<form method="POST" action="<?php echo esc_url( admin_url( $this->next_page() ) ) ?>">
|
198 |
<?php
|
199 |
$method = $this->method;
|
200 |
if ( method_exists( $this, $method ) ) {
|
201 |
$this->$method();
|
202 |
}
|
203 |
+
wp_nonce_field( sprintf( '%s-setup-%s', $this->_name, $this->page ) );
|
204 |
?>
|
205 |
</form>
|
206 |
</div>
|
includes/wizardsetup.helper.php
CHANGED
@@ -1,86 +1,86 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Wizard installation plugin helper
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Wizard installation plugin helper
|
16 |
-
*/
|
17 |
-
class TInvWL_WizardSetup {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Plugin name
|
21 |
-
*
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
public $
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Plugin version
|
28 |
-
*
|
29 |
-
* @var string
|
30 |
-
*/
|
31 |
-
public $
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Constructor
|
35 |
-
*
|
36 |
-
* @param string $plugin_name Plugin name.
|
37 |
-
* @param string $version Plugin version.
|
38 |
-
*/
|
39 |
-
function __construct( $plugin_name, $version ) {
|
40 |
-
$this->
|
41 |
-
$this->
|
42 |
-
add_action( 'init', array( $this, 'load' ) );
|
43 |
-
add_action( 'admin_init', array( $this, 'redirect' ) );
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Setup trigger for show wizard installation
|
48 |
-
*/
|
49 |
-
public static function setup() {
|
50 |
-
set_transient( '_tinvwl_activation_redirect', 1, 30 );
|
51 |
-
}
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Load wizard
|
55 |
-
*/
|
56 |
-
public function load() {
|
57 |
-
$page = filter_input( INPUT_GET, 'page' );
|
58 |
-
if ( ! empty( $page ) ) {
|
59 |
-
switch ( $page ) {
|
60 |
-
case 'tinvwl-wizard' :
|
61 |
-
new TInvWL_Wizard( $this->
|
62 |
-
}
|
63 |
-
}
|
64 |
-
}
|
65 |
-
|
66 |
-
/**
|
67 |
-
* Apply redirect to wizard
|
68 |
-
*
|
69 |
-
* @return void
|
70 |
-
*/
|
71 |
-
public function redirect() {
|
72 |
-
if ( ! get_transient( '_tinvwl_activation_redirect' ) ) {
|
73 |
-
return;
|
74 |
-
}
|
75 |
-
delete_transient( '_tinvwl_activation_redirect' );
|
76 |
-
|
77 |
-
$page = filter_input( INPUT_GET, 'page' );
|
78 |
-
$activate = filter_input( INPUT_GET, 'activate-multi' );
|
79 |
-
if ( in_array( $page, array( 'tinvwl-wizard' ) ) || is_network_admin() || ! is_null( $activate ) || apply_filters( 'tinvwl_prevent_automatic_wizard_redirect', false ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
80 |
-
return;
|
81 |
-
}
|
82 |
-
|
83 |
-
wp_safe_redirect( admin_url( 'index.php?page=tinvwl-wizard' ) );
|
84 |
-
exit;
|
85 |
-
}
|
86 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Wizard installation plugin helper
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Wizard installation plugin helper
|
16 |
+
*/
|
17 |
+
class TInvWL_WizardSetup {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Plugin name
|
21 |
+
*
|
22 |
+
* @var string
|
23 |
+
*/
|
24 |
+
public $_name;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Plugin version
|
28 |
+
*
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
public $_version;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Constructor
|
35 |
+
*
|
36 |
+
* @param string $plugin_name Plugin name.
|
37 |
+
* @param string $version Plugin version.
|
38 |
+
*/
|
39 |
+
function __construct( $plugin_name, $version ) {
|
40 |
+
$this->_name = $plugin_name;
|
41 |
+
$this->_version = $version;
|
42 |
+
add_action( 'init', array( $this, 'load' ) );
|
43 |
+
add_action( 'admin_init', array( $this, 'redirect' ) );
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Setup trigger for show wizard installation
|
48 |
+
*/
|
49 |
+
public static function setup() {
|
50 |
+
set_transient( '_tinvwl_activation_redirect', 1, 30 );
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Load wizard
|
55 |
+
*/
|
56 |
+
public function load() {
|
57 |
+
$page = filter_input( INPUT_GET, 'page' );
|
58 |
+
if ( ! empty( $page ) ) {
|
59 |
+
switch ( $page ) {
|
60 |
+
case 'tinvwl-wizard' :
|
61 |
+
new TInvWL_Wizard( $this->_name, $this->_version );
|
62 |
+
}
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Apply redirect to wizard
|
68 |
+
*
|
69 |
+
* @return void
|
70 |
+
*/
|
71 |
+
public function redirect() {
|
72 |
+
if ( ! get_transient( '_tinvwl_activation_redirect' ) ) {
|
73 |
+
return;
|
74 |
+
}
|
75 |
+
delete_transient( '_tinvwl_activation_redirect' );
|
76 |
+
|
77 |
+
$page = filter_input( INPUT_GET, 'page' );
|
78 |
+
$activate = filter_input( INPUT_GET, 'activate-multi' );
|
79 |
+
if ( in_array( $page, array( 'tinvwl-wizard' ) ) || is_network_admin() || ! is_null( $activate ) || apply_filters( 'tinvwl_prevent_automatic_wizard_redirect', false ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
80 |
+
return;
|
81 |
+
}
|
82 |
+
|
83 |
+
wp_safe_redirect( admin_url( 'index.php?page=tinvwl-wizard' ) );
|
84 |
+
exit;
|
85 |
+
}
|
86 |
+
}
|
languages/ti-woocommerce-wishlist.pot
CHANGED
@@ -2,17 +2,17 @@
|
|
2 |
# This file is distributed under the GPL-2.0+.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version: WooCommerce Wishlist Plugin 1.8.
|
6 |
"Report-Msgid-Bugs-To: "
|
7 |
"https://wordpress.org/support/plugin/ti-woocommerce-wishlist\n"
|
8 |
-
"POT-Creation-Date: 2018-
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=utf-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
12 |
"PO-Revision-Date: 2018-MO-DA HO:MI+ZONE\n"
|
13 |
"Last-Translator: TemplateInvaders\n"
|
14 |
"Language-Team: TemplateInvaders\n"
|
15 |
-
"X-Generator: grunt-wp-
|
16 |
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
17 |
"X-Poedit-Basepath: ..\n"
|
18 |
"X-Poedit-Language: English\n"
|
@@ -690,7 +690,7 @@ msgstr ""
|
|
690 |
msgid "Normal Buttons Text Hover Color"
|
691 |
msgstr ""
|
692 |
|
693 |
-
#: admin/settings/upgrade.class.php:34 admin/tinvwl.class.php:
|
694 |
#: views/wizard/finish.php:31
|
695 |
msgid "Upgrade to Premium"
|
696 |
msgstr ""
|
@@ -719,7 +719,7 @@ msgid ""
|
|
719 |
"ready to start :)"
|
720 |
msgstr ""
|
721 |
|
722 |
-
#: admin/tinvwl.class.php:95 admin/tinvwl.class.php:
|
723 |
msgid "Run the Setup Wizard"
|
724 |
msgstr ""
|
725 |
|
@@ -727,33 +727,51 @@ msgstr ""
|
|
727 |
msgid "Skip Setup"
|
728 |
msgstr ""
|
729 |
|
730 |
-
#: admin/tinvwl.class.php:105 includes/notice.helper.php:
|
731 |
msgid "Dismiss"
|
732 |
msgstr ""
|
733 |
|
734 |
#: admin/tinvwl.class.php:106
|
735 |
-
msgid "
|
|
|
|
|
|
|
|
|
736 |
msgstr ""
|
737 |
|
738 |
#: admin/tinvwl.class.php:108
|
739 |
-
msgid "
|
|
|
|
|
740 |
msgstr ""
|
741 |
|
742 |
#: admin/tinvwl.class.php:109
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
743 |
msgid " or "
|
744 |
msgstr ""
|
745 |
|
746 |
-
#: admin/tinvwl.class.php:
|
747 |
msgid "Are you sure you want to reset the settings?"
|
748 |
msgstr ""
|
749 |
|
750 |
-
#: admin/tinvwl.class.php:
|
751 |
msgid ""
|
752 |
"<code>%1$s</code> version <strong style=\"color:red\">%2$s</strong> is out "
|
753 |
"of date. The core version is <strong style=\"color:red\">%3$s</strong>"
|
754 |
msgstr ""
|
755 |
|
756 |
-
#: admin/tinvwl.class.php:
|
757 |
msgid ""
|
758 |
"<strong>Your theme (%1$s) contains outdated copies of some WooCommerce "
|
759 |
"Wishlist Plugin template files.</strong><br> These files may need updating "
|
@@ -963,7 +981,7 @@ msgstr ""
|
|
963 |
msgid "Remove"
|
964 |
msgstr ""
|
965 |
|
966 |
-
#: public/wishlist/buttons.class.php:437 public/wishlist/view.class.php:
|
967 |
msgid "“%s”"
|
968 |
msgstr ""
|
969 |
|
@@ -973,23 +991,23 @@ msgid_plural "%s have been successfully removed from wishlist."
|
|
973 |
msgstr[0] ""
|
974 |
msgstr[1] ""
|
975 |
|
976 |
-
#: public/wishlist/view.class.php:
|
977 |
msgid "%s has been removed from wishlist."
|
978 |
msgstr ""
|
979 |
|
980 |
-
#: public/wishlist/view.class.php:
|
981 |
msgid "%s has not been removed from wishlist."
|
982 |
msgstr ""
|
983 |
|
984 |
-
#: public/wishlist/view.class.php:
|
985 |
msgid "Return to Wishlist"
|
986 |
msgstr ""
|
987 |
|
988 |
-
#: public/wishlist/view.class.php:
|
989 |
msgid "Previous Page"
|
990 |
msgstr ""
|
991 |
|
992 |
-
#: public/wishlist/view.class.php:
|
993 |
msgid "Next Page"
|
994 |
msgstr ""
|
995 |
|
2 |
# This file is distributed under the GPL-2.0+.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: WooCommerce Wishlist Plugin 1.8.4\n"
|
6 |
"Report-Msgid-Bugs-To: "
|
7 |
"https://wordpress.org/support/plugin/ti-woocommerce-wishlist\n"
|
8 |
+
"POT-Creation-Date: 2018-07-10 17:32:44+00:00\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=utf-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
12 |
"PO-Revision-Date: 2018-MO-DA HO:MI+ZONE\n"
|
13 |
"Last-Translator: TemplateInvaders\n"
|
14 |
"Language-Team: TemplateInvaders\n"
|
15 |
+
"X-Generator: grunt-wp-i18n1.0.2\n"
|
16 |
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
17 |
"X-Poedit-Basepath: ..\n"
|
18 |
"X-Poedit-Language: English\n"
|
690 |
msgid "Normal Buttons Text Hover Color"
|
691 |
msgstr ""
|
692 |
|
693 |
+
#: admin/settings/upgrade.class.php:34 admin/tinvwl.class.php:213
|
694 |
#: views/wizard/finish.php:31
|
695 |
msgid "Upgrade to Premium"
|
696 |
msgstr ""
|
719 |
"ready to start :)"
|
720 |
msgstr ""
|
721 |
|
722 |
+
#: admin/tinvwl.class.php:95 admin/tinvwl.class.php:115
|
723 |
msgid "Run the Setup Wizard"
|
724 |
msgstr ""
|
725 |
|
727 |
msgid "Skip Setup"
|
728 |
msgstr ""
|
729 |
|
730 |
+
#: admin/tinvwl.class.php:105 includes/notice.helper.php:115
|
731 |
msgid "Dismiss"
|
732 |
msgstr ""
|
733 |
|
734 |
#: admin/tinvwl.class.php:106
|
735 |
+
msgid "WooCommerce Wishlist Plugin is misconfigured!"
|
736 |
+
msgstr ""
|
737 |
+
|
738 |
+
#: admin/tinvwl.class.php:107
|
739 |
+
msgid "Since the Setup Wizard was skipped, the Wishlist may function improperly."
|
740 |
msgstr ""
|
741 |
|
742 |
#: admin/tinvwl.class.php:108
|
743 |
+
msgid ""
|
744 |
+
"Create a New Page or open to edit a page where the Wishlist should be "
|
745 |
+
"displayed."
|
746 |
msgstr ""
|
747 |
|
748 |
#: admin/tinvwl.class.php:109
|
749 |
+
msgid "Add <code>[ti_wishlistsview]</code> shortcode into a page content."
|
750 |
+
msgstr ""
|
751 |
+
|
752 |
+
#: admin/tinvwl.class.php:110
|
753 |
+
msgid "In a plugin General Settings section apply this page as a \"Wishlist\" page."
|
754 |
+
msgstr ""
|
755 |
+
|
756 |
+
#: admin/tinvwl.class.php:112
|
757 |
+
msgid "Please apply the Wishlist page"
|
758 |
+
msgstr ""
|
759 |
+
|
760 |
+
#: admin/tinvwl.class.php:113
|
761 |
msgid " or "
|
762 |
msgstr ""
|
763 |
|
764 |
+
#: admin/tinvwl.class.php:175
|
765 |
msgid "Are you sure you want to reset the settings?"
|
766 |
msgstr ""
|
767 |
|
768 |
+
#: admin/tinvwl.class.php:252
|
769 |
msgid ""
|
770 |
"<code>%1$s</code> version <strong style=\"color:red\">%2$s</strong> is out "
|
771 |
"of date. The core version is <strong style=\"color:red\">%3$s</strong>"
|
772 |
msgstr ""
|
773 |
|
774 |
+
#: admin/tinvwl.class.php:278
|
775 |
msgid ""
|
776 |
"<strong>Your theme (%1$s) contains outdated copies of some WooCommerce "
|
777 |
"Wishlist Plugin template files.</strong><br> These files may need updating "
|
981 |
msgid "Remove"
|
982 |
msgstr ""
|
983 |
|
984 |
+
#: public/wishlist/buttons.class.php:437 public/wishlist/view.class.php:295
|
985 |
msgid "“%s”"
|
986 |
msgstr ""
|
987 |
|
991 |
msgstr[0] ""
|
992 |
msgstr[1] ""
|
993 |
|
994 |
+
#: public/wishlist/view.class.php:297
|
995 |
msgid "%s has been removed from wishlist."
|
996 |
msgstr ""
|
997 |
|
998 |
+
#: public/wishlist/view.class.php:299
|
999 |
msgid "%s has not been removed from wishlist."
|
1000 |
msgstr ""
|
1001 |
|
1002 |
+
#: public/wishlist/view.class.php:390
|
1003 |
msgid "Return to Wishlist"
|
1004 |
msgstr ""
|
1005 |
|
1006 |
+
#: public/wishlist/view.class.php:485
|
1007 |
msgid "Previous Page"
|
1008 |
msgstr ""
|
1009 |
|
1010 |
+
#: public/wishlist/view.class.php:494
|
1011 |
msgid "Next Page"
|
1012 |
msgstr ""
|
1013 |
|
public/addtowishlist.class.php
CHANGED
@@ -21,7 +21,7 @@ class TInvWL_Public_AddToWishlist {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
private $
|
25 |
|
26 |
/**
|
27 |
* Global product
|
@@ -78,7 +78,7 @@ class TInvWL_Public_AddToWishlist {
|
|
78 |
* @param string $plugin_name Plugin name.
|
79 |
*/
|
80 |
function __construct( $plugin_name ) {
|
81 |
-
$this->
|
82 |
$this->is_loop = false;
|
83 |
$this->define_hooks();
|
84 |
}
|
@@ -111,7 +111,7 @@ class TInvWL_Public_AddToWishlist {
|
|
111 |
break;
|
112 |
case 'above_thumb':
|
113 |
add_action( 'tinvwl_above_thumb_loop_item', 'tinvwl_view_addto_htmlloop' );
|
114 |
-
add_action( 'woocommerce_before_shop_loop_item', 'tinvwl_view_addto_htmlloop',
|
115 |
case 'shortcode':
|
116 |
break;
|
117 |
case 'after':
|
@@ -151,7 +151,7 @@ class TInvWL_Public_AddToWishlist {
|
|
151 |
$wishlist = null;
|
152 |
$data = array( 'msg' => array() );
|
153 |
if ( is_user_logged_in() ) {
|
154 |
-
$wl = new TInvWL_Wishlist( $this->
|
155 |
$wishlist = $wl->add_user_default();
|
156 |
$wishlist = apply_filters( 'tinvwl_addtowishlist_wishlist', $wishlist );
|
157 |
if ( empty( $wishlist ) ) {
|
@@ -160,7 +160,7 @@ class TInvWL_Public_AddToWishlist {
|
|
160 |
ob_clean();
|
161 |
wp_send_json( $data );
|
162 |
}
|
163 |
-
$wlp = new TInvWL_Product( $wishlist, $this->
|
164 |
} elseif ( tinv_get_option( 'general', 'require_login' ) ) {
|
165 |
$data['status'] = false;
|
166 |
$data['icon'] = 'icon_big_times';
|
@@ -170,7 +170,7 @@ class TInvWL_Public_AddToWishlist {
|
|
170 |
} else {
|
171 |
$data['msg'][] = __( 'Please, login to add products to Wishlist', 'ti-woocommerce-wishlist' );
|
172 |
$data['dialog_custom_url'] = apply_filters( 'tinvwl_addtowishlist_login_page', wc_get_page_permalink( 'myaccount' ), $post );
|
173 |
-
$data['dialog_custom_html'] = '<i class="ftinvwl ftinvwl-key"></i>'.esc_html( __( 'Login', 'ti-woocommerce-wishlist' ) );
|
174 |
}
|
175 |
$data['msg'] = array_unique( $data['msg'] );
|
176 |
$data['msg'] = implode( '<br>', $data['msg'] );
|
@@ -181,7 +181,7 @@ class TInvWL_Public_AddToWishlist {
|
|
181 |
ob_clean();
|
182 |
wp_send_json( $data );
|
183 |
} else {
|
184 |
-
$wl = new TInvWL_Wishlist( $this->
|
185 |
$wishlist = $wl->add_sharekey_default();
|
186 |
$wlp = new TInvWL_Product( $wishlist );
|
187 |
}
|
@@ -190,7 +190,7 @@ class TInvWL_Public_AddToWishlist {
|
|
190 |
if ( empty( $post['product_id'] ) ) {
|
191 |
$status = false;
|
192 |
} else {
|
193 |
-
$post['product_type'] = apply_filters( $this->
|
194 |
$post = apply_filters( 'tinvwl_addtowishlist_prepare', $post );
|
195 |
$form = apply_filters( 'tinvwl_addtowishlist_prepare_form', filter_input( INPUT_POST, 'form', FILTER_DEFAULT, FILTER_FORCE_ARRAY ) );
|
196 |
if ( empty( $form ) ) {
|
@@ -313,7 +313,7 @@ class TInvWL_Public_AddToWishlist {
|
|
313 |
$data['msg'] = array_unique( $data['msg'] );
|
314 |
$data['msg'] = implode( '<br>', $data['msg'] );
|
315 |
if ( ! empty( $data['msg'] ) ) {
|
316 |
-
$data['msg'] = apply_filters( $this->
|
317 |
$data['msg'] = tinv_wishlist_template_html( 'ti-addedtowishlist-dialogbox.php', apply_filters( 'tinvwl_addtowishlist_dialog_box', $data, $post ) );
|
318 |
}
|
319 |
if ( ! tinv_get_option( 'general', 'show_notice' ) && array_key_exists( 'msg', $data ) ) {
|
@@ -337,7 +337,7 @@ class TInvWL_Public_AddToWishlist {
|
|
337 |
return $this->user_wishlist;
|
338 |
}
|
339 |
$wishlists = array();
|
340 |
-
$wl = new TInvWL_Wishlist( $this->
|
341 |
if ( is_user_logged_in() ) {
|
342 |
$wishlists = $wl->get_by_user_default();
|
343 |
} else {
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
private $_name;
|
25 |
|
26 |
/**
|
27 |
* Global product
|
78 |
* @param string $plugin_name Plugin name.
|
79 |
*/
|
80 |
function __construct( $plugin_name ) {
|
81 |
+
$this->_name = $plugin_name;
|
82 |
$this->is_loop = false;
|
83 |
$this->define_hooks();
|
84 |
}
|
111 |
break;
|
112 |
case 'above_thumb':
|
113 |
add_action( 'tinvwl_above_thumb_loop_item', 'tinvwl_view_addto_htmlloop' );
|
114 |
+
add_action( 'woocommerce_before_shop_loop_item', 'tinvwl_view_addto_htmlloop', 9 );
|
115 |
case 'shortcode':
|
116 |
break;
|
117 |
case 'after':
|
151 |
$wishlist = null;
|
152 |
$data = array( 'msg' => array() );
|
153 |
if ( is_user_logged_in() ) {
|
154 |
+
$wl = new TInvWL_Wishlist( $this->_name );
|
155 |
$wishlist = $wl->add_user_default();
|
156 |
$wishlist = apply_filters( 'tinvwl_addtowishlist_wishlist', $wishlist );
|
157 |
if ( empty( $wishlist ) ) {
|
160 |
ob_clean();
|
161 |
wp_send_json( $data );
|
162 |
}
|
163 |
+
$wlp = new TInvWL_Product( $wishlist, $this->_name );
|
164 |
} elseif ( tinv_get_option( 'general', 'require_login' ) ) {
|
165 |
$data['status'] = false;
|
166 |
$data['icon'] = 'icon_big_times';
|
170 |
} else {
|
171 |
$data['msg'][] = __( 'Please, login to add products to Wishlist', 'ti-woocommerce-wishlist' );
|
172 |
$data['dialog_custom_url'] = apply_filters( 'tinvwl_addtowishlist_login_page', wc_get_page_permalink( 'myaccount' ), $post );
|
173 |
+
$data['dialog_custom_html'] = '<i class="ftinvwl ftinvwl-key"></i>' . esc_html( __( 'Login', 'ti-woocommerce-wishlist' ) );
|
174 |
}
|
175 |
$data['msg'] = array_unique( $data['msg'] );
|
176 |
$data['msg'] = implode( '<br>', $data['msg'] );
|
181 |
ob_clean();
|
182 |
wp_send_json( $data );
|
183 |
} else {
|
184 |
+
$wl = new TInvWL_Wishlist( $this->_name );
|
185 |
$wishlist = $wl->add_sharekey_default();
|
186 |
$wlp = new TInvWL_Product( $wishlist );
|
187 |
}
|
190 |
if ( empty( $post['product_id'] ) ) {
|
191 |
$status = false;
|
192 |
} else {
|
193 |
+
$post['product_type'] = apply_filters( $this->_name . '_addtowishlist_modify_type', $post['product_type'], $post );
|
194 |
$post = apply_filters( 'tinvwl_addtowishlist_prepare', $post );
|
195 |
$form = apply_filters( 'tinvwl_addtowishlist_prepare_form', filter_input( INPUT_POST, 'form', FILTER_DEFAULT, FILTER_FORCE_ARRAY ) );
|
196 |
if ( empty( $form ) ) {
|
313 |
$data['msg'] = array_unique( $data['msg'] );
|
314 |
$data['msg'] = implode( '<br>', $data['msg'] );
|
315 |
if ( ! empty( $data['msg'] ) ) {
|
316 |
+
$data['msg'] = apply_filters( $this->_name . '_addtowishlist_message_after', $data['msg'], $data, $post, $form, $product );
|
317 |
$data['msg'] = tinv_wishlist_template_html( 'ti-addedtowishlist-dialogbox.php', apply_filters( 'tinvwl_addtowishlist_dialog_box', $data, $post ) );
|
318 |
}
|
319 |
if ( ! tinv_get_option( 'general', 'show_notice' ) && array_key_exists( 'msg', $data ) ) {
|
337 |
return $this->user_wishlist;
|
338 |
}
|
339 |
$wishlists = array();
|
340 |
+
$wl = new TInvWL_Wishlist( $this->_name );
|
341 |
if ( is_user_logged_in() ) {
|
342 |
$wishlists = $wl->get_by_user_default();
|
343 |
} else {
|
public/cart.class.php
CHANGED
@@ -21,7 +21,7 @@ class TInvWL_Public_Cart {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
static $
|
25 |
|
26 |
/**
|
27 |
* Default post object.
|
@@ -64,7 +64,7 @@ class TInvWL_Public_Cart {
|
|
64 |
* @param string $plugin_name Plugin name.
|
65 |
*/
|
66 |
function __construct( $plugin_name ) {
|
67 |
-
self::$
|
68 |
$this->define_hooks();
|
69 |
}
|
70 |
|
@@ -350,7 +350,7 @@ class TInvWL_Public_Cart {
|
|
350 |
if ( 0 === $wishlist['ID'] ) {
|
351 |
$wlp = TInvWL_Product_Local::instance();
|
352 |
} else {
|
353 |
-
$wlp = new TInvWL_Product( $wishlist, self::$
|
354 |
}
|
355 |
if ( empty( $wlp ) ) {
|
356 |
return 0;
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
static $_name;
|
25 |
|
26 |
/**
|
27 |
* Default post object.
|
64 |
* @param string $plugin_name Plugin name.
|
65 |
*/
|
66 |
function __construct( $plugin_name ) {
|
67 |
+
self::$_name = $plugin_name;
|
68 |
$this->define_hooks();
|
69 |
}
|
70 |
|
350 |
if ( 0 === $wishlist['ID'] ) {
|
351 |
$wlp = TInvWL_Product_Local::instance();
|
352 |
} else {
|
353 |
+
$wlp = new TInvWL_Product( $wishlist, self::$_name );
|
354 |
}
|
355 |
if ( empty( $wlp ) ) {
|
356 |
return 0;
|
public/tinvwl.class.php
CHANGED
@@ -21,14 +21,14 @@ class TInvWL_Public_TInvWL {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
public $
|
25 |
|
26 |
/**
|
27 |
* Plugin version
|
28 |
*
|
29 |
* @var string
|
30 |
*/
|
31 |
-
public $
|
32 |
/**
|
33 |
* This class
|
34 |
*
|
@@ -59,8 +59,8 @@ class TInvWL_Public_TInvWL {
|
|
59 |
* @param string $version Plugin version.
|
60 |
*/
|
61 |
function __construct( $plugin_name, $version ) {
|
62 |
-
$this->
|
63 |
-
$this->
|
64 |
$this->pre_load_function();
|
65 |
}
|
66 |
|
@@ -73,17 +73,17 @@ class TInvWL_Public_TInvWL {
|
|
73 |
add_filter( 'query_vars', array( $this, 'add_query_var' ) );
|
74 |
add_action( 'deleted_user', array( $this, 'delete_user_wishlist' ) );
|
75 |
|
76 |
-
add_action( 'wp_ajax_nopriv_' . $this->
|
77 |
-
add_action( 'wp_ajax_' . $this->
|
78 |
add_action( 'widgets_init', array( $this, 'register_widgets' ) );
|
79 |
|
80 |
add_filter( 'woocommerce_locate_core_template', array( $this, 'locate_template' ), 10, 3 );
|
81 |
add_filter( 'woocommerce_locate_template', array( $this, 'locate_template' ), 10, 3 );
|
82 |
|
83 |
-
$this->addto = TInvWL_Public_AddToWishlist::instance( $this->
|
84 |
-
$this->view = TInvWL_Public_Wishlist_View::instance( $this->
|
85 |
-
$this->cart = TInvWL_Public_Cart::instance( $this->
|
86 |
-
$this->topwishlist = TInvWL_Public_TopWishlist::instance( $this->
|
87 |
}
|
88 |
|
89 |
/**
|
@@ -106,10 +106,10 @@ class TInvWL_Public_TInvWL {
|
|
106 |
add_action( 'init', array( $this, 'legacy_transfer' ), 90 );
|
107 |
add_action( 'clear_auth_cookie', array( $this, 'set_user_sharekey' ) );
|
108 |
|
109 |
-
add_action( $this->
|
110 |
-
add_action( $this->
|
111 |
-
add_action( $this->
|
112 |
-
add_action( $this->
|
113 |
}
|
114 |
|
115 |
/**
|
@@ -361,9 +361,9 @@ class TInvWL_Public_TInvWL {
|
|
361 |
* Load style
|
362 |
*/
|
363 |
function enqueue_styles() {
|
364 |
-
wp_enqueue_style( 'tinvwl', TINVWL_URL . 'assets/css/public.min.css', array(), $this->
|
365 |
if ( ! tinv_get_option( 'style', 'customstyle' ) ) {
|
366 |
-
wp_enqueue_style( 'tinvwl-theme', TINVWL_URL . 'assets/css/theme.min.css', array(), $this->
|
367 |
}
|
368 |
if ( ! tinv_get_option( 'style', 'customstyle' ) || ( tinv_get_option( 'style_plain', 'allow' ) && tinv_get_option( 'style_plain', 'css' ) ) ) {
|
369 |
$newcss = $this->dynaminc_css();
|
@@ -434,19 +434,19 @@ class TInvWL_Public_TInvWL {
|
|
434 |
*/
|
435 |
function enqueue_scripts() {
|
436 |
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
437 |
-
wp_register_script( $this->
|
438 |
'jquery',
|
439 |
version_compare( WC_VERSION, '3.0.0', '<' ) ? 'jquery-cookie' : 'js-cookie',
|
440 |
'wc-cart-fragments'
|
441 |
-
), $this->
|
442 |
-
wp_localize_script( $this->
|
443 |
'text_create' => __( 'Create New', 'ti-woocommerce-wishlist' ),
|
444 |
'text_already_in' => apply_filters( 'tinvwl-general-text_already_in', tinv_get_option( 'general', 'text_already_in' ) ),
|
445 |
'simple_flow' => tinv_get_option( 'general', 'simple_flow' ),
|
446 |
'i18n_make_a_selection_text' => esc_attr__( 'Please select some product options before adding this product to your wishlist.', 'ti-woocommerce-wishlist' ),
|
447 |
'tinvwl_break_submit' => esc_attr__( 'No items or actions are selected.', 'ti-woocommerce-wishlist' ),
|
448 |
) );
|
449 |
-
wp_enqueue_script( $this->
|
450 |
}
|
451 |
|
452 |
/**
|
@@ -474,7 +474,7 @@ class TInvWL_Public_TInvWL {
|
|
474 |
* @param integer $user_id New user id.
|
475 |
*/
|
476 |
function transfert_local_to_user_register( $user_id ) {
|
477 |
-
$wl = new TInvWL_Wishlist( $this->
|
478 |
$wishlist = $wl->get_by_sharekey_default();
|
479 |
if ( ! empty( $wishlist ) ) {
|
480 |
$wishlist = array_shift( $wishlist );
|
@@ -486,7 +486,7 @@ class TInvWL_Public_TInvWL {
|
|
486 |
$wishlist['author'] = $user_id;
|
487 |
unset( $wishlist['title'] );
|
488 |
$wl->update( $wishlist['ID'], $wishlist );
|
489 |
-
$wlp = new TInvWL_Product( $wishlist, $this->
|
490 |
$products = $wlp->get_wishlist( array( 'external' => false ) );
|
491 |
foreach ( $products as $product ) {
|
492 |
$product['author'] = $user_id;
|
@@ -495,7 +495,7 @@ class TInvWL_Public_TInvWL {
|
|
495 |
} else {
|
496 |
$_wishlist = array_shift( $_wishlist );
|
497 |
if ( $wishlist['ID'] != $_wishlist['ID'] ) {
|
498 |
-
$wlp = new TInvWL_Product( $_wishlist, $this->
|
499 |
$products = $wlpl->get_wishlist( array( 'external' => false ) );
|
500 |
$added = true;
|
501 |
foreach ( $products as $product ) {
|
@@ -517,7 +517,7 @@ class TInvWL_Public_TInvWL {
|
|
517 |
* Set the default wishlist key if the user loguot
|
518 |
*/
|
519 |
public function set_user_sharekey() {
|
520 |
-
$wl = new TInvWL_Wishlist( $this->
|
521 |
$wishlist = $wl->get_by_user_default();
|
522 |
if ( ! empty( $wishlist ) ) {
|
523 |
$wishlist = array_shift( $wishlist );
|
@@ -533,7 +533,7 @@ class TInvWL_Public_TInvWL {
|
|
533 |
* @return array
|
534 |
*/
|
535 |
function account_menu_items( $items ) {
|
536 |
-
$index_position = apply_filters( $this->
|
537 |
$items = array_merge(
|
538 |
array_slice( $items, 0, $index_position, true ),
|
539 |
array(
|
@@ -569,7 +569,7 @@ class TInvWL_Public_TInvWL {
|
|
569 |
* @param integer $id Removed userid.
|
570 |
*/
|
571 |
function delete_user_wishlist( $id ) {
|
572 |
-
$wl = new TInvWL_Wishlist( $this->
|
573 |
$wishlists = $wl->get( array(
|
574 |
'author' => $id,
|
575 |
'count' => 9999999,
|
@@ -585,13 +585,13 @@ class TInvWL_Public_TInvWL {
|
|
585 |
* Export cookies wishlist to database
|
586 |
*/
|
587 |
function legacy_transfer() {
|
588 |
-
$wlpl = TInvWL_Product_Legacy::instance( $this->
|
589 |
$products = $wlpl->get_wishlist( array( 'external' => false ) );
|
590 |
if ( ! empty( $products ) && is_array( $products ) ) {
|
591 |
-
$wl = new TInvWL_Wishlist( $this->
|
592 |
$wishlist = $wl->add_user_default();
|
593 |
|
594 |
-
$wlp = new TInvWL_Product( $wishlist, $this->
|
595 |
|
596 |
$added = true;
|
597 |
foreach ( $products as $product ) {
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
public $_name;
|
25 |
|
26 |
/**
|
27 |
* Plugin version
|
28 |
*
|
29 |
* @var string
|
30 |
*/
|
31 |
+
public $_version;
|
32 |
/**
|
33 |
* This class
|
34 |
*
|
59 |
* @param string $version Plugin version.
|
60 |
*/
|
61 |
function __construct( $plugin_name, $version ) {
|
62 |
+
$this->_name = $plugin_name;
|
63 |
+
$this->_version = $version;
|
64 |
$this->pre_load_function();
|
65 |
}
|
66 |
|
73 |
add_filter( 'query_vars', array( $this, 'add_query_var' ) );
|
74 |
add_action( 'deleted_user', array( $this, 'delete_user_wishlist' ) );
|
75 |
|
76 |
+
add_action( 'wp_ajax_nopriv_' . $this->_name . '_css', array( $this, 'dynaminc_css' ) );
|
77 |
+
add_action( 'wp_ajax_' . $this->_name . '_css', array( $this, 'dynaminc_css' ) );
|
78 |
add_action( 'widgets_init', array( $this, 'register_widgets' ) );
|
79 |
|
80 |
add_filter( 'woocommerce_locate_core_template', array( $this, 'locate_template' ), 10, 3 );
|
81 |
add_filter( 'woocommerce_locate_template', array( $this, 'locate_template' ), 10, 3 );
|
82 |
|
83 |
+
$this->addto = TInvWL_Public_AddToWishlist::instance( $this->_name );
|
84 |
+
$this->view = TInvWL_Public_Wishlist_View::instance( $this->_name );
|
85 |
+
$this->cart = TInvWL_Public_Cart::instance( $this->_name );
|
86 |
+
$this->topwishlist = TInvWL_Public_TopWishlist::instance( $this->_name );
|
87 |
}
|
88 |
|
89 |
/**
|
106 |
add_action( 'init', array( $this, 'legacy_transfer' ), 90 );
|
107 |
add_action( 'clear_auth_cookie', array( $this, 'set_user_sharekey' ) );
|
108 |
|
109 |
+
add_action( $this->_name . '_after_wishlist_table', array( $this, 'wishlist_button_action_before' ), 0 );
|
110 |
+
add_action( $this->_name . '_after_wishlist_table', array( $this, 'wishlist_button_action_after' ), 15 );
|
111 |
+
add_action( $this->_name . '_after_wishlist_table', array( $this, 'wishlist_button_updcart_before' ), 15 );
|
112 |
+
add_action( $this->_name . '_after_wishlist_table', array( $this, 'wishlist_button_action_after' ), 100 );
|
113 |
}
|
114 |
|
115 |
/**
|
361 |
* Load style
|
362 |
*/
|
363 |
function enqueue_styles() {
|
364 |
+
wp_enqueue_style( 'tinvwl', TINVWL_URL . 'assets/css/public.min.css', array(), $this->_version, 'all' );
|
365 |
if ( ! tinv_get_option( 'style', 'customstyle' ) ) {
|
366 |
+
wp_enqueue_style( 'tinvwl-theme', TINVWL_URL . 'assets/css/theme.min.css', array(), $this->_version, 'all' );
|
367 |
}
|
368 |
if ( ! tinv_get_option( 'style', 'customstyle' ) || ( tinv_get_option( 'style_plain', 'allow' ) && tinv_get_option( 'style_plain', 'css' ) ) ) {
|
369 |
$newcss = $this->dynaminc_css();
|
434 |
*/
|
435 |
function enqueue_scripts() {
|
436 |
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
437 |
+
wp_register_script( $this->_name, TINVWL_URL . 'assets/js/public' . $suffix . '.js', array(
|
438 |
'jquery',
|
439 |
version_compare( WC_VERSION, '3.0.0', '<' ) ? 'jquery-cookie' : 'js-cookie',
|
440 |
'wc-cart-fragments'
|
441 |
+
), $this->_version, true );
|
442 |
+
wp_localize_script( $this->_name, 'tinvwl_add_to_wishlist', array(
|
443 |
'text_create' => __( 'Create New', 'ti-woocommerce-wishlist' ),
|
444 |
'text_already_in' => apply_filters( 'tinvwl-general-text_already_in', tinv_get_option( 'general', 'text_already_in' ) ),
|
445 |
'simple_flow' => tinv_get_option( 'general', 'simple_flow' ),
|
446 |
'i18n_make_a_selection_text' => esc_attr__( 'Please select some product options before adding this product to your wishlist.', 'ti-woocommerce-wishlist' ),
|
447 |
'tinvwl_break_submit' => esc_attr__( 'No items or actions are selected.', 'ti-woocommerce-wishlist' ),
|
448 |
) );
|
449 |
+
wp_enqueue_script( $this->_name );
|
450 |
}
|
451 |
|
452 |
/**
|
474 |
* @param integer $user_id New user id.
|
475 |
*/
|
476 |
function transfert_local_to_user_register( $user_id ) {
|
477 |
+
$wl = new TInvWL_Wishlist( $this->_name );
|
478 |
$wishlist = $wl->get_by_sharekey_default();
|
479 |
if ( ! empty( $wishlist ) ) {
|
480 |
$wishlist = array_shift( $wishlist );
|
486 |
$wishlist['author'] = $user_id;
|
487 |
unset( $wishlist['title'] );
|
488 |
$wl->update( $wishlist['ID'], $wishlist );
|
489 |
+
$wlp = new TInvWL_Product( $wishlist, $this->_name );
|
490 |
$products = $wlp->get_wishlist( array( 'external' => false ) );
|
491 |
foreach ( $products as $product ) {
|
492 |
$product['author'] = $user_id;
|
495 |
} else {
|
496 |
$_wishlist = array_shift( $_wishlist );
|
497 |
if ( $wishlist['ID'] != $_wishlist['ID'] ) {
|
498 |
+
$wlp = new TInvWL_Product( $_wishlist, $this->_name );
|
499 |
$products = $wlpl->get_wishlist( array( 'external' => false ) );
|
500 |
$added = true;
|
501 |
foreach ( $products as $product ) {
|
517 |
* Set the default wishlist key if the user loguot
|
518 |
*/
|
519 |
public function set_user_sharekey() {
|
520 |
+
$wl = new TInvWL_Wishlist( $this->_name );
|
521 |
$wishlist = $wl->get_by_user_default();
|
522 |
if ( ! empty( $wishlist ) ) {
|
523 |
$wishlist = array_shift( $wishlist );
|
533 |
* @return array
|
534 |
*/
|
535 |
function account_menu_items( $items ) {
|
536 |
+
$index_position = apply_filters( $this->_name . '_myaccount_position_wishlist', - 1, $items );
|
537 |
$items = array_merge(
|
538 |
array_slice( $items, 0, $index_position, true ),
|
539 |
array(
|
569 |
* @param integer $id Removed userid.
|
570 |
*/
|
571 |
function delete_user_wishlist( $id ) {
|
572 |
+
$wl = new TInvWL_Wishlist( $this->_name );
|
573 |
$wishlists = $wl->get( array(
|
574 |
'author' => $id,
|
575 |
'count' => 9999999,
|
585 |
* Export cookies wishlist to database
|
586 |
*/
|
587 |
function legacy_transfer() {
|
588 |
+
$wlpl = TInvWL_Product_Legacy::instance( $this->_name );
|
589 |
$products = $wlpl->get_wishlist( array( 'external' => false ) );
|
590 |
if ( ! empty( $products ) && is_array( $products ) ) {
|
591 |
+
$wl = new TInvWL_Wishlist( $this->_name );
|
592 |
$wishlist = $wl->add_user_default();
|
593 |
|
594 |
+
$wlp = new TInvWL_Product( $wishlist, $this->_name );
|
595 |
|
596 |
$added = true;
|
597 |
foreach ( $products as $product ) {
|
public/topwishlist.class.php
CHANGED
@@ -1,167 +1,167 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Drop down widget
|
4 |
-
*
|
5 |
-
* @since 1.4.0
|
6 |
-
* @package TInvWishlist\Public
|
7 |
-
*/
|
8 |
-
|
9 |
-
// If this file is called directly, abort.
|
10 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
-
die;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Drop down widget
|
16 |
-
*/
|
17 |
-
class TInvWL_Public_TopWishlist {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Plugin name
|
21 |
-
*
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
static $
|
25 |
-
/**
|
26 |
-
* This class
|
27 |
-
*
|
28 |
-
* @var \TInvWL_Public_TopWishlist
|
29 |
-
*/
|
30 |
-
protected static $_instance = null;
|
31 |
-
|
32 |
-
/**
|
33 |
-
* Get this class object
|
34 |
-
*
|
35 |
-
* @param string $plugin_name Plugin name.
|
36 |
-
*
|
37 |
-
* @return \TInvWL_Public_TopWishlist
|
38 |
-
*/
|
39 |
-
public static function instance( $plugin_name = TINVWL_PREFIX ) {
|
40 |
-
if ( is_null( self::$_instance ) ) {
|
41 |
-
self::$_instance = new self( $plugin_name );
|
42 |
-
}
|
43 |
-
|
44 |
-
return self::$_instance;
|
45 |
-
}
|
46 |
-
|
47 |
-
/**
|
48 |
-
* Constructor
|
49 |
-
*
|
50 |
-
* @param string $plugin_name Plugin name.
|
51 |
-
*/
|
52 |
-
function __construct( $plugin_name ) {
|
53 |
-
self::$
|
54 |
-
$this->define_hooks();
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Define hooks
|
59 |
-
*/
|
60 |
-
function define_hooks() {
|
61 |
-
add_filter( 'tinvwl_addtowishlist_return_ajax', array( __CLASS__, 'update_widget' ) );
|
62 |
-
add_filter( 'woocommerce_add_to_cart_fragments', array( __CLASS__, 'update_fragments' ) );
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Output shortcode
|
67 |
-
*
|
68 |
-
* @param array $atts Shortcode attributes.
|
69 |
-
*/
|
70 |
-
function htmloutput( $atts ) {
|
71 |
-
$data = array(
|
72 |
-
'icon' => tinv_get_option( 'topline', 'icon' ),
|
73 |
-
'icon_class' => ( $atts['show_icon'] && tinv_get_option( 'topline', 'icon' ) ) ? 'top_wishlist-' . tinv_get_option( 'topline', 'icon' ) : '',
|
74 |
-
'icon_style' => ( $atts['show_icon'] && tinv_get_option( 'topline', 'icon' ) ) ? esc_attr( 'top_wishlist-' . tinv_get_option( 'topline', 'icon_style' ) ) : '',
|
75 |
-
'icon_upload' => tinv_get_option( 'topline', 'icon_upload' ),
|
76 |
-
'text' => $atts['show_text'] ? $atts['text'] : '',
|
77 |
-
'counter' => $atts['show_counter'],
|
78 |
-
'show_counter' => $atts['show_counter'],
|
79 |
-
);
|
80 |
-
tinv_wishlist_template( 'ti-wishlist-product-counter.php', $data );
|
81 |
-
}
|
82 |
-
|
83 |
-
/**
|
84 |
-
* AJAX update elements.
|
85 |
-
*
|
86 |
-
* @param array $data AJAX data.
|
87 |
-
*
|
88 |
-
* @return array
|
89 |
-
*/
|
90 |
-
public static function update_widget( $data ) {
|
91 |
-
$data['fragments'] = self::update_fragments( array() );
|
92 |
-
|
93 |
-
return $data;
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* Load fragments for wishlist product counter
|
98 |
-
*
|
99 |
-
* @param array $data Woocommerce Fragments for updateing data.
|
100 |
-
*/
|
101 |
-
public static function update_fragments( $data = array() ) {
|
102 |
-
$data['span.wishlist_products_counter_number'] = sprintf( '<span class="wishlist_products_counter_number">%d</span>', self::counter() );
|
103 |
-
|
104 |
-
return $data;
|
105 |
-
}
|
106 |
-
|
107 |
-
/**
|
108 |
-
* Get count product in all wishlist
|
109 |
-
*
|
110 |
-
* @return integer
|
111 |
-
*/
|
112 |
-
public static function counter() {
|
113 |
-
$count = 0;
|
114 |
-
$wl = new TInvWL_Wishlist();
|
115 |
-
if ( is_user_logged_in() ) {
|
116 |
-
$wishlist = $wl->add_user_default();
|
117 |
-
$wlp = new TInvWL_Product();
|
118 |
-
$counts = $wlp->get( array(
|
119 |
-
'external' => false,
|
120 |
-
'wishlist_id' => $wishlist['ID'],
|
121 |
-
'sql' => 'SELECT COUNT(`quantity`) AS `quantity` FROM {table} WHERE {where}',
|
122 |
-
) );
|
123 |
-
$counts = array_shift( $counts );
|
124 |
-
$count = absint( $counts['quantity'] );
|
125 |
-
} else {
|
126 |
-
$wishlist = $wl->get_by_sharekey_default();
|
127 |
-
if ( ! empty( $wishlist ) ) {
|
128 |
-
$wishlist = array_shift( $wishlist );
|
129 |
-
$wlp = new TInvWL_Product( $wishlist );
|
130 |
-
$counts = $wlp->get_wishlist( array(
|
131 |
-
'external' => false,
|
132 |
-
'sql' => sprintf( 'SELECT %s(`quantity`) AS `quantity` FROM {table} WHERE {where}', ( tinv_get_option( 'general', 'quantity_func' ) ? 'SUM' : 'COUNT' ) ),
|
133 |
-
) );
|
134 |
-
$counts = array_shift( $counts );
|
135 |
-
$count = absint( $counts['quantity'] );
|
136 |
-
}
|
137 |
-
}
|
138 |
-
|
139 |
-
return $count;
|
140 |
-
}
|
141 |
-
|
142 |
-
/**
|
143 |
-
* Shortcode basic function
|
144 |
-
*
|
145 |
-
* @param array $atts Array parameter from shortcode.
|
146 |
-
*
|
147 |
-
* @return string
|
148 |
-
*/
|
149 |
-
function shortcode( $atts = array() ) {
|
150 |
-
$default = array(
|
151 |
-
'show_icon' => (bool) tinv_get_option( 'topline', 'icon' ),
|
152 |
-
'show_text' => tinv_get_option( 'topline', 'show_text' ),
|
153 |
-
'text' => apply_filters( 'tinvwl-topline-text', tinv_get_option( 'topline', 'text' ) ),
|
154 |
-
'show_counter' => 'on',
|
155 |
-
);
|
156 |
-
$atts = filter_var_array( shortcode_atts( $default, $atts ), array(
|
157 |
-
'show_icon' => FILTER_VALIDATE_BOOLEAN,
|
158 |
-
'show_text' => FILTER_VALIDATE_BOOLEAN,
|
159 |
-
'show_counter' => FILTER_VALIDATE_BOOLEAN,
|
160 |
-
'text' => FILTER_DEFAULT,
|
161 |
-
) );
|
162 |
-
ob_start();
|
163 |
-
$this->htmloutput( $atts );
|
164 |
-
|
165 |
-
return ob_get_clean();
|
166 |
-
}
|
167 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Drop down widget
|
4 |
+
*
|
5 |
+
* @since 1.4.0
|
6 |
+
* @package TInvWishlist\Public
|
7 |
+
*/
|
8 |
+
|
9 |
+
// If this file is called directly, abort.
|
10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
11 |
+
die;
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Drop down widget
|
16 |
+
*/
|
17 |
+
class TInvWL_Public_TopWishlist {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Plugin name
|
21 |
+
*
|
22 |
+
* @var string
|
23 |
+
*/
|
24 |
+
static $_name;
|
25 |
+
/**
|
26 |
+
* This class
|
27 |
+
*
|
28 |
+
* @var \TInvWL_Public_TopWishlist
|
29 |
+
*/
|
30 |
+
protected static $_instance = null;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Get this class object
|
34 |
+
*
|
35 |
+
* @param string $plugin_name Plugin name.
|
36 |
+
*
|
37 |
+
* @return \TInvWL_Public_TopWishlist
|
38 |
+
*/
|
39 |
+
public static function instance( $plugin_name = TINVWL_PREFIX ) {
|
40 |
+
if ( is_null( self::$_instance ) ) {
|
41 |
+
self::$_instance = new self( $plugin_name );
|
42 |
+
}
|
43 |
+
|
44 |
+
return self::$_instance;
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Constructor
|
49 |
+
*
|
50 |
+
* @param string $plugin_name Plugin name.
|
51 |
+
*/
|
52 |
+
function __construct( $plugin_name ) {
|
53 |
+
self::$_name = $plugin_name;
|
54 |
+
$this->define_hooks();
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Define hooks
|
59 |
+
*/
|
60 |
+
function define_hooks() {
|
61 |
+
add_filter( 'tinvwl_addtowishlist_return_ajax', array( __CLASS__, 'update_widget' ) );
|
62 |
+
add_filter( 'woocommerce_add_to_cart_fragments', array( __CLASS__, 'update_fragments' ) );
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Output shortcode
|
67 |
+
*
|
68 |
+
* @param array $atts Shortcode attributes.
|
69 |
+
*/
|
70 |
+
function htmloutput( $atts ) {
|
71 |
+
$data = array(
|
72 |
+
'icon' => tinv_get_option( 'topline', 'icon' ),
|
73 |
+
'icon_class' => ( $atts['show_icon'] && tinv_get_option( 'topline', 'icon' ) ) ? 'top_wishlist-' . tinv_get_option( 'topline', 'icon' ) : '',
|
74 |
+
'icon_style' => ( $atts['show_icon'] && tinv_get_option( 'topline', 'icon' ) ) ? esc_attr( 'top_wishlist-' . tinv_get_option( 'topline', 'icon_style' ) ) : '',
|
75 |
+
'icon_upload' => tinv_get_option( 'topline', 'icon_upload' ),
|
76 |
+
'text' => $atts['show_text'] ? $atts['text'] : '',
|
77 |
+
'counter' => $atts['show_counter'],
|
78 |
+
'show_counter' => $atts['show_counter'],
|
79 |
+
);
|
80 |
+
tinv_wishlist_template( 'ti-wishlist-product-counter.php', $data );
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* AJAX update elements.
|
85 |
+
*
|
86 |
+
* @param array $data AJAX data.
|
87 |
+
*
|
88 |
+
* @return array
|
89 |
+
*/
|
90 |
+
public static function update_widget( $data ) {
|
91 |
+
$data['fragments'] = self::update_fragments( array() );
|
92 |
+
|
93 |
+
return $data;
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Load fragments for wishlist product counter
|
98 |
+
*
|
99 |
+
* @param array $data Woocommerce Fragments for updateing data.
|
100 |
+
*/
|
101 |
+
public static function update_fragments( $data = array() ) {
|
102 |
+
$data['span.wishlist_products_counter_number'] = sprintf( '<span class="wishlist_products_counter_number">%d</span>', self::counter() );
|
103 |
+
|
104 |
+
return $data;
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* Get count product in all wishlist
|
109 |
+
*
|
110 |
+
* @return integer
|
111 |
+
*/
|
112 |
+
public static function counter() {
|
113 |
+
$count = 0;
|
114 |
+
$wl = new TInvWL_Wishlist();
|
115 |
+
if ( is_user_logged_in() ) {
|
116 |
+
$wishlist = $wl->add_user_default();
|
117 |
+
$wlp = new TInvWL_Product();
|
118 |
+
$counts = $wlp->get( array(
|
119 |
+
'external' => false,
|
120 |
+
'wishlist_id' => $wishlist['ID'],
|
121 |
+
'sql' => 'SELECT COUNT(`quantity`) AS `quantity` FROM {table} WHERE {where}',
|
122 |
+
) );
|
123 |
+
$counts = array_shift( $counts );
|
124 |
+
$count = absint( $counts['quantity'] );
|
125 |
+
} else {
|
126 |
+
$wishlist = $wl->get_by_sharekey_default();
|
127 |
+
if ( ! empty( $wishlist ) ) {
|
128 |
+
$wishlist = array_shift( $wishlist );
|
129 |
+
$wlp = new TInvWL_Product( $wishlist );
|
130 |
+
$counts = $wlp->get_wishlist( array(
|
131 |
+
'external' => false,
|
132 |
+
'sql' => sprintf( 'SELECT %s(`quantity`) AS `quantity` FROM {table} WHERE {where}', ( tinv_get_option( 'general', 'quantity_func' ) ? 'SUM' : 'COUNT' ) ),
|
133 |
+
) );
|
134 |
+
$counts = array_shift( $counts );
|
135 |
+
$count = absint( $counts['quantity'] );
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
return $count;
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Shortcode basic function
|
144 |
+
*
|
145 |
+
* @param array $atts Array parameter from shortcode.
|
146 |
+
*
|
147 |
+
* @return string
|
148 |
+
*/
|
149 |
+
function shortcode( $atts = array() ) {
|
150 |
+
$default = array(
|
151 |
+
'show_icon' => (bool) tinv_get_option( 'topline', 'icon' ),
|
152 |
+
'show_text' => tinv_get_option( 'topline', 'show_text' ),
|
153 |
+
'text' => apply_filters( 'tinvwl-topline-text', tinv_get_option( 'topline', 'text' ) ),
|
154 |
+
'show_counter' => 'on',
|
155 |
+
);
|
156 |
+
$atts = filter_var_array( shortcode_atts( $default, $atts ), array(
|
157 |
+
'show_icon' => FILTER_VALIDATE_BOOLEAN,
|
158 |
+
'show_text' => FILTER_VALIDATE_BOOLEAN,
|
159 |
+
'show_counter' => FILTER_VALIDATE_BOOLEAN,
|
160 |
+
'text' => FILTER_DEFAULT,
|
161 |
+
) );
|
162 |
+
ob_start();
|
163 |
+
$this->htmloutput( $atts );
|
164 |
+
|
165 |
+
return ob_get_clean();
|
166 |
+
}
|
167 |
+
}
|
public/wishlist/buttons.class.php
CHANGED
@@ -21,7 +21,7 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
static $
|
25 |
/**
|
26 |
* Basic event
|
27 |
*
|
@@ -35,7 +35,7 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
35 |
* @param string $plugin_name Plugin name.
|
36 |
*/
|
37 |
public static function init( $plugin_name = TINVWL_PREFIX ) {
|
38 |
-
self::$
|
39 |
self::$event = 'tinvwl_after_wishlist_table';
|
40 |
self::htmloutput();
|
41 |
}
|
@@ -63,11 +63,11 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
63 |
'priority' => 10,
|
64 |
'condition' => '$a["is_owner"]',
|
65 |
);
|
66 |
-
add_filter( self::$
|
67 |
__CLASS__,
|
68 |
'add_break_class_input'
|
69 |
) );
|
70 |
-
add_filter( self::$
|
71 |
__CLASS__,
|
72 |
'add_break_class_checkbox'
|
73 |
) );
|
@@ -79,7 +79,7 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
79 |
'method' => array( __CLASS__, 'apply_action_add_selected' ),
|
80 |
'priority' => 25,
|
81 |
);
|
82 |
-
add_filter( self::$
|
83 |
__CLASS__,
|
84 |
'add_break_class_checkbox'
|
85 |
) );
|
@@ -91,8 +91,8 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
91 |
'method' => array( __CLASS__, 'add_all' ),
|
92 |
'priority' => 30,
|
93 |
);
|
94 |
-
add_filter( self::$
|
95 |
-
add_filter( self::$
|
96 |
}
|
97 |
$buttons = apply_filters( 'tinvwl_manage_buttons_create', $buttons );
|
98 |
|
@@ -173,10 +173,10 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
173 |
}
|
174 |
|
175 |
if ( array_key_exists( 'before', $button ) ) {
|
176 |
-
add_filter( self::$
|
177 |
}
|
178 |
if ( array_key_exists( 'after', $button ) ) {
|
179 |
-
add_filter( self::$
|
180 |
}
|
181 |
|
182 |
add_action( $button['event'], function () use ( $button ) {
|
@@ -198,21 +198,21 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
198 |
* @return string
|
199 |
*/
|
200 |
public static function button( $value, $title, $submit, $echo = true ) {
|
201 |
-
$html = apply_filters( self::$
|
202 |
$attr = array(
|
203 |
'type' => $submit,
|
204 |
'class' => 'button',
|
205 |
'name' => 'tinvwl-action',
|
206 |
'value' => $value,
|
207 |
);
|
208 |
-
$attr = apply_filters( self::$
|
209 |
foreach ( $attr as $key => &$value ) {
|
210 |
$value = sprintf( '%s="%s"', $key, esc_attr( $value ) );
|
211 |
}
|
212 |
$attr = implode( ' ', $attr );
|
213 |
|
214 |
-
$html .= apply_filters( self::$
|
215 |
-
$html .= apply_filters( self::$
|
216 |
|
217 |
if ( $echo ) {
|
218 |
echo $html; // WPCS: xss ok.
|
@@ -283,7 +283,7 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
283 |
if ( ! empty( $errors ) ) {
|
284 |
$titles = array();
|
285 |
foreach ( $errors as $product_id ) {
|
286 |
-
$titles[] = sprintf( _x( '“%s”', 'Item name in quotes', 'woocommerce' ), strip_tags( get_the_title( $product_id ) ) );
|
287 |
}
|
288 |
$titles = array_filter( $titles );
|
289 |
wc_add_notice( sprintf( _n( 'Product %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', 'Products: %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', count( $titles ), 'ti-woocommerce-wishlist' ), wc_format_list_of_items( $titles ) ), 'error' );
|
@@ -387,7 +387,7 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
387 |
if ( ! empty( $errors ) ) {
|
388 |
$titles = array();
|
389 |
foreach ( $errors as $product_id ) {
|
390 |
-
$titles[] = sprintf( _x( '“%s”', 'Item name in quotes', 'woocommerce' ), strip_tags( get_the_title( $product_id ) ) );
|
391 |
}
|
392 |
$titles = array_filter( $titles );
|
393 |
wc_add_notice( sprintf( _n( 'Product %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', 'Products: %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', count( $titles ), 'ti-woocommerce-wishlist' ), wc_format_list_of_items( $titles ) ), 'error' );
|
@@ -418,9 +418,9 @@ class TInvWL_Public_Wishlist_Buttons {
|
|
418 |
}
|
419 |
$wlp = null;
|
420 |
if ( 0 === $wishlist['ID'] ) {
|
421 |
-
$wlp = TInvWL_Product_Local::instance( self::$
|
422 |
} else {
|
423 |
-
$wlp = new TInvWL_Product( $wishlist, self::$
|
424 |
}
|
425 |
if ( empty( $wlp ) ) {
|
426 |
return false;
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
static $_name;
|
25 |
/**
|
26 |
* Basic event
|
27 |
*
|
35 |
* @param string $plugin_name Plugin name.
|
36 |
*/
|
37 |
public static function init( $plugin_name = TINVWL_PREFIX ) {
|
38 |
+
self::$_name = $plugin_name;
|
39 |
self::$event = 'tinvwl_after_wishlist_table';
|
40 |
self::htmloutput();
|
41 |
}
|
63 |
'priority' => 10,
|
64 |
'condition' => '$a["is_owner"]',
|
65 |
);
|
66 |
+
add_filter( self::$_name . '_prepare_attr__button_product_apply', array(
|
67 |
__CLASS__,
|
68 |
'add_break_class_input'
|
69 |
) );
|
70 |
+
add_filter( self::$_name . '_prepare_attr__button_product_apply', array(
|
71 |
__CLASS__,
|
72 |
'add_break_class_checkbox'
|
73 |
) );
|
79 |
'method' => array( __CLASS__, 'apply_action_add_selected' ),
|
80 |
'priority' => 25,
|
81 |
);
|
82 |
+
add_filter( self::$_name . '_prepare_attr__button_product_selected', array(
|
83 |
__CLASS__,
|
84 |
'add_break_class_checkbox'
|
85 |
) );
|
91 |
'method' => array( __CLASS__, 'add_all' ),
|
92 |
'priority' => 30,
|
93 |
);
|
94 |
+
add_filter( self::$_name . '_prepare_attr__button_product_selected', array( __CLASS__, 'class_action' ) );
|
95 |
+
add_filter( self::$_name . '_prepare_attr__button_product_all', array( __CLASS__, 'class_action' ) );
|
96 |
}
|
97 |
$buttons = apply_filters( 'tinvwl_manage_buttons_create', $buttons );
|
98 |
|
173 |
}
|
174 |
|
175 |
if ( array_key_exists( 'before', $button ) ) {
|
176 |
+
add_filter( self::$_name . '_before__button_' . $button['name'], $button['before'] );
|
177 |
}
|
178 |
if ( array_key_exists( 'after', $button ) ) {
|
179 |
+
add_filter( self::$_name . '_after__button_' . $button['name'], $button['after'] );
|
180 |
}
|
181 |
|
182 |
add_action( $button['event'], function () use ( $button ) {
|
198 |
* @return string
|
199 |
*/
|
200 |
public static function button( $value, $title, $submit, $echo = true ) {
|
201 |
+
$html = apply_filters( self::$_name . '_before__button_' . $value, '' );
|
202 |
$attr = array(
|
203 |
'type' => $submit,
|
204 |
'class' => 'button',
|
205 |
'name' => 'tinvwl-action',
|
206 |
'value' => $value,
|
207 |
);
|
208 |
+
$attr = apply_filters( self::$_name . '_prepare_attr__button_' . $value, $attr );
|
209 |
foreach ( $attr as $key => &$value ) {
|
210 |
$value = sprintf( '%s="%s"', $key, esc_attr( $value ) );
|
211 |
}
|
212 |
$attr = implode( ' ', $attr );
|
213 |
|
214 |
+
$html .= apply_filters( self::$_name . '__button_' . $value, sprintf( '<button %s>%s</button>', $attr, $title ) );
|
215 |
+
$html .= apply_filters( self::$_name . '_after__button_' . $value, '' );
|
216 |
|
217 |
if ( $echo ) {
|
218 |
echo $html; // WPCS: xss ok.
|
283 |
if ( ! empty( $errors ) ) {
|
284 |
$titles = array();
|
285 |
foreach ( $errors as $product_id ) {
|
286 |
+
$titles[] = sprintf( _x( '“%s”', 'Item name in quotes', 'ti-woocommerce-wishlist' ), strip_tags( get_the_title( $product_id ) ) );
|
287 |
}
|
288 |
$titles = array_filter( $titles );
|
289 |
wc_add_notice( sprintf( _n( 'Product %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', 'Products: %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', count( $titles ), 'ti-woocommerce-wishlist' ), wc_format_list_of_items( $titles ) ), 'error' );
|
387 |
if ( ! empty( $errors ) ) {
|
388 |
$titles = array();
|
389 |
foreach ( $errors as $product_id ) {
|
390 |
+
$titles[] = sprintf( _x( '“%s”', 'Item name in quotes', 'ti-woocommerce-wishlist' ), strip_tags( get_the_title( $product_id ) ) );
|
391 |
}
|
392 |
$titles = array_filter( $titles );
|
393 |
wc_add_notice( sprintf( _n( 'Product %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', 'Products: %s could not be added to cart because some options are not specified. Please, select some product options before adding the products to your cart.', count( $titles ), 'ti-woocommerce-wishlist' ), wc_format_list_of_items( $titles ) ), 'error' );
|
418 |
}
|
419 |
$wlp = null;
|
420 |
if ( 0 === $wishlist['ID'] ) {
|
421 |
+
$wlp = TInvWL_Product_Local::instance( self::$_name );
|
422 |
} else {
|
423 |
+
$wlp = new TInvWL_Product( $wishlist, self::$_name );
|
424 |
}
|
425 |
if ( empty( $wlp ) ) {
|
426 |
return false;
|
public/wishlist/view.class.php
CHANGED
@@ -21,7 +21,7 @@ class TInvWL_Public_Wishlist_View {
|
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
-
private $
|
25 |
|
26 |
/**
|
27 |
* List per page
|
@@ -64,7 +64,7 @@ class TInvWL_Public_Wishlist_View {
|
|
64 |
* @param string $plugin_name Plugin name.
|
65 |
*/
|
66 |
function __construct( $plugin_name ) {
|
67 |
-
$this->
|
68 |
$this->define_hooks();
|
69 |
}
|
70 |
|
@@ -78,11 +78,12 @@ class TInvWL_Public_Wishlist_View {
|
|
78 |
|
79 |
add_action( 'tinvwl_after_wishlist', array( 'TInvWL_Public_Wishlist_Social', 'init' ) );
|
80 |
|
81 |
-
|
82 |
add_filter( 'tinvwl_wishlist_item_add_to_cart', array( $this, 'external_text' ), 10, 3 );
|
|
|
83 |
add_action( 'tinvwl_after_wishlist_table', array( $this, 'get_per_page' ) );
|
84 |
|
85 |
-
TInvWL_Public_Wishlist_Buttons::init( $this->
|
86 |
}
|
87 |
|
88 |
/**
|
@@ -102,6 +103,24 @@ class TInvWL_Public_Wishlist_View {
|
|
102 |
return $text;
|
103 |
}
|
104 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
/**
|
106 |
* Get current wishlist
|
107 |
*
|
@@ -274,7 +293,7 @@ class TInvWL_Public_Wishlist_View {
|
|
274 |
return false;
|
275 |
}
|
276 |
$title = sprintf( __( '“%s”', 'ti-woocommerce-wishlist' ), $product_data['data']->get_title() );
|
277 |
-
if ( $wlp->remove($product_data ) ) {
|
278 |
wc_add_notice( sprintf( __( '%s has been removed from wishlist.', 'ti-woocommerce-wishlist' ), $title ) );
|
279 |
} else {
|
280 |
wc_add_notice( sprintf( __( '%s has not been removed from wishlist.', 'ti-woocommerce-wishlist' ), $title ), 'error' );
|
21 |
*
|
22 |
* @var string
|
23 |
*/
|
24 |
+
private $_name;
|
25 |
|
26 |
/**
|
27 |
* List per page
|
64 |
* @param string $plugin_name Plugin name.
|
65 |
*/
|
66 |
function __construct( $plugin_name ) {
|
67 |
+
$this->_name = $plugin_name;
|
68 |
$this->define_hooks();
|
69 |
}
|
70 |
|
78 |
|
79 |
add_action( 'tinvwl_after_wishlist', array( 'TInvWL_Public_Wishlist_Social', 'init' ) );
|
80 |
|
81 |
+
add_filter( 'tinvwl_wishlist_item_action_add_to_cart', array( $this, 'product_allow_add_to_cart' ), 10, 3 );
|
82 |
add_filter( 'tinvwl_wishlist_item_add_to_cart', array( $this, 'external_text' ), 10, 3 );
|
83 |
+
add_filter( 'tinvwl_wishlist_item_add_to_cart', array( $this, 'variable_text' ), 10, 3 );
|
84 |
add_action( 'tinvwl_after_wishlist_table', array( $this, 'get_per_page' ) );
|
85 |
|
86 |
+
TInvWL_Public_Wishlist_Buttons::init( $this->_name );
|
87 |
}
|
88 |
|
89 |
/**
|
103 |
return $text;
|
104 |
}
|
105 |
|
106 |
+
/**
|
107 |
+
* Change Text for variable product that requires to select some variations.
|
108 |
+
*
|
109 |
+
* @param string $text Text for button add to cart.
|
110 |
+
* @param array $wl_product Wishlist Product.
|
111 |
+
* @param object $product Product.
|
112 |
+
*
|
113 |
+
* @return string
|
114 |
+
*/
|
115 |
+
function variable_text( $text, $wl_product, $product ) {
|
116 |
+
if ( apply_filters( 'tinvwl_product_add_to_cart_need_redirect', false, $product, $product->get_permalink(), $wl_product )
|
117 |
+
&& 'variable' === ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->product_type : $product->get_type() ) ) {
|
118 |
+
return $product->add_to_cart_text();
|
119 |
+
}
|
120 |
+
|
121 |
+
return $text;
|
122 |
+
}
|
123 |
+
|
124 |
/**
|
125 |
* Get current wishlist
|
126 |
*
|
293 |
return false;
|
294 |
}
|
295 |
$title = sprintf( __( '“%s”', 'ti-woocommerce-wishlist' ), $product_data['data']->get_title() );
|
296 |
+
if ( $wlp->remove( $product_data ) ) {
|
297 |
wc_add_notice( sprintf( __( '%s has been removed from wishlist.', 'ti-woocommerce-wishlist' ), $title ) );
|
298 |
} else {
|
299 |
wc_add_notice( sprintf( __( '%s has not been removed from wishlist.', 'ti-woocommerce-wishlist' ), $title ), 'error' );
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Donate link: https://templateinvaders.com/?utm_source=wordpressorg&utm_content=d
|
|
4 |
Tags: wishlist, woocommerce, woocommerce wishlist, e-commerce, ecommerce
|
5 |
Requires at least: 4.5
|
6 |
Tested up to: 4.9
|
7 |
-
Stable tag: 1.8.
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
@@ -131,6 +131,13 @@ If you get stuck, you can ask for help in the [Plugin Forum](https://wordpress.o
|
|
131 |
|
132 |
== Changelog ==
|
133 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
= 1.8.3 =
|
135 |
*Release Date - 04 July 2018*
|
136 |
|
4 |
Tags: wishlist, woocommerce, woocommerce wishlist, e-commerce, ecommerce
|
5 |
Requires at least: 4.5
|
6 |
Tested up to: 4.9
|
7 |
+
Stable tag: 1.8.4
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
131 |
|
132 |
== Changelog ==
|
133 |
|
134 |
+
= 1.8.4 =
|
135 |
+
*Release Date - 10 July 2018*
|
136 |
+
|
137 |
+
* Fixed above thumbnail hook priority on a product listing page
|
138 |
+
* Fixed an issue when "Add to Cart" button displayed for products without selected variations in a Wishlist table
|
139 |
+
* Added a notice with instructions if Setup Wizard was skipped
|
140 |
+
|
141 |
= 1.8.3 =
|
142 |
*Release Date - 04 July 2018*
|
143 |
|
ti-woocommerce-wishlist.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
* Plugin Name: WooCommerce Wishlist Plugin
|
5 |
* Plugin URI: https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
6 |
* Description: Wishlist functionality for your WooCommerce store.
|
7 |
-
* Version: 1.8.
|
8 |
* Requires at least: 4.5
|
9 |
* Tested up to: 4.9
|
10 |
* WC requires at least: 2.6
|
@@ -41,7 +41,7 @@ if ( ! defined( 'TINVWL_DOMAIN' ) ) {
|
|
41 |
}
|
42 |
|
43 |
if ( ! defined( 'TINVWL_FVERSION' ) ) {
|
44 |
-
define( 'TINVWL_FVERSION', '1.8.
|
45 |
}
|
46 |
|
47 |
if ( ! defined( 'TINVWL_LOAD_FREE' ) ) {
|
4 |
* Plugin Name: WooCommerce Wishlist Plugin
|
5 |
* Plugin URI: https://wordpress.org/plugins/ti-woocommerce-wishlist/
|
6 |
* Description: Wishlist functionality for your WooCommerce store.
|
7 |
+
* Version: 1.8.4
|
8 |
* Requires at least: 4.5
|
9 |
* Tested up to: 4.9
|
10 |
* WC requires at least: 2.6
|
41 |
}
|
42 |
|
43 |
if ( ! defined( 'TINVWL_FVERSION' ) ) {
|
44 |
+
define( 'TINVWL_FVERSION', '1.8.4' );
|
45 |
}
|
46 |
|
47 |
if ( ! defined( 'TINVWL_LOAD_FREE' ) ) {
|
tinv-wishlists-function-integration.php
CHANGED
@@ -146,7 +146,7 @@ if ( ! function_exists( 'gf_productaddon_support' ) ) {
|
|
146 |
function gf_productaddon_text_button( $text_add_to_cart, $wl_product, $product ) {
|
147 |
$gravity_form_data = get_post_meta( ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->id : ( $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id() ) ), '_gravity_form_data', true );
|
148 |
|
149 |
-
return ( $gravity_form_data ) ? __( 'Select options', 'woocommerce' ) : $text_add_to_cart;
|
150 |
}
|
151 |
|
152 |
add_filter( 'tinvwl_wishlist_item_add_to_cart', 'gf_productaddon_text_button', 10, 3 );
|
@@ -302,7 +302,7 @@ if ( ! function_exists( 'tinvwl_wpml_addtowishlist_out_prepare_product' ) ) {
|
|
302 |
// Reload products class.
|
303 |
$woocommerce_wpml->products = new WCML_Products( $woocommerce_wpml, $sitepress, $wpdb );
|
304 |
|
305 |
-
$product_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->
|
306 |
$variation_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->variation_id : ( $product->is_type( 'variation' ) ? $product->get_id() : 0 );
|
307 |
|
308 |
if ( ! empty( $product_id ) ) {
|
@@ -459,19 +459,19 @@ if ( ! function_exists( 'tinv_wishlist_meta_support_rpgiftcards' ) ) {
|
|
459 |
foreach ( $meta as $key => $data ) {
|
460 |
switch ( $data['key'] ) {
|
461 |
case 'rpgc_note':
|
462 |
-
$meta[ $key ]['key'] = __( 'Note', '
|
463 |
break;
|
464 |
case 'rpgc_to':
|
465 |
-
$meta[ $key ]['key'] = ( get_option( 'woocommerce_giftcard_to' ) <> null ? get_option( 'woocommerce_giftcard_to' ) : __( 'To', '
|
466 |
break;
|
467 |
case 'rpgc_to_email':
|
468 |
-
$meta[ $key ]['key'] = ( get_option( 'woocommerce_giftcard_toEmail' ) <> null ? get_option( 'woocommerce_giftcard_toEmail' ) : __( 'To Email', '
|
469 |
break;
|
470 |
case 'rpgc_address':
|
471 |
-
$meta[ $key ]['key'] = ( get_option( 'woocommerce_giftcard_address' ) <> null ? get_option( 'woocommerce_giftcard_address' ) : __( 'Address', '
|
472 |
break;
|
473 |
case 'rpgc_reload_card':
|
474 |
-
$meta[ $key ]['key'] = __( 'Reload existing Gift Card', '
|
475 |
break;
|
476 |
case 'rpgc_description':
|
477 |
case 'rpgc_reload_check':
|
@@ -1202,7 +1202,7 @@ if ( ! function_exists( 'tinvwl_item_status_yith_woocommerce_product_bundles' )
|
|
1202 |
if ( ! $response ) {
|
1203 |
$availability = array(
|
1204 |
'class' => 'out-of-stock',
|
1205 |
-
'availability' => __( 'Out of stock', 'woocommerce' ),
|
1206 |
);
|
1207 |
$availability_html = '<p class="stock ' . esc_attr( $availability['class'] ) . '"><span><i class="ftinvwl ftinvwl-times"></i></span><span>' . esc_html( $availability['availability'] ) . '</span></p>';
|
1208 |
}
|
@@ -1608,7 +1608,7 @@ if ( ! function_exists( 'tinv_wishlist_item_meta_yith_woocommerce_product_add_on
|
|
1608 |
$price_html = wc_price( $price );
|
1609 |
|
1610 |
$item_data[] = array(
|
1611 |
-
'key' => __( 'Base price', '
|
1612 |
'display' => $price_html,
|
1613 |
);
|
1614 |
|
@@ -1876,3 +1876,16 @@ if ( ! function_exists( 'tinvwl_item_price_woocommerce_product_addons' ) ) {
|
|
1876 |
|
1877 |
add_filter( 'tinvwl_wishlist_item_price', 'tinvwl_item_price_woocommerce_product_addons', 10, 3 );
|
1878 |
} // End if().
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
function gf_productaddon_text_button( $text_add_to_cart, $wl_product, $product ) {
|
147 |
$gravity_form_data = get_post_meta( ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->id : ( $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id() ) ), '_gravity_form_data', true );
|
148 |
|
149 |
+
return ( $gravity_form_data ) ? __( 'Select options', 'ti-woocommerce-wishlist' ) : $text_add_to_cart;
|
150 |
}
|
151 |
|
152 |
add_filter( 'tinvwl_wishlist_item_add_to_cart', 'gf_productaddon_text_button', 10, 3 );
|
302 |
// Reload products class.
|
303 |
$woocommerce_wpml->products = new WCML_Products( $woocommerce_wpml, $sitepress, $wpdb );
|
304 |
|
305 |
+
$product_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->get_id() : ( $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id() );
|
306 |
$variation_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->variation_id : ( $product->is_type( 'variation' ) ? $product->get_id() : 0 );
|
307 |
|
308 |
if ( ! empty( $product_id ) ) {
|
459 |
foreach ( $meta as $key => $data ) {
|
460 |
switch ( $data['key'] ) {
|
461 |
case 'rpgc_note':
|
462 |
+
$meta[ $key ]['key'] = __( 'Note', 'ti-woocommerce-wishlist' );
|
463 |
break;
|
464 |
case 'rpgc_to':
|
465 |
+
$meta[ $key ]['key'] = ( get_option( 'woocommerce_giftcard_to' ) <> null ? get_option( 'woocommerce_giftcard_to' ) : __( 'To', 'ti-woocommerce-wishlist' ) ); // WPCS: loose comparison ok.
|
466 |
break;
|
467 |
case 'rpgc_to_email':
|
468 |
+
$meta[ $key ]['key'] = ( get_option( 'woocommerce_giftcard_toEmail' ) <> null ? get_option( 'woocommerce_giftcard_toEmail' ) : __( 'To Email', 'ti-woocommerce-wishlist' ) ); // WPCS: loose comparison ok.
|
469 |
break;
|
470 |
case 'rpgc_address':
|
471 |
+
$meta[ $key ]['key'] = ( get_option( 'woocommerce_giftcard_address' ) <> null ? get_option( 'woocommerce_giftcard_address' ) : __( 'Address', 'ti-woocommerce-wishlist' ) ); // WPCS: loose comparison ok.
|
472 |
break;
|
473 |
case 'rpgc_reload_card':
|
474 |
+
$meta[ $key ]['key'] = __( 'Reload existing Gift Card', 'ti-woocommerce-wishlist' );
|
475 |
break;
|
476 |
case 'rpgc_description':
|
477 |
case 'rpgc_reload_check':
|
1202 |
if ( ! $response ) {
|
1203 |
$availability = array(
|
1204 |
'class' => 'out-of-stock',
|
1205 |
+
'availability' => __( 'Out of stock', 'ti-woocommerce-wishlist' ),
|
1206 |
);
|
1207 |
$availability_html = '<p class="stock ' . esc_attr( $availability['class'] ) . '"><span><i class="ftinvwl ftinvwl-times"></i></span><span>' . esc_html( $availability['availability'] ) . '</span></p>';
|
1208 |
}
|
1608 |
$price_html = wc_price( $price );
|
1609 |
|
1610 |
$item_data[] = array(
|
1611 |
+
'key' => __( 'Base price', 'ti-woocommerce-wishlist' ),
|
1612 |
'display' => $price_html,
|
1613 |
);
|
1614 |
|
1876 |
|
1877 |
add_filter( 'tinvwl_wishlist_item_price', 'tinvwl_item_price_woocommerce_product_addons', 10, 3 );
|
1878 |
} // End if().
|
1879 |
+
|
1880 |
+
|
1881 |
+
// OceanWP theme compatibility;
|
1882 |
+
if ( ! function_exists( 'oceanwp_fix_archive_markup' ) ) {
|
1883 |
+
add_action( 'init', 'oceanwp_fix_archive_markup' );
|
1884 |
+
|
1885 |
+
function oceanwp_fix_archive_markup() {
|
1886 |
+
if ( class_exists( 'OceanWP_WooCommerce_Config' ) && 'above_thumb' === tinv_get_option( 'add_to_wishlist_catalog', 'position' ) ) {
|
1887 |
+
remove_action( 'woocommerce_before_shop_loop_item', 'tinvwl_view_addto_htmlloop', 9 );
|
1888 |
+
add_action( 'woocommerce_before_shop_loop_item', 'tinvwl_view_addto_htmlloop', 10 );
|
1889 |
+
}
|
1890 |
+
}
|
1891 |
+
}
|
views/admin/templates-status.php
CHANGED
@@ -13,7 +13,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
13 |
<table class="wc_status_table widefat" cellspacing="0">
|
14 |
<thead>
|
15 |
<tr>
|
16 |
-
<th colspan="3" data-export-label="<?php esc_html_e( 'TI WooCommerce Wishlist Templates', 'ti-woocommerce-wishlist' ); ?>"><h2><?php esc_html_e( 'TI WooCommerce Wishlist Templates', 'ti-woocommerce-wishlist' ); ?><?php echo wc_help_tip( __( 'This section shows the files that are overriding the default TI WooCommerce Wishlist templates.', 'woocommerce' ) ); // WPCS: xss ok. ?></h2></th>
|
17 |
</tr>
|
18 |
</thead>
|
19 |
<tbody>
|
13 |
<table class="wc_status_table widefat" cellspacing="0">
|
14 |
<thead>
|
15 |
<tr>
|
16 |
+
<th colspan="3" data-export-label="<?php esc_html_e( 'TI WooCommerce Wishlist Templates', 'ti-woocommerce-wishlist' ); ?>"><h2><?php esc_html_e( 'TI WooCommerce Wishlist Templates', 'ti-woocommerce-wishlist' ); ?><?php echo wc_help_tip( __( 'This section shows the files that are overriding the default TI WooCommerce Wishlist templates.', 'ti-woocommerce-wishlist' ) ); // WPCS: xss ok. ?></h2></th>
|
17 |
</tr>
|
18 |
</thead>
|
19 |
<tbody>
|
views/general.php
CHANGED
@@ -1,19 +1,19 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The Template for displaying admin page this plugin.
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist\Admin\Template
|
7 |
-
*/
|
8 |
-
|
9 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
-
exit; // Exit if accessed directly.
|
11 |
-
}
|
12 |
-
|
13 |
-
do_action( 'tinvwl_view_header', $_header );
|
14 |
-
?>
|
15 |
-
<div class="wrap" style="margin-left: 58px;margin-bottom: -40px;"></div>
|
16 |
-
<div class="<?php echo esc_attr( sprintf( '%s-content', self::$
|
17 |
-
<?php self::view( $_template_name, $_data ); ?>
|
18 |
-
</div>
|
19 |
-
<?php do_action( 'tinvwl_view_footer', $_footer ); ?>
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The Template for displaying admin page this plugin.
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist\Admin\Template
|
7 |
+
*/
|
8 |
+
|
9 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
+
exit; // Exit if accessed directly.
|
11 |
+
}
|
12 |
+
|
13 |
+
do_action( 'tinvwl_view_header', $_header );
|
14 |
+
?>
|
15 |
+
<div class="wrap" style="margin-left: 58px;margin-bottom: -40px;"></div>
|
16 |
+
<div class="<?php echo esc_attr( sprintf( '%s-content', self::$_name ) ); ?>">
|
17 |
+
<?php self::view( $_template_name, $_data ); ?>
|
18 |
+
</div>
|
19 |
+
<?php do_action( 'tinvwl_view_footer', $_footer ); ?>
|
views/header.php
CHANGED
@@ -1,44 +1,44 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The Template for displaying admin header this plugin.
|
4 |
-
*
|
5 |
-
* @since 1.0.0
|
6 |
-
* @package TInvWishlist\Admin\Template
|
7 |
-
*/
|
8 |
-
|
9 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
-
exit; // Exit if accessed directly.
|
11 |
-
}
|
12 |
-
|
13 |
-
?>
|
14 |
-
<div class="<?php echo esc_attr( sprintf( '%s-header', self::$
|
15 |
-
<div class="row">
|
16 |
-
<div class="col-lg-7">
|
17 |
-
<div class="tinwl-logo-title">
|
18 |
-
<div class="tinvwl-table auto-width">
|
19 |
-
<div class="tinwl-logo tinvwl-cell-3">
|
20 |
-
<div class="tinvwl-table">
|
21 |
-
<div class="tinvwl-cell">
|
22 |
-
<i class="logo_heart"></i>
|
23 |
-
</div>
|
24 |
-
<div class="tinvwl-cell">
|
25 |
-
<h2>Wishlist</h2>
|
26 |
-
</div>
|
27 |
-
</div>
|
28 |
-
</div>
|
29 |
-
<div class="tinvwl-cell">
|
30 |
-
<h1 class="tinvwl-title"><?php echo esc_html( $_name ); ?></h1>
|
31 |
-
</div>
|
32 |
-
</div>
|
33 |
-
</div>
|
34 |
-
</div>
|
35 |
-
<div class="col-lg-5">
|
36 |
-
<div class="tinvwl-status-panel status-panel"><?php
|
37 |
-
foreach ( $status_panel as $item ) {
|
38 |
-
echo $item; // WPCS: xss ok.
|
39 |
-
}
|
40 |
-
?></div>
|
41 |
-
</div>
|
42 |
-
</div>
|
43 |
-
|
44 |
-
</div>
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The Template for displaying admin header this plugin.
|
4 |
+
*
|
5 |
+
* @since 1.0.0
|
6 |
+
* @package TInvWishlist\Admin\Template
|
7 |
+
*/
|
8 |
+
|
9 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
+
exit; // Exit if accessed directly.
|
11 |
+
}
|
12 |
+
|
13 |
+
?>
|
14 |
+
<div class="<?php echo esc_attr( sprintf( '%s-header', self::$_name ) ); ?> tinv-wishlist-clearfix">
|
15 |
+
<div class="row">
|
16 |
+
<div class="col-lg-7">
|
17 |
+
<div class="tinwl-logo-title">
|
18 |
+
<div class="tinvwl-table auto-width">
|
19 |
+
<div class="tinwl-logo tinvwl-cell-3">
|
20 |
+
<div class="tinvwl-table">
|
21 |
+
<div class="tinvwl-cell">
|
22 |
+
<i class="logo_heart"></i>
|
23 |
+
</div>
|
24 |
+
<div class="tinvwl-cell">
|
25 |
+
<h2>Wishlist</h2>
|
26 |
+
</div>
|
27 |
+
</div>
|
28 |
+
</div>
|
29 |
+
<div class="tinvwl-cell">
|
30 |
+
<h1 class="tinvwl-title"><?php echo esc_html( $_name ); ?></h1>
|
31 |
+
</div>
|
32 |
+
</div>
|
33 |
+
</div>
|
34 |
+
</div>
|
35 |
+
<div class="col-lg-5">
|
36 |
+
<div class="tinvwl-status-panel status-panel"><?php
|
37 |
+
foreach ( $status_panel as $item ) {
|
38 |
+
echo $item; // WPCS: xss ok.
|
39 |
+
}
|
40 |
+
?></div>
|
41 |
+
</div>
|
42 |
+
</div>
|
43 |
+
|
44 |
+
</div>
|