FEEDZY RSS Feeds Lite - Version 3.2.1

Version Description

  • 2017-10-12
Download this release

Release Info

Developer codeinwp
Plugin Icon 128x128 FEEDZY RSS Feeds Lite
Version 3.2.1
Comparing to
See all releases

Code changes from version 3.2.0 to 3.2.1

CHANGELOG.md CHANGED
@@ -1,7 +1,10 @@
1
 
2
- ### v3.2.0 - 2017-08-17
3
  **Changes:**
4
-
 
 
 
5
  ### v3.2.0 - 2017-08-17
6
  **Changes:**
7
  * Fix for image URL issue following some strange patterns.
1
 
2
+ ### v3.2.1 - 2017-10-12
3
  **Changes:**
4
+ * Adds global settings page.
5
+ * Adds User Agent and Proxy settings.
6
+ * Fix for some edge cases regarding images in the feed.
7
+
8
  ### v3.2.0 - 2017-08-17
9
  **Changes:**
10
  * Fix for image URL issue following some strange patterns.
css/feedzy-rss-feeds.css CHANGED
@@ -2,7 +2,7 @@
2
  * feedzy-rss-feeds.css
3
  * Feedzy RSS Feed
4
  * Copyright: (c) 2016 Themeisle, themeisle.com
5
- * Version: 3.2.0
6
  * Plugin Name: FEEDZY RSS Feeds
7
  * Plugin URI: http://themeisle.com/plugins/feedzy-rss-feeds/
8
  * Author: Themeisle
@@ -223,7 +223,6 @@ i.mce-i-feedzy-icon {
223
  }
224
 
225
  .feedzy-rss .feedzy-style1 .rss_item:hover .rss_image a {
226
- -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.25);
227
  box-shadow: 0 0 10px rgba(0,0,0,0.25);
228
  }
229
 
@@ -476,7 +475,6 @@ input:checked + .feedzy-track {
476
  }
477
 
478
  input:focus + .feedzy-track {
479
- -webkit-box-shadow: 0 0 1px #0085ba;
480
  box-shadow: 0 0 1px #0085ba;
481
  }
482
 
2
  * feedzy-rss-feeds.css
3
  * Feedzy RSS Feed
4
  * Copyright: (c) 2016 Themeisle, themeisle.com
5
+ * Version: 3.2.1
6
  * Plugin Name: FEEDZY RSS Feeds
7
  * Plugin URI: http://themeisle.com/plugins/feedzy-rss-feeds/
8
  * Author: Themeisle
223
  }
224
 
225
  .feedzy-rss .feedzy-style1 .rss_item:hover .rss_image a {
 
226
  box-shadow: 0 0 10px rgba(0,0,0,0.25);
227
  }
228
 
475
  }
476
 
477
  input:focus + .feedzy-track {
 
478
  box-shadow: 0 0 1px #0085ba;
479
  }
480
 
css/form.css CHANGED
@@ -4,7 +4,6 @@
4
  */
5
 
6
  html {
7
- -webkit-box-sizing: border-box;
8
  box-sizing: border-box;
9
  font-size: 62.5%;
10
  }
@@ -21,7 +20,6 @@ body {
21
  *,
22
  *:after,
23
  *:before {
24
- -webkit-box-sizing: inherit;
25
  box-sizing: inherit;
26
  }
27
 
@@ -178,7 +176,6 @@ input[type="text"],
178
  input[type="url"],
179
  textarea,
180
  select {
181
- -webkit-box-sizing: inherit;
182
  box-sizing: inherit;
183
  width: 100%;
184
  height: 3.8rem;
@@ -186,7 +183,6 @@ select {
186
  border: 0.1rem solid #d1d1d1;
187
  border-radius: 0.4rem;
188
  background-color: transparent;
189
- -webkit-box-shadow: none;
190
  box-shadow: none;
191
 
192
  -webkit-appearance: none;
4
  */
5
 
6
  html {
 
7
  box-sizing: border-box;
8
  font-size: 62.5%;
9
  }
20
  *,
21
  *:after,
22
  *:before {
 
23
  box-sizing: inherit;
24
  }
25
 
176
  input[type="url"],
177
  textarea,
178
  select {
 
179
  box-sizing: inherit;
180
  width: 100%;
181
  height: 3.8rem;
183
  border: 0.1rem solid #d1d1d1;
184
  border-radius: 0.4rem;
185
  background-color: transparent;
 
186
  box-shadow: none;
187
 
188
  -webkit-appearance: none;
css/metabox-settings.css ADDED
@@ -0,0 +1,2047 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * import-metabox-edit.css
3
+ *
4
+ * @since 1.2.0
5
+ * @package feedzy-rss-feeds-pro
6
+ */
7
+ .fz-form-control {
8
+ display: block;
9
+ width: 100%;
10
+ height: 34px;
11
+ padding: 6px 12px;
12
+ border: 1px solid #ccc;
13
+ border-radius: 4px;
14
+ color: #555;
15
+ background-color: #fff;
16
+ background-image: none;
17
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
18
+ font-size: 14px;
19
+ line-height: 1.42857143;
20
+ -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
21
+ -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
22
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
23
+ }
24
+
25
+ .fz-form-control:focus {
26
+ border-color: #66afe9;
27
+ outline: 0;
28
+ box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgba(102, 175, 233, 0.6);
29
+ }
30
+
31
+ .fz-form-control::-moz-placeholder {
32
+ opacity: 1;
33
+ color: #999;
34
+ }
35
+
36
+ .fz-form-control:-ms-input-placeholder {
37
+ color: #999;
38
+ }
39
+
40
+ .fz-form-control::-webkit-input-placeholder {
41
+ color: #999;
42
+ }
43
+
44
+ .fz-form-control::-ms-expand {
45
+ border: 0;
46
+ background-color: transparent;
47
+ }
48
+
49
+ .fz-form-control[disabled],
50
+ .fz-form-control[readonly],
51
+ fieldset[disabled] .fz-form-control {
52
+ opacity: 1;
53
+ background-color: #eee;
54
+ }
55
+
56
+ .fz-form-control[disabled],
57
+ fieldset[disabled] .fz-form-control {
58
+ cursor: not-allowed;
59
+ }
60
+
61
+ textarea.fz-form-control {
62
+ height: auto;
63
+ }
64
+
65
+ input[type="search"] {
66
+ -webkit-appearance: none;
67
+ }
68
+
69
+ @media screen and (-webkit-min-device-pixel-ratio: 0) {
70
+ input[type="date"].fz-form-control,
71
+ input[type="time"].fz-form-control,
72
+ input[type="datetime-local"].fz-form-control,
73
+ input[type="month"].fz-form-control {
74
+ line-height: 34px;
75
+ }
76
+
77
+ input[type="date"].input-sm,
78
+ input[type="time"].input-sm,
79
+ input[type="datetime-local"].input-sm,
80
+ input[type="month"].input-sm,
81
+ .fz-input-group-sm input[type="date"],
82
+ .fz-input-group-sm input[type="time"],
83
+ .fz-input-group-sm input[type="datetime-local"],
84
+ .fz-input-group-sm input[type="month"] {
85
+ line-height: 30px;
86
+ }
87
+
88
+ input[type="date"].input-lg,
89
+ input[type="time"].input-lg,
90
+ input[type="datetime-local"].input-lg,
91
+ input[type="month"].input-lg,
92
+ .fz-input-group-lg input[type="date"],
93
+ .fz-input-group-lg input[type="time"],
94
+ .fz-input-group-lg input[type="datetime-local"],
95
+ .fz-input-group-lg input[type="month"] {
96
+ line-height: 46px;
97
+ }
98
+ }
99
+
100
+ .fz-form-group {
101
+ margin-bottom: 15px;
102
+ }
103
+
104
+ .radio,
105
+ .checkbox {
106
+ display: block;
107
+ position: relative;
108
+ margin-top: 10px;
109
+ margin-bottom: 10px;
110
+ }
111
+
112
+ .radio label,
113
+ .checkbox label {
114
+ min-height: 20px;
115
+ margin-bottom: 0;
116
+ padding-left: 20px;
117
+ font-weight: normal;
118
+ cursor: pointer;
119
+ }
120
+
121
+ .radio input[type="radio"],
122
+ .radio-inline input[type="radio"],
123
+ .checkbox input[type="checkbox"],
124
+ .checkbox-inline input[type="checkbox"] {
125
+ position: absolute;
126
+ margin-top: 4px \9;
127
+ margin-left: -20px;
128
+ }
129
+
130
+ .radio + .radio,
131
+ .checkbox + .checkbox {
132
+ margin-top: -5px;
133
+ }
134
+
135
+ .radio-inline,
136
+ .checkbox-inline {
137
+ display: inline-block;
138
+ position: relative;
139
+ margin-bottom: 0;
140
+ padding-left: 20px;
141
+ font-weight: normal;
142
+ vertical-align: middle;
143
+ cursor: pointer;
144
+ }
145
+
146
+ .radio-inline + .radio-inline,
147
+ .checkbox-inline + .checkbox-inline {
148
+ margin-top: 0;
149
+ margin-left: 10px;
150
+ }
151
+
152
+ input[type="radio"][disabled],
153
+ input[type="checkbox"][disabled],
154
+ input[type="radio"].disabled,
155
+ input[type="checkbox"].disabled,
156
+ fieldset[disabled] input[type="radio"],
157
+ fieldset[disabled] input[type="checkbox"] {
158
+ cursor: not-allowed;
159
+ }
160
+
161
+ .radio-inline.disabled,
162
+ .checkbox-inline.disabled,
163
+ fieldset[disabled] .radio-inline,
164
+ fieldset[disabled] .checkbox-inline {
165
+ cursor: not-allowed;
166
+ }
167
+
168
+ .radio.disabled label,
169
+ .checkbox.disabled label,
170
+ fieldset[disabled] .radio label,
171
+ fieldset[disabled] .checkbox label {
172
+ cursor: not-allowed;
173
+ }
174
+
175
+ .fz-form-control-static {
176
+ min-height: 34px;
177
+ margin-bottom: 0;
178
+ padding-top: 7px;
179
+ padding-bottom: 7px;
180
+ }
181
+
182
+ .fz-form-control-static.input-lg,
183
+ .fz-form-control-static.input-sm {
184
+ padding-right: 0;
185
+ padding-left: 0;
186
+ }
187
+
188
+ .input-sm {
189
+ height: 30px;
190
+ padding: 5px 10px;
191
+ border-radius: 3px;
192
+ font-size: 12px;
193
+ line-height: 1.5;
194
+ }
195
+
196
+ select.input-sm {
197
+ height: 30px;
198
+ line-height: 30px;
199
+ }
200
+
201
+ textarea.input-sm,
202
+ select[multiple].input-sm {
203
+ height: auto;
204
+ }
205
+
206
+ .fz-form-group-sm .fz-form-control {
207
+ height: 30px;
208
+ padding: 5px 10px;
209
+ border-radius: 3px;
210
+ font-size: 12px;
211
+ line-height: 1.5;
212
+ }
213
+
214
+ .fz-form-group-sm select.fz-form-control {
215
+ height: 30px;
216
+ line-height: 30px;
217
+ }
218
+
219
+ .fz-form-group-sm textarea.fz-form-control,
220
+ .fz-form-group-sm select[multiple].fz-form-control {
221
+ height: auto;
222
+ }
223
+
224
+ .fz-form-group-sm .fz-form-control-static {
225
+ height: 30px;
226
+ min-height: 32px;
227
+ padding: 6px 10px;
228
+ font-size: 12px;
229
+ line-height: 1.5;
230
+ }
231
+
232
+ .input-lg {
233
+ height: 46px;
234
+ padding: 10px 16px;
235
+ border-radius: 6px;
236
+ font-size: 18px;
237
+ line-height: 1.3333333;
238
+ }
239
+
240
+ select.input-lg {
241
+ height: 46px;
242
+ line-height: 46px;
243
+ }
244
+
245
+ textarea.input-lg,
246
+ select[multiple].input-lg {
247
+ height: auto;
248
+ }
249
+
250
+ .fz-form-group-lg .fz-form-control {
251
+ height: 46px;
252
+ padding: 10px 16px;
253
+ border-radius: 6px;
254
+ font-size: 18px;
255
+ line-height: 1.3333333;
256
+ }
257
+
258
+ .fz-form-group-lg select.fz-form-control {
259
+ height: 46px;
260
+ line-height: 46px;
261
+ }
262
+
263
+ .fz-form-group-lg textarea.fz-form-control,
264
+ .fz-form-group-lg select[multiple].fz-form-control {
265
+ height: auto;
266
+ }
267
+
268
+ .fz-form-group-lg .fz-form-control-static {
269
+ height: 46px;
270
+ min-height: 38px;
271
+ padding: 11px 16px;
272
+ font-size: 18px;
273
+ line-height: 1.3333333;
274
+ }
275
+
276
+ .has-feedback {
277
+ position: relative;
278
+ }
279
+
280
+ .has-feedback .fz-form-control {
281
+ padding-right: 42.5px;
282
+ }
283
+
284
+ .fz-form-control-feedback {
285
+ display: block;
286
+ position: absolute;
287
+ z-index: 2;
288
+ top: 0;
289
+ right: 0;
290
+ width: 34px;
291
+ height: 34px;
292
+ line-height: 34px;
293
+ text-align: center;
294
+ pointer-events: none;
295
+ }
296
+
297
+ .input-lg + .fz-form-control-feedback,
298
+ .fz-input-group-lg + .fz-form-control-feedback,
299
+ .fz-form-group-lg .fz-form-control + .fz-form-control-feedback {
300
+ width: 46px;
301
+ height: 46px;
302
+ line-height: 46px;
303
+ }
304
+
305
+ .input-sm + .fz-form-control-feedback,
306
+ .fz-input-group-sm + .fz-form-control-feedback,
307
+ .fz-form-group-sm .fz-form-control + .fz-form-control-feedback {
308
+ width: 30px;
309
+ height: 30px;
310
+ line-height: 30px;
311
+ }
312
+
313
+ .has-success .help-block,
314
+ .has-success .control-label,
315
+ .has-success .radio,
316
+ .has-success .checkbox,
317
+ .has-success .radio-inline,
318
+ .has-success .checkbox-inline,
319
+ .has-success.radio label,
320
+ .has-success.checkbox label,
321
+ .has-success.radio-inline label,
322
+ .has-success.checkbox-inline label {
323
+ color: #3c763d;
324
+ }
325
+
326
+ .has-success .fz-form-control {
327
+ border-color: #3c763d;
328
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
329
+ }
330
+
331
+ .has-success .fz-form-control:focus {
332
+ border-color: #2b542c;
333
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
334
+ }
335
+
336
+ .has-success .fz-input-group-addon {
337
+ border-color: #3c763d;
338
+ color: #3c763d;
339
+ background-color: #dff0d8;
340
+ }
341
+
342
+ .has-success .fz-form-control-feedback {
343
+ color: #3c763d;
344
+ }
345
+
346
+ .has-warning .help-block,
347
+ .has-warning .control-label,
348
+ .has-warning .radio,
349
+ .has-warning .checkbox,
350
+ .has-warning .radio-inline,
351
+ .has-warning .checkbox-inline,
352
+ .has-warning.radio label,
353
+ .has-warning.checkbox label,
354
+ .has-warning.radio-inline label,
355
+ .has-warning.checkbox-inline label {
356
+ color: #8a6d3b;
357
+ }
358
+
359
+ .has-warning .fz-form-control {
360
+ border-color: #8a6d3b;
361
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
362
+ }
363
+
364
+ .has-warning .fz-form-control:focus {
365
+ border-color: #66512c;
366
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
367
+ }
368
+
369
+ .has-warning .fz-input-group-addon {
370
+ border-color: #8a6d3b;
371
+ color: #8a6d3b;
372
+ background-color: #fcf8e3;
373
+ }
374
+
375
+ .has-warning .fz-form-control-feedback {
376
+ color: #8a6d3b;
377
+ }
378
+
379
+ .has-error .help-block,
380
+ .has-error .control-label,
381
+ .has-error .radio,
382
+ .has-error .checkbox,
383
+ .has-error .radio-inline,
384
+ .has-error .checkbox-inline,
385
+ .has-error.radio label,
386
+ .has-error.checkbox label,
387
+ .has-error.radio-inline label,
388
+ .has-error.checkbox-inline label {
389
+ color: #a94442;
390
+ }
391
+
392
+ .has-error .fz-form-control {
393
+ border-color: #a94442;
394
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
395
+ }
396
+
397
+ .has-error .fz-form-control:focus {
398
+ border-color: #843534;
399
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
400
+ }
401
+
402
+ .has-error .fz-input-group-addon {
403
+ border-color: #a94442;
404
+ color: #a94442;
405
+ background-color: #f2dede;
406
+ }
407
+
408
+ .has-error .fz-form-control-feedback {
409
+ color: #a94442;
410
+ }
411
+
412
+ .has-feedback label ~ .fz-form-control-feedback {
413
+ top: 25px;
414
+ }
415
+
416
+ .has-feedback label.feedzy-sr-only ~ .fz-form-control-feedback {
417
+ top: 0;
418
+ }
419
+
420
+ .help-block {
421
+ display: block;
422
+ margin-top: 5px;
423
+ margin-bottom: 10px;
424
+ color: #737373;
425
+ }
426
+
427
+ @media (min-width: 768px) {
428
+ .form-inline .fz-form-group {
429
+ display: inline-block;
430
+ margin-bottom: 0;
431
+ vertical-align: middle;
432
+ }
433
+
434
+ .form-inline .fz-form-control {
435
+ display: inline-block;
436
+ width: auto;
437
+ vertical-align: middle;
438
+ }
439
+
440
+ .form-inline .fz-form-control-static {
441
+ display: inline-block;
442
+ }
443
+
444
+ .form-inline .fz-input-group {
445
+ display: inline-table;
446
+ vertical-align: middle;
447
+ }
448
+
449
+ .form-inline .fz-input-group .fz-input-group-addon,
450
+ .form-inline .fz-input-group .fz-input-group-btn,
451
+ .form-inline .fz-input-group .fz-form-control {
452
+ width: auto;
453
+ }
454
+
455
+ .form-inline .fz-input-group > .fz-form-control {
456
+ width: 100%;
457
+ }
458
+
459
+ .form-inline .control-label {
460
+ margin-bottom: 0;
461
+ vertical-align: middle;
462
+ }
463
+
464
+ .form-inline .radio,
465
+ .form-inline .checkbox {
466
+ display: inline-block;
467
+ margin-top: 0;
468
+ margin-bottom: 0;
469
+ vertical-align: middle;
470
+ }
471
+
472
+ .form-inline .radio label,
473
+ .form-inline .checkbox label {
474
+ padding-left: 0;
475
+ }
476
+
477
+ .form-inline .radio input[type="radio"],
478
+ .form-inline .checkbox input[type="checkbox"] {
479
+ position: relative;
480
+ margin-left: 0;
481
+ }
482
+
483
+ .form-inline .has-feedback .fz-form-control-feedback {
484
+ top: 0;
485
+ }
486
+ }
487
+
488
+ .form-horizontal .radio,
489
+ .form-horizontal .checkbox,
490
+ .form-horizontal .radio-inline,
491
+ .form-horizontal .checkbox-inline {
492
+ margin-top: 0;
493
+ margin-bottom: 0;
494
+ padding-top: 7px;
495
+ }
496
+
497
+ .form-horizontal .radio,
498
+ .form-horizontal .checkbox {
499
+ min-height: 27px;
500
+ }
501
+
502
+ .form-horizontal .fz-form-group {
503
+ margin-right: -15px;
504
+ margin-left: -15px;
505
+ }
506
+
507
+ @media (min-width: 768px) {
508
+ .form-horizontal .control-label {
509
+ margin-bottom: 0;
510
+ padding-top: 7px;
511
+ text-align: right;
512
+ }
513
+ }
514
+
515
+ .form-horizontal .has-feedback .fz-form-control-feedback {
516
+ right: 15px;
517
+ }
518
+
519
+ @media (min-width: 768px) {
520
+ .form-horizontal .fz-form-group-lg .control-label {
521
+ padding-top: 11px;
522
+ font-size: 18px;
523
+ }
524
+ }
525
+
526
+ @media (min-width: 768px) {
527
+ .form-horizontal .fz-form-group-sm .control-label {
528
+ padding-top: 6px;
529
+ font-size: 12px;
530
+ }
531
+ }
532
+
533
+ .fz-btn {
534
+ display: inline-block;
535
+ margin-bottom: 0;
536
+ padding: 6px 12px;
537
+ border: 1px solid transparent;
538
+ border-radius: 4px;
539
+ background-image: none;
540
+ font-size: 14px;
541
+ font-weight: normal;
542
+ line-height: 1.42857143;
543
+ text-align: center;
544
+ vertical-align: middle;
545
+ white-space: nowrap;
546
+ cursor: pointer;
547
+ -webkit-user-select: none;
548
+ -moz-user-select: none;
549
+ -ms-user-select: none;
550
+ user-select: none;
551
+
552
+ -ms-touch-action: manipulation;
553
+ touch-action: manipulation;
554
+ }
555
+
556
+ .fz-btn:focus,
557
+ .fz-btn:active:focus,
558
+ .fz-btn.active:focus,
559
+ .fz-btn.focus,
560
+ .fz-btn:active.focus,
561
+ .fz-btn.active.focus {
562
+ outline: 5px auto -webkit-focus-ring-color;
563
+ outline-offset: -2px;
564
+ }
565
+
566
+ .fz-btn:hover,
567
+ .fz-btn:focus,
568
+ .fz-btn.focus {
569
+ color: #333;
570
+ text-decoration: none;
571
+ }
572
+
573
+ .fz-btn:active,
574
+ .fz-btn.active {
575
+ outline: 0;
576
+ background-image: none;
577
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
578
+ }
579
+
580
+ .fz-btn.disabled,
581
+ .fz-btn[disabled],
582
+ fieldset[disabled] .fz-btn {
583
+ opacity: 0.65;
584
+ box-shadow: none;
585
+ cursor: not-allowed;
586
+
587
+ filter: alpha(opacity=65);
588
+ }
589
+
590
+ a.fz-btn.disabled,
591
+ fieldset[disabled] a.fz-btn {
592
+ pointer-events: none;
593
+ }
594
+
595
+ .fz-btn-default {
596
+ border-color: #ccc;
597
+ color: #333;
598
+ background-color: #fff;
599
+ }
600
+
601
+ .fz-btn-default:focus,
602
+ .fz-btn-default.focus {
603
+ border-color: #8c8c8c;
604
+ color: #333;
605
+ background-color: #e6e6e6;
606
+ }
607
+
608
+ .fz-btn-default:hover {
609
+ border-color: #adadad;
610
+ color: #333;
611
+ background-color: #e6e6e6;
612
+ }
613
+
614
+ .fz-btn-default:active,
615
+ .fz-btn-default.active,
616
+ .open > .dropdown-toggle.fz-btn-default {
617
+ border-color: #adadad;
618
+ color: #333;
619
+ background-color: #e6e6e6;
620
+ }
621
+
622
+ .fz-btn-default:active:hover,
623
+ .fz-btn-default.active:hover,
624
+ .open > .dropdown-toggle.fz-btn-default:hover,
625
+ .fz-btn-default:active:focus,
626
+ .fz-btn-default.active:focus,
627
+ .open > .dropdown-toggle.fz-btn-default:focus,
628
+ .fz-btn-default:active.focus,
629
+ .fz-btn-default.active.focus,
630
+ .open > .dropdown-toggle.fz-btn-default.focus {
631
+ border-color: #8c8c8c;
632
+ color: #333;
633
+ background-color: #d4d4d4;
634
+ }
635
+
636
+ .fz-btn-default:active,
637
+ .fz-btn-default.active,
638
+ .open > .dropdown-toggle.fz-btn-default {
639
+ background-image: none;
640
+ }
641
+
642
+ .fz-btn-default.disabled:hover,
643
+ .fz-btn-default[disabled]:hover,
644
+ fieldset[disabled] .fz-btn-default:hover,
645
+ .fz-btn-default.disabled:focus,
646
+ .fz-btn-default[disabled]:focus,
647
+ fieldset[disabled] .fz-btn-default:focus,
648
+ .fz-btn-default.disabled.focus,
649
+ .fz-btn-default[disabled].focus,
650
+ fieldset[disabled] .fz-btn-default.focus {
651
+ border-color: #ccc;
652
+ background-color: #fff;
653
+ }
654
+
655
+ .fz-btn-default .badge {
656
+ color: #fff;
657
+ background-color: #333;
658
+ }
659
+
660
+ .fz-btn-primary {
661
+ border-color: #2e6da4;
662
+ color: #fff;
663
+ background-color: #337ab7;
664
+ }
665
+
666
+ .fz-btn-primary:focus,
667
+ .fz-btn-primary.focus {
668
+ border-color: #122b40;
669
+ color: #fff;
670
+ background-color: #286090;
671
+ }
672
+
673
+ .fz-btn-primary:hover {
674
+ border-color: #204d74;
675
+ color: #fff;
676
+ background-color: #286090;
677
+ }
678
+
679
+ .fz-btn-primary:active,
680
+ .fz-btn-primary.active,
681
+ .open > .dropdown-toggle.fz-btn-primary {
682
+ border-color: #204d74;
683
+ color: #fff;
684
+ background-color: #286090;
685
+ }
686
+
687
+ .fz-btn-primary:active:hover,
688
+ .fz-btn-primary.active:hover,
689
+ .open > .dropdown-toggle.fz-btn-primary:hover,
690
+ .fz-btn-primary:active:focus,
691
+ .fz-btn-primary.active:focus,
692
+ .open > .dropdown-toggle.fz-btn-primary:focus,
693
+ .fz-btn-primary:active.focus,
694
+ .fz-btn-primary.active.focus,
695
+ .open > .dropdown-toggle.fz-btn-primary.focus {
696
+ border-color: #122b40;
697
+ color: #fff;
698
+ background-color: #204d74;
699
+ }
700
+
701
+ .fz-btn-primary:active,
702
+ .fz-btn-primary.active,
703
+ .open > .dropdown-toggle.fz-btn-primary {
704
+ background-image: none;
705
+ }
706
+
707
+ .fz-btn-primary.disabled:hover,
708
+ .fz-btn-primary[disabled]:hover,
709
+ fieldset[disabled] .fz-btn-primary:hover,
710
+ .fz-btn-primary.disabled:focus,
711
+ .fz-btn-primary[disabled]:focus,
712
+ fieldset[disabled] .fz-btn-primary:focus,
713
+ .fz-btn-primary.disabled.focus,
714
+ .fz-btn-primary[disabled].focus,
715
+ fieldset[disabled] .fz-btn-primary.focus {
716
+ border-color: #2e6da4;
717
+ background-color: #337ab7;
718
+ }
719
+
720
+ .fz-btn-primary .badge {
721
+ color: #337ab7;
722
+ background-color: #fff;
723
+ }
724
+
725
+ .fz-btn-success {
726
+ border-color: #4cae4c;
727
+ color: #fff;
728
+ background-color: #5cb85c;
729
+ }
730
+
731
+ .fz-btn-success:focus,
732
+ .fz-btn-success.focus {
733
+ border-color: #255625;
734
+ color: #fff;
735
+ background-color: #449d44;
736
+ }
737
+
738
+ .fz-btn-success:hover {
739
+ border-color: #398439;
740
+ color: #fff;
741
+ background-color: #449d44;
742
+ }
743
+
744
+ .fz-btn-success:active,
745
+ .fz-btn-success.active,
746
+ .open > .dropdown-toggle.fz-btn-success {
747
+ border-color: #398439;
748
+ color: #fff;
749
+ background-color: #449d44;
750
+ }
751
+
752
+ .fz-btn-success:active:hover,
753
+ .fz-btn-success.active:hover,
754
+ .open > .dropdown-toggle.fz-btn-success:hover,
755
+ .fz-btn-success:active:focus,
756
+ .fz-btn-success.active:focus,
757
+ .open > .dropdown-toggle.fz-btn-success:focus,
758
+ .fz-btn-success:active.focus,
759
+ .fz-btn-success.active.focus,
760
+ .open > .dropdown-toggle.fz-btn-success.focus {
761
+ border-color: #255625;
762
+ color: #fff;
763
+ background-color: #398439;
764
+ }
765
+
766
+ .fz-btn-success:active,
767
+ .fz-btn-success.active,
768
+ .open > .dropdown-toggle.fz-btn-success {
769
+ background-image: none;
770
+ }
771
+
772
+ .fz-btn-success.disabled:hover,
773
+ .fz-btn-success[disabled]:hover,
774
+ fieldset[disabled] .fz-btn-success:hover,
775
+ .fz-btn-success.disabled:focus,
776
+ .fz-btn-success[disabled]:focus,
777
+ fieldset[disabled] .fz-btn-success:focus,
778
+ .fz-btn-success.disabled.focus,
779
+ .fz-btn-success[disabled].focus,
780
+ fieldset[disabled] .fz-btn-success.focus {
781
+ border-color: #4cae4c;
782
+ background-color: #5cb85c;
783
+ }
784
+
785
+ .fz-btn-success .badge {
786
+ color: #5cb85c;
787
+ background-color: #fff;
788
+ }
789
+
790
+ .fz-btn-info {
791
+ border-color: #46b8da;
792
+ color: #fff;
793
+ background-color: #5bc0de;
794
+ }
795
+
796
+ .fz-btn-info:focus,
797
+ .fz-btn-info.focus {
798
+ border-color: #1b6d85;
799
+ color: #fff;
800
+ background-color: #31b0d5;
801
+ }
802
+
803
+ .fz-btn-info:hover {
804
+ border-color: #269abc;
805
+ color: #fff;
806
+ background-color: #31b0d5;
807
+ }
808
+
809
+ .fz-btn-info:active,
810
+ .fz-btn-info.active,
811
+ .open > .dropdown-toggle.fz-btn-info {
812
+ border-color: #269abc;
813
+ color: #fff;
814
+ background-color: #31b0d5;
815
+ }
816
+
817
+ .fz-btn-info:active:hover,
818
+ .fz-btn-info.active:hover,
819
+ .open > .dropdown-toggle.fz-btn-info:hover,
820
+ .fz-btn-info:active:focus,
821
+ .fz-btn-info.active:focus,
822
+ .open > .dropdown-toggle.fz-btn-info:focus,
823
+ .fz-btn-info:active.focus,
824
+ .fz-btn-info.active.focus,
825
+ .open > .dropdown-toggle.fz-btn-info.focus {
826
+ border-color: #1b6d85;
827
+ color: #fff;
828
+ background-color: #269abc;
829
+ }
830
+
831
+ .fz-btn-info:active,
832
+ .fz-btn-info.active,
833
+ .open > .dropdown-toggle.fz-btn-info {
834
+ background-image: none;
835
+ }
836
+
837
+ .fz-btn-info.disabled:hover,
838
+ .fz-btn-info[disabled]:hover,
839
+ fieldset[disabled] .fz-btn-info:hover,
840
+ .fz-btn-info.disabled:focus,
841
+ .fz-btn-info[disabled]:focus,
842
+ fieldset[disabled] .fz-btn-info:focus,
843
+ .fz-btn-info.disabled.focus,
844
+ .fz-btn-info[disabled].focus,
845
+ fieldset[disabled] .fz-btn-info.focus {
846
+ border-color: #46b8da;
847
+ background-color: #5bc0de;
848
+ }
849
+
850
+ .fz-btn-info .badge {
851
+ color: #5bc0de;
852
+ background-color: #fff;
853
+ }
854
+
855
+ .fz-btn-warning {
856
+ border-color: #eea236;
857
+ color: #fff;
858
+ background-color: #f0ad4e;
859
+ }
860
+
861
+ .fz-btn-warning:focus,
862
+ .fz-btn-warning.focus {
863
+ border-color: #985f0d;
864
+ color: #fff;
865
+ background-color: #ec971f;
866
+ }
867
+
868
+ .fz-btn-warning:hover {
869
+ border-color: #d58512;
870
+ color: #fff;
871
+ background-color: #ec971f;
872
+ }
873
+
874
+ .fz-btn-warning:active,
875
+ .fz-btn-warning.active,
876
+ .open > .dropdown-toggle.fz-btn-warning {
877
+ border-color: #d58512;
878
+ color: #fff;
879
+ background-color: #ec971f;
880
+ }
881
+
882
+ .fz-btn-warning:active:hover,
883
+ .fz-btn-warning.active:hover,
884
+ .open > .dropdown-toggle.fz-btn-warning:hover,
885
+ .fz-btn-warning:active:focus,
886
+ .fz-btn-warning.active:focus,
887
+ .open > .dropdown-toggle.fz-btn-warning:focus,
888
+ .fz-btn-warning:active.focus,
889
+ .fz-btn-warning.active.focus,
890
+ .open > .dropdown-toggle.fz-btn-warning.focus {
891
+ border-color: #985f0d;
892
+ color: #fff;
893
+ background-color: #d58512;
894
+ }
895
+
896
+ .fz-btn-warning:active,
897
+ .fz-btn-warning.active,
898
+ .open > .dropdown-toggle.fz-btn-warning {
899
+ background-image: none;
900
+ }
901
+
902
+ .fz-btn-warning.disabled:hover,
903
+ .fz-btn-warning[disabled]:hover,
904
+ fieldset[disabled] .fz-btn-warning:hover,
905
+ .fz-btn-warning.disabled:focus,
906
+ .fz-btn-warning[disabled]:focus,
907
+ fieldset[disabled] .fz-btn-warning:focus,
908
+ .fz-btn-warning.disabled.focus,
909
+ .fz-btn-warning[disabled].focus,
910
+ fieldset[disabled] .fz-btn-warning.focus {
911
+ border-color: #eea236;
912
+ background-color: #f0ad4e;
913
+ }
914
+
915
+ .fz-btn-warning .badge {
916
+ color: #f0ad4e;
917
+ background-color: #fff;
918
+ }
919
+
920
+ .fz-btn-danger {
921
+ border-color: #d43f3a;
922
+ color: #fff;
923
+ background-color: #d9534f;
924
+ }
925
+
926
+ .fz-btn-danger:focus,
927
+ .fz-btn-danger.focus {
928
+ border-color: #761c19;
929
+ color: #fff;
930
+ background-color: #c9302c;
931
+ }
932
+
933
+ .fz-btn-danger:hover {
934
+ border-color: #ac2925;
935
+ color: #fff;
936
+ background-color: #c9302c;
937
+ }
938
+
939
+ .fz-btn-danger:active,
940
+ .fz-btn-danger.active,
941
+ .open > .dropdown-toggle.fz-btn-danger {
942
+ border-color: #ac2925;
943
+ color: #fff;
944
+ background-color: #c9302c;
945
+ }
946
+
947
+ .fz-btn-danger:active:hover,
948
+ .fz-btn-danger.active:hover,
949
+ .open > .dropdown-toggle.fz-btn-danger:hover,
950
+ .fz-btn-danger:active:focus,
951
+ .fz-btn-danger.active:focus,
952
+ .open > .dropdown-toggle.fz-btn-danger:focus,
953
+ .fz-btn-danger:active.focus,
954
+ .fz-btn-danger.active.focus,
955
+ .open > .dropdown-toggle.fz-btn-danger.focus {
956
+ border-color: #761c19;
957
+ color: #fff;
958
+ background-color: #ac2925;
959
+ }
960
+
961
+ .fz-btn-danger:active,
962
+ .fz-btn-danger.active,
963
+ .open > .dropdown-toggle.fz-btn-danger {
964
+ background-image: none;
965
+ }
966
+
967
+ .fz-btn-danger.disabled:hover,
968
+ .fz-btn-danger[disabled]:hover,
969
+ fieldset[disabled] .fz-btn-danger:hover,
970
+ .fz-btn-danger.disabled:focus,
971
+ .fz-btn-danger[disabled]:focus,
972
+ fieldset[disabled] .fz-btn-danger:focus,
973
+ .fz-btn-danger.disabled.focus,
974
+ .fz-btn-danger[disabled].focus,
975
+ fieldset[disabled] .fz-btn-danger.focus {
976
+ border-color: #d43f3a;
977
+ background-color: #d9534f;
978
+ }
979
+
980
+ .fz-btn-danger .badge {
981
+ color: #d9534f;
982
+ background-color: #fff;
983
+ }
984
+
985
+ .fz-btn-link {
986
+ border-radius: 0;
987
+ color: #337ab7;
988
+ font-weight: normal;
989
+ }
990
+
991
+ .fz-btn-link,
992
+ .fz-btn-link:active,
993
+ .fz-btn-link.active,
994
+ .fz-btn-link[disabled],
995
+ fieldset[disabled] .fz-btn-link {
996
+ background-color: transparent;
997
+ box-shadow: none;
998
+ }
999
+
1000
+ .fz-btn-link,
1001
+ .fz-btn-link:hover,
1002
+ .fz-btn-link:focus,
1003
+ .fz-btn-link:active {
1004
+ border-color: transparent;
1005
+ }
1006
+
1007
+ .fz-btn-link:hover,
1008
+ .fz-btn-link:focus {
1009
+ color: #23527c;
1010
+ background-color: transparent;
1011
+ text-decoration: underline;
1012
+ }
1013
+
1014
+ .fz-btn-link[disabled]:hover,
1015
+ fieldset[disabled] .fz-btn-link:hover,
1016
+ .fz-btn-link[disabled]:focus,
1017
+ fieldset[disabled] .fz-btn-link:focus {
1018
+ color: #777;
1019
+ text-decoration: none;
1020
+ }
1021
+
1022
+ .fz-btn-lg,
1023
+ .fz-btn-group-lg > .fz-btn {
1024
+ padding: 10px 16px;
1025
+ border-radius: 6px;
1026
+ font-size: 18px;
1027
+ line-height: 1.3333333;
1028
+ }
1029
+
1030
+ .fz-btn-sm,
1031
+ .fz-btn-group-sm > .fz-btn {
1032
+ padding: 5px 10px;
1033
+ border-radius: 3px;
1034
+ font-size: 12px;
1035
+ line-height: 1.5;
1036
+ }
1037
+
1038
+ .fz-btn-xs,
1039
+ .fz-btn-group-xs > .fz-btn {
1040
+ padding: 1px 5px;
1041
+ border-radius: 3px;
1042
+ font-size: 12px;
1043
+ line-height: 1.5;
1044
+ }
1045
+
1046
+ .fz-btn-block {
1047
+ display: block;
1048
+ width: 100%;
1049
+ }
1050
+
1051
+ .fz-btn-block + .fz-btn-block {
1052
+ margin-top: 5px;
1053
+ }
1054
+
1055
+ input[type="submit"].fz-btn-block,
1056
+ input[type="reset"].fz-btn-block,
1057
+ input[type="button"].fz-btn-block {
1058
+ width: 100%;
1059
+ }
1060
+
1061
+ .caret {
1062
+ display: inline-block;
1063
+ width: 0;
1064
+ height: 0;
1065
+ margin-left: 2px;
1066
+ border-top: 4px dashed;
1067
+ border-top: 4px solid \9;
1068
+ border-right: 4px solid transparent;
1069
+ border-left: 4px solid transparent;
1070
+ vertical-align: middle;
1071
+ }
1072
+
1073
+ .dropup,
1074
+ .dropdown {
1075
+ position: relative;
1076
+ }
1077
+
1078
+ .dropdown-toggle:focus {
1079
+ outline: 0;
1080
+ }
1081
+
1082
+ .dropdown-menu {
1083
+ display: none;
1084
+ float: left;
1085
+ position: absolute;
1086
+ z-index: 1000;
1087
+ top: 40px;
1088
+ left: 0;
1089
+ min-width: 160px;
1090
+ /* fallback if 100% not supported */
1091
+ min-width: 100%;
1092
+ margin: 2px 0 0;
1093
+ padding: 5px 0;
1094
+ border: 1px solid #ccc;
1095
+ border: 1px solid rgba(0, 0, 0, 0.15);
1096
+ border-radius: 4px;
1097
+ background-color: #fff;
1098
+ background-clip: padding-box;
1099
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
1100
+ font-size: 14px;
1101
+ text-align: left;
1102
+ list-style: none;
1103
+ }
1104
+
1105
+ .dropdown-menu.pull-right {
1106
+ right: 0;
1107
+ left: auto;
1108
+ }
1109
+
1110
+ .dropdown-menu .divider {
1111
+ overflow: hidden;
1112
+ height: 1px;
1113
+ margin: 9px 0;
1114
+ background-color: #e5e5e5;
1115
+ }
1116
+
1117
+ .dropdown-menu > li > a {
1118
+ display: block;
1119
+ clear: both;
1120
+ padding: 3px 20px;
1121
+ color: #333;
1122
+ font-weight: normal;
1123
+ line-height: 1.42857143;
1124
+ white-space: nowrap;
1125
+ }
1126
+
1127
+ .dropdown-menu > li > a:hover,
1128
+ .dropdown-menu > li > a:focus {
1129
+ color: #262626;
1130
+ background-color: #f5f5f5;
1131
+ text-decoration: none;
1132
+ }
1133
+
1134
+ .dropdown-menu > .active > a,
1135
+ .dropdown-menu > .active > a:hover,
1136
+ .dropdown-menu > .active > a:focus {
1137
+ outline: 0;
1138
+ color: #fff;
1139
+ background-color: #337ab7;
1140
+ text-decoration: none;
1141
+ }
1142
+
1143
+ .dropdown-menu > .disabled > a,
1144
+ .dropdown-menu > .disabled > a:hover,
1145
+ .dropdown-menu > .disabled > a:focus {
1146
+ color: #777;
1147
+ }
1148
+
1149
+ .dropdown-menu > .disabled > a:hover,
1150
+ .dropdown-menu > .disabled > a:focus {
1151
+ background-color: transparent;
1152
+ background-image: none;
1153
+ text-decoration: none;
1154
+ cursor: not-allowed;
1155
+
1156
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
1157
+ }
1158
+
1159
+ .open > .dropdown-menu {
1160
+ display: block;
1161
+ }
1162
+
1163
+ .open > a {
1164
+ outline: 0;
1165
+ }
1166
+
1167
+ .dropdown-menu-right {
1168
+ right: 0;
1169
+ left: auto;
1170
+ }
1171
+
1172
+ .dropdown-menu-left {
1173
+ right: auto;
1174
+ left: 0;
1175
+ }
1176
+
1177
+ .dropdown-header {
1178
+ display: block;
1179
+ padding: 3px 20px;
1180
+ color: #777;
1181
+ font-size: 12px;
1182
+ line-height: 1.42857143;
1183
+ white-space: nowrap;
1184
+ }
1185
+
1186
+ .dropdown-backdrop {
1187
+ position: fixed;
1188
+ z-index: 990;
1189
+ top: 0;
1190
+ right: 0;
1191
+ bottom: 0;
1192
+ left: 0;
1193
+ }
1194
+
1195
+ .pull-right > .dropdown-menu {
1196
+ right: 0;
1197
+ left: auto;
1198
+ }
1199
+
1200
+ .dropup .caret,
1201
+ .navbar-fixed-bottom .dropdown .caret {
1202
+ border-top: 0;
1203
+ border-bottom: 4px dashed;
1204
+ border-bottom: 4px solid \9;
1205
+ content: "";
1206
+ }
1207
+
1208
+ .dropup .dropdown-menu,
1209
+ .navbar-fixed-bottom .dropdown .dropdown-menu {
1210
+ top: auto;
1211
+ bottom: 100%;
1212
+ margin-bottom: 2px;
1213
+ }
1214
+
1215
+ @media (min-width: 768px) {
1216
+ .navbar-right .dropdown-menu {
1217
+ right: 0;
1218
+ left: auto;
1219
+ }
1220
+
1221
+ .navbar-right .dropdown-menu-left {
1222
+ right: auto;
1223
+ left: 0;
1224
+ }
1225
+ }
1226
+
1227
+ .fz-btn-group,
1228
+ .fz-btn-group-vertical {
1229
+ display: inline-block;
1230
+ position: relative;
1231
+ vertical-align: middle;
1232
+ }
1233
+
1234
+ .fz-btn-group > .fz-btn,
1235
+ .fz-btn-group-vertical > .fz-btn {
1236
+ float: left;
1237
+ position: relative;
1238
+ }
1239
+
1240
+ .fz-btn-group > .fz-btn:hover,
1241
+ .fz-btn-group-vertical > .fz-btn:hover,
1242
+ .fz-btn-group > .fz-btn:focus,
1243
+ .fz-btn-group-vertical > .fz-btn:focus,
1244
+ .fz-btn-group > .fz-btn:active,
1245
+ .fz-btn-group-vertical > .fz-btn:active,
1246
+ .fz-btn-group > .fz-btn.active,
1247
+ .fz-btn-group-vertical > .fz-btn.active {
1248
+ z-index: 2;
1249
+ }
1250
+
1251
+ .fz-btn-group .fz-btn + .fz-btn,
1252
+ .fz-btn-group .fz-btn + .fz-btn-group,
1253
+ .fz-btn-group .fz-btn-group + .fz-btn,
1254
+ .fz-btn-group .fz-btn-group + .fz-btn-group {
1255
+ margin-left: -1px;
1256
+ }
1257
+
1258
+ .fz-btn-toolbar {
1259
+ margin-left: -5px;
1260
+ }
1261
+
1262
+ .fz-btn-toolbar .fz-btn,
1263
+ .fz-btn-toolbar .fz-btn-group,
1264
+ .fz-btn-toolbar .fz-input-group {
1265
+ float: left;
1266
+ }
1267
+
1268
+ .fz-btn-toolbar > .fz-btn,
1269
+ .fz-btn-toolbar > .fz-btn-group,
1270
+ .fz-btn-toolbar > .fz-input-group {
1271
+ margin-left: 5px;
1272
+ }
1273
+
1274
+ .fz-btn-group > .fz-btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
1275
+ border-radius: 0;
1276
+ }
1277
+
1278
+ .fz-btn-group > .fz-btn:first-child {
1279
+ margin-left: 0;
1280
+ }
1281
+
1282
+ .fz-btn-group > .fz-btn:first-child:not(:last-child):not(.dropdown-toggle) {
1283
+ border-top-right-radius: 0;
1284
+ border-bottom-right-radius: 0;
1285
+ }
1286
+
1287
+ .fz-btn-group > .fz-btn:last-child:not(:first-child),
1288
+ .fz-btn-group > .dropdown-toggle:not(:first-child) {
1289
+ border-top-left-radius: 0;
1290
+ border-bottom-left-radius: 0;
1291
+ }
1292
+
1293
+ .fz-btn-group > .fz-btn-group {
1294
+ float: left;
1295
+ }
1296
+
1297
+ .fz-btn-group > .fz-btn-group:not(:first-child):not(:last-child) > .fz-btn {
1298
+ border-radius: 0;
1299
+ }
1300
+
1301
+ .fz-btn-group > .fz-btn-group:first-child:not(:last-child) > .fz-btn:last-child,
1302
+ .fz-btn-group > .fz-btn-group:first-child:not(:last-child) > .dropdown-toggle {
1303
+ border-top-right-radius: 0;
1304
+ border-bottom-right-radius: 0;
1305
+ }
1306
+
1307
+ .fz-btn-group > .fz-btn-group:last-child:not(:first-child) > .fz-btn:first-child {
1308
+ border-top-left-radius: 0;
1309
+ border-bottom-left-radius: 0;
1310
+ }
1311
+
1312
+ .fz-btn-group .dropdown-toggle:active,
1313
+ .fz-btn-group.open .dropdown-toggle {
1314
+ outline: 0;
1315
+ }
1316
+
1317
+ .fz-btn-group > .fz-btn + .dropdown-toggle {
1318
+ padding-right: 8px;
1319
+ padding-left: 8px;
1320
+ }
1321
+
1322
+ .fz-btn-group > .fz-btn-lg + .dropdown-toggle {
1323
+ padding-right: 12px;
1324
+ padding-left: 12px;
1325
+ }
1326
+
1327
+ .fz-btn-group.open .dropdown-toggle {
1328
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1329
+ }
1330
+
1331
+ .fz-btn-group.open .dropdown-toggle.fz-btn-link {
1332
+ box-shadow: none;
1333
+ }
1334
+
1335
+ .fz-btn .caret {
1336
+ margin-left: 0;
1337
+ }
1338
+
1339
+ .fz-btn-lg .caret {
1340
+ border-width: 5px 5px 0;
1341
+ border-bottom-width: 0;
1342
+ }
1343
+
1344
+ .dropup .fz-btn-lg .caret {
1345
+ border-width: 0 5px 5px;
1346
+ }
1347
+
1348
+ .fz-btn-group-vertical > .fz-btn,
1349
+ .fz-btn-group-vertical > .fz-btn-group,
1350
+ .fz-btn-group-vertical > .fz-btn-group > .fz-btn {
1351
+ display: block;
1352
+ float: none;
1353
+ width: 100%;
1354
+ max-width: 100%;
1355
+ }
1356
+
1357
+ .fz-btn-group-vertical > .fz-btn-group > .fz-btn {
1358
+ float: none;
1359
+ }
1360
+
1361
+ .fz-btn-group-vertical > .fz-btn + .fz-btn,
1362
+ .fz-btn-group-vertical > .fz-btn + .fz-btn-group,
1363
+ .fz-btn-group-vertical > .fz-btn-group + .fz-btn,
1364
+ .fz-btn-group-vertical > .fz-btn-group + .fz-btn-group {
1365
+ margin-top: -1px;
1366
+ margin-left: 0;
1367
+ }
1368
+
1369
+ .fz-btn-group-vertical > .fz-btn:not(:first-child):not(:last-child) {
1370
+ border-radius: 0;
1371
+ }
1372
+
1373
+ .fz-btn-group-vertical > .fz-btn:first-child:not(:last-child) {
1374
+ border-top-left-radius: 4px;
1375
+ border-top-right-radius: 4px;
1376
+ border-bottom-right-radius: 0;
1377
+ border-bottom-left-radius: 0;
1378
+ }
1379
+
1380
+ .fz-btn-group-vertical > .fz-btn:last-child:not(:first-child) {
1381
+ border-top-left-radius: 0;
1382
+ border-top-right-radius: 0;
1383
+ border-bottom-right-radius: 4px;
1384
+ border-bottom-left-radius: 4px;
1385
+ }
1386
+
1387
+ .fz-btn-group-vertical > .fz-btn-group:not(:first-child):not(:last-child) > .fz-btn {
1388
+ border-radius: 0;
1389
+ }
1390
+
1391
+ .fz-btn-group-vertical > .fz-btn-group:first-child:not(:last-child) > .fz-btn:last-child,
1392
+ .fz-btn-group-vertical > .fz-btn-group:first-child:not(:last-child) > .dropdown-toggle {
1393
+ border-bottom-right-radius: 0;
1394
+ border-bottom-left-radius: 0;
1395
+ }
1396
+
1397
+ .fz-btn-group-vertical > .fz-btn-group:last-child:not(:first-child) > .fz-btn:first-child {
1398
+ border-top-left-radius: 0;
1399
+ border-top-right-radius: 0;
1400
+ }
1401
+
1402
+ .fz-btn-group-justified {
1403
+ display: table;
1404
+ width: 100%;
1405
+ table-layout: fixed;
1406
+ border-collapse: separate;
1407
+ }
1408
+
1409
+ .fz-btn-group-justified > .fz-btn,
1410
+ .fz-btn-group-justified > .fz-btn-group {
1411
+ display: table-cell;
1412
+ float: none;
1413
+ width: 1%;
1414
+ }
1415
+
1416
+ .fz-btn-group-justified > .fz-btn-group .fz-btn {
1417
+ width: 100%;
1418
+ }
1419
+
1420
+ .fz-btn-group-justified > .fz-btn-group .dropdown-menu {
1421
+ left: auto;
1422
+ }
1423
+
1424
+ [data-toggle="buttons"] > .fz-btn input[type="radio"],
1425
+ [data-toggle="buttons"] > .fz-btn-group > .fz-btn input[type="radio"],
1426
+ [data-toggle="buttons"] > .fz-btn input[type="checkbox"],
1427
+ [data-toggle="buttons"] > .fz-btn-group > .fz-btn input[type="checkbox"] {
1428
+ clip: rect(0, 0, 0, 0);
1429
+ position: absolute;
1430
+ pointer-events: none;
1431
+ }
1432
+
1433
+ .fz-input-group {
1434
+ display: table;
1435
+ position: relative;
1436
+ border-collapse: separate;
1437
+ }
1438
+
1439
+ .fz-input-group[class*="col-"] {
1440
+ float: none;
1441
+ padding-right: 0;
1442
+ padding-left: 0;
1443
+ }
1444
+
1445
+ .fz-input-group .fz-form-control {
1446
+ float: left;
1447
+ position: relative;
1448
+ z-index: 2;
1449
+ width: 100%;
1450
+ margin-bottom: 0;
1451
+ }
1452
+
1453
+ .fz-input-group .fz-form-control:focus {
1454
+ z-index: 3;
1455
+ }
1456
+
1457
+ .fz-input-group-lg > .fz-form-control,
1458
+ .fz-input-group-lg > .fz-input-group-addon,
1459
+ .fz-input-group-lg > .fz-input-group-btn > .fz-btn {
1460
+ height: 46px;
1461
+ padding: 10px 16px;
1462
+ border-radius: 6px;
1463
+ font-size: 18px;
1464
+ line-height: 1.3333333;
1465
+ }
1466
+
1467
+ select.fz-input-group-lg > .fz-form-control,
1468
+ select.fz-input-group-lg > .fz-input-group-addon,
1469
+ select.fz-input-group-lg > .fz-input-group-btn > .fz-btn {
1470
+ height: 46px;
1471
+ line-height: 46px;
1472
+ }
1473
+
1474
+ textarea.fz-input-group-lg > .fz-form-control,
1475
+ textarea.fz-input-group-lg > .fz-input-group-addon,
1476
+ textarea.fz-input-group-lg > .fz-input-group-btn > .fz-btn,
1477
+ select[multiple].fz-input-group-lg > .fz-form-control,
1478
+ select[multiple].fz-input-group-lg > .fz-input-group-addon,
1479
+ select[multiple].fz-input-group-lg > .fz-input-group-btn > .fz-btn {
1480
+ height: auto;
1481
+ }
1482
+
1483
+ .fz-input-group-sm > .fz-form-control,
1484
+ .fz-input-group-sm > .fz-input-group-addon,
1485
+ .fz-input-group-sm > .fz-input-group-btn > .fz-btn {
1486
+ height: 30px;
1487
+ padding: 5px 10px;
1488
+ border-radius: 3px;
1489
+ font-size: 12px;
1490
+ line-height: 1.5;
1491
+ }
1492
+
1493
+ select.fz-input-group-sm > .fz-form-control,
1494
+ select.fz-input-group-sm > .fz-input-group-addon,
1495
+ select.fz-input-group-sm > .fz-input-group-btn > .fz-btn {
1496
+ height: 30px;
1497
+ line-height: 30px;
1498
+ }
1499
+
1500
+ textarea.fz-input-group-sm > .fz-form-control,
1501
+ textarea.fz-input-group-sm > .fz-input-group-addon,
1502
+ textarea.fz-input-group-sm > .fz-input-group-btn > .fz-btn,
1503
+ select[multiple].fz-input-group-sm > .fz-form-control,
1504
+ select[multiple].fz-input-group-sm > .fz-input-group-addon,
1505
+ select[multiple].fz-input-group-sm > .fz-input-group-btn > .fz-btn {
1506
+ height: auto;
1507
+ }
1508
+
1509
+ .fz-input-group-addon,
1510
+ .fz-input-group-btn,
1511
+ .fz-input-group .fz-form-control {
1512
+ display: table-cell;
1513
+ }
1514
+
1515
+ .fz-input-group-addon:not(:first-child):not(:last-child),
1516
+ .fz-input-group-btn:not(:first-child):not(:last-child),
1517
+ .fz-input-group .fz-form-control:not(:first-child):not(:last-child) {
1518
+ border-radius: 0;
1519
+ }
1520
+
1521
+ .fz-input-group-addon,
1522
+ .fz-input-group-btn {
1523
+ width: 1%;
1524
+ vertical-align: top;
1525
+ white-space: nowrap;
1526
+ }
1527
+
1528
+ .fz-input-group-addon {
1529
+ padding: 6px 12px;
1530
+ border: 1px solid #ccc;
1531
+ border-radius: 4px;
1532
+ color: #555;
1533
+ background-color: #eee;
1534
+ font-size: 14px;
1535
+ font-weight: normal;
1536
+ line-height: 1;
1537
+ text-align: center;
1538
+ }
1539
+
1540
+ .fz-input-group-addon.input-sm {
1541
+ padding: 5px 10px;
1542
+ border-radius: 3px;
1543
+ font-size: 12px;
1544
+ }
1545
+
1546
+ .fz-input-group-addon.input-lg {
1547
+ padding: 10px 16px;
1548
+ border-radius: 6px;
1549
+ font-size: 18px;
1550
+ }
1551
+
1552
+ .fz-input-group-addon input[type="radio"],
1553
+ .fz-input-group-addon input[type="checkbox"] {
1554
+ margin-top: 0;
1555
+ }
1556
+
1557
+ .fz-input-group .fz-form-control:first-child,
1558
+ .fz-input-group-addon:first-child,
1559
+ .fz-input-group-btn:first-child > .fz-btn,
1560
+ .fz-input-group-btn:first-child > .fz-btn-group > .fz-btn,
1561
+ .fz-input-group-btn:first-child > .dropdown-toggle,
1562
+ .fz-input-group-btn:last-child > .fz-btn:not(:last-child):not(.dropdown-toggle),
1563
+ .fz-input-group-btn:last-child > .fz-btn-group:not(:last-child) > .fz-btn {
1564
+ border-top-right-radius: 0;
1565
+ border-bottom-right-radius: 0;
1566
+ }
1567
+
1568
+ .fz-input-group-addon:first-child {
1569
+ border-right: 0;
1570
+ }
1571
+
1572
+ .fz-input-group .fz-form-control:last-child,
1573
+ .fz-input-group-addon:last-child,
1574
+ .fz-input-group-btn:last-child > .fz-btn,
1575
+ .fz-input-group-btn:last-child > .fz-btn-group > .fz-btn,
1576
+ .fz-input-group-btn:last-child > .dropdown-toggle,
1577
+ .fz-input-group-btn:first-child > .fz-btn:not(:first-child),
1578
+ .fz-input-group-btn:first-child > .fz-btn-group:not(:first-child) > .fz-btn {
1579
+ border-top-left-radius: 0;
1580
+ border-bottom-left-radius: 0;
1581
+ }
1582
+
1583
+ .fz-input-group-addon:last-child {
1584
+ border-left: 0;
1585
+ }
1586
+
1587
+ .fz-input-group-btn {
1588
+ position: relative;
1589
+ font-size: 0;
1590
+ white-space: nowrap;
1591
+ }
1592
+
1593
+ .fz-input-group-btn > .fz-btn {
1594
+ position: relative;
1595
+ }
1596
+
1597
+ .fz-input-group-btn > .fz-btn + .fz-btn {
1598
+ margin-left: -1px;
1599
+ }
1600
+
1601
+ .fz-input-group-btn > .fz-btn:hover,
1602
+ .fz-input-group-btn > .fz-btn:focus,
1603
+ .fz-input-group-btn > .fz-btn:active {
1604
+ z-index: 2;
1605
+ }
1606
+
1607
+ .fz-input-group-btn:first-child > .fz-btn,
1608
+ .fz-input-group-btn:first-child > .fz-btn-group {
1609
+ margin-right: -1px;
1610
+ }
1611
+
1612
+ .fz-input-group-btn:last-child > .fz-btn,
1613
+ .fz-input-group-btn:last-child > .fz-btn-group {
1614
+ z-index: 2;
1615
+ margin-left: -1px;
1616
+ }
1617
+
1618
+ .col-left,
1619
+ .col-right {
1620
+ display: inline-block;
1621
+ float: left;
1622
+ position: relative;
1623
+ width: -webkit-calc( 50% - 34px );
1624
+ width: calc( 50% - 34px );
1625
+ min-height: 36px;
1626
+ }
1627
+
1628
+ .col-left::after {
1629
+ position: absolute;
1630
+ top: calc( 50% - 18px );
1631
+ top: -webkit-calc( 50% - 18px );
1632
+ left: -webkit-calc( 100% + 5px );
1633
+ left: calc( 100% + 5px );
1634
+ left: -webkit-calc( 100% + 8px );
1635
+ width: 36px;
1636
+ height: 36px;
1637
+ color: #ccc;
1638
+ font-family: "dashicons";
1639
+ font-size: 36px;
1640
+ line-height: 36px;
1641
+ content: "\f503";
1642
+ }
1643
+
1644
+ .col-left.fields::after {
1645
+ content: "\f229";
1646
+ }
1647
+
1648
+ .col-left {
1649
+ padding: 8px 8px 8px 0;
1650
+ border-right: 1px solid #ccc;
1651
+ }
1652
+
1653
+ .col-right {
1654
+ margin-left: 50px;
1655
+ padding: 8px 0 8px 8px;
1656
+ border-left: 1px solid #ccc;
1657
+ }
1658
+
1659
+ .label_description,
1660
+ .form_item {
1661
+ margin-top: 8px;
1662
+ margin-bottom: 8px;
1663
+ }
1664
+
1665
+ .label_description {
1666
+ border-bottom: 1px solid #efefef;
1667
+ }
1668
+
1669
+ .form_item {
1670
+ padding-top: 12px;
1671
+ }
1672
+
1673
+ a.dropdown-item {
1674
+ display: block;
1675
+ padding: 5px 8px;
1676
+ color: #f35b3f;
1677
+ text-align: center;
1678
+ text-decoration: none;
1679
+ }
1680
+
1681
+ a:hover.dropdown-item,
1682
+ a:focus.dropdown-item {
1683
+ color: #f89c8b;
1684
+ background-color: #f8f8f8;
1685
+ }
1686
+
1687
+ .fz-btn.fz-btn-add-fields {
1688
+ background-color: #099bb2;
1689
+ }
1690
+
1691
+ .fz-btn.fz-btn-add-fields:hover {
1692
+ background-color: #14b2cc;
1693
+ }
1694
+
1695
+ .fz-btn.fz-btn-remove-fields {
1696
+ color: #f35b3f;
1697
+ }
1698
+
1699
+ .fz-btn.fz-btn-remove-fields:hover {
1700
+ color: #f89c8b;
1701
+ }
1702
+
1703
+ .fz-btn > span.dashicons {
1704
+ vertical-align: middle;
1705
+ }
1706
+
1707
+ .f1 {
1708
+ padding: 25px;
1709
+ border-radius: 4px;
1710
+ background: #fff;
1711
+ }
1712
+
1713
+ .f1 h3 {
1714
+ margin-top: 0;
1715
+ margin-bottom: 5px;
1716
+ text-transform: uppercase;
1717
+ }
1718
+
1719
+ .f1-steps {
1720
+ overflow: hidden;
1721
+ position: relative;
1722
+ margin-top: 20px;
1723
+ }
1724
+
1725
+ .f1-progress {
1726
+ position: absolute;
1727
+ top: 24px;
1728
+ left: 0;
1729
+ width: 100%;
1730
+ height: 1px;
1731
+ background: #ddd;
1732
+ }
1733
+
1734
+ .f1-progress-line {
1735
+ position: absolute;
1736
+ top: 0;
1737
+ left: 0;
1738
+ height: 1px;
1739
+ background: #f35b3f;
1740
+ }
1741
+
1742
+ .f1-step {
1743
+ display: inline-block;
1744
+ position: relative;
1745
+ width: calc(100%/3 - 10px);
1746
+ width: -webkit-calc(100%/3 - 10px);
1747
+ text-align: center;
1748
+ }
1749
+
1750
+ .f1-step-icon {
1751
+ display: inline-block;
1752
+ width: 40px;
1753
+ height: 40px;
1754
+ margin-top: 4px;
1755
+ border-radius: 50%;
1756
+ color: #fff;
1757
+ background: #ddd;
1758
+ font-size: 16px;
1759
+ line-height: 40px;
1760
+ }
1761
+
1762
+ .f1-step-icon span {
1763
+ display: inline-block;
1764
+ width: 18px;
1765
+ height: 18px;
1766
+ padding: 11px;
1767
+ font-size: 18px;
1768
+ }
1769
+
1770
+ .f1-step.activated .f1-step-icon span {
1771
+ width: 20px;
1772
+ height: 20px;
1773
+ margin-top: -2px;
1774
+ margin-left: -1px;
1775
+ padding: 12px;
1776
+ font-size: 20px;
1777
+ }
1778
+
1779
+ .f1-step.active .f1-step-icon span {
1780
+ width: 24px;
1781
+ height: 24px;
1782
+ padding: 12px;
1783
+ font-size: 24px;
1784
+ }
1785
+
1786
+ .f1-step.activated .f1-step-icon {
1787
+ border: 1px solid #f35b3f;
1788
+ color: #f35b3f;
1789
+ background: #fff;
1790
+ line-height: 48px;
1791
+ }
1792
+
1793
+ .f1-step.active .f1-step-icon {
1794
+ width: 48px;
1795
+ height: 48px;
1796
+ margin-top: 0;
1797
+ background: #f35b3f;
1798
+ font-size: 22px;
1799
+ line-height: 48px;
1800
+ }
1801
+
1802
+ .f1-step p {
1803
+ color: #ccc;
1804
+ }
1805
+
1806
+ .f1-step.activated p {
1807
+ color: #f35b3f;
1808
+ }
1809
+
1810
+ .f1-step.active p {
1811
+ color: #f35b3f;
1812
+ }
1813
+
1814
+ .f1 fieldset {
1815
+ display: none;
1816
+ text-align: left;
1817
+ }
1818
+
1819
+ .f1-buttons {
1820
+ text-align: right;
1821
+ }
1822
+
1823
+ .f1 .input-error {
1824
+ border-color: #f35b3f;
1825
+ }
1826
+
1827
+ input[type="text"],
1828
+ input[type="password"],
1829
+ textarea,
1830
+ textarea.fz-form-control {
1831
+ width: 100%;
1832
+ height: 44px;
1833
+ margin: 0;
1834
+ padding: 0 20px;
1835
+ border: 1px solid #ddd;
1836
+ border-radius: 4px;
1837
+ color: #888;
1838
+ background: #fff;
1839
+ box-shadow: none;
1840
+ font-family: "Roboto", sans-serif;
1841
+ font-size: 16px;
1842
+ font-weight: 300;
1843
+ line-height: 44px;
1844
+ vertical-align: middle;
1845
+ -webkit-transition: all 0.3s;
1846
+ transition: all 0.3s;
1847
+ }
1848
+
1849
+ textarea,
1850
+ textarea.fz-form-control {
1851
+ height: 90px;
1852
+ padding-top: 8px;
1853
+ padding-bottom: 8px;
1854
+ line-height: 30px;
1855
+ }
1856
+
1857
+ input[type="text"]:focus,
1858
+ input[type="password"]:focus,
1859
+ textarea:focus,
1860
+ textarea.fz-form-control:focus {
1861
+ border: 1px solid #ccc;
1862
+ outline: 0;
1863
+ background: #fff;
1864
+ box-shadow: none;
1865
+ }
1866
+
1867
+ input[type="text"]:-moz-placeholder,
1868
+ input[type="password"]:-moz-placeholder,
1869
+ textarea:-moz-placeholder,
1870
+ textarea.fz-form-control:-moz-placeholder {
1871
+ color: #888;
1872
+ }
1873
+
1874
+ input[type="text"]:-ms-input-placeholder,
1875
+ input[type="password"]:-ms-input-placeholder,
1876
+ textarea:-ms-input-placeholder,
1877
+ textarea.fz-form-control:-ms-input-placeholder {
1878
+ color: #888;
1879
+ }
1880
+
1881
+ input[type="text"]::-webkit-input-placeholder,
1882
+ input[type="password"]::-webkit-input-placeholder,
1883
+ textarea::-webkit-input-placeholder,
1884
+ textarea.fz-form-control::-webkit-input-placeholder {
1885
+ color: #888;
1886
+ }
1887
+
1888
+ label {
1889
+ font-weight: 300;
1890
+ }
1891
+
1892
+ button.fz-btn {
1893
+ min-width: 105px;
1894
+ height: 44px;
1895
+ margin: 0;
1896
+ padding: 0 20px;
1897
+ border: 0;
1898
+ border-radius: 4px;
1899
+ color: #fff;
1900
+ box-shadow: none;
1901
+ text-shadow: none;
1902
+ font-family: "Roboto", sans-serif;
1903
+ font-size: 16px;
1904
+ font-weight: 300;
1905
+ line-height: 40px;
1906
+ vertical-align: middle;
1907
+ -webkit-transition: all 0.3s;
1908
+ transition: all 0.3s;
1909
+ }
1910
+
1911
+ button.fz-btn:hover {
1912
+ opacity: 0.6;
1913
+ color: #fff;
1914
+ }
1915
+
1916
+ button.fz-btn:active {
1917
+ outline: 0;
1918
+ opacity: 0.6;
1919
+ color: #fff;
1920
+ box-shadow: none;
1921
+ }
1922
+
1923
+ button.fz-btn:focus,
1924
+ button.fz-btn:active:focus,
1925
+ button.fz-btn.active:focus {
1926
+ outline: 0;
1927
+ opacity: 0.6;
1928
+ color: #fff;
1929
+ }
1930
+
1931
+ button.fz-btn.fz-btn-next,
1932
+ button.fz-btn.fz-btn-next:focus,
1933
+ button.fz-btn.fz-btn-next:active:focus,
1934
+ button.fz-btn.fz-btn-next.active:focus {
1935
+ background: #f35b3f;
1936
+ }
1937
+
1938
+ button.fz-btn.fz-btn-submit,
1939
+ button.fz-btn.fz-btn-submit:focus,
1940
+ button.fz-btn.fz-btn-submit:active:focus,
1941
+ button.fz-btn.fz-btn-submit.active:focus {
1942
+ background: #f35b3f;
1943
+ }
1944
+
1945
+ button.fz-btn.fz-btn-previous,
1946
+ button.fz-btn.fz-btn-previous:focus,
1947
+ button.fz-btn.fz-btn-previous:active:focus,
1948
+ button.fz-btn.fz-btn-previous.active:focus {
1949
+ background: #bbb;
1950
+ }
1951
+
1952
+ button.fz-btn.fz-btn-submit.fz-btn-activate,
1953
+ button.fz-btn.fz-btn-submit.fz-btn-activate:focus,
1954
+ button.fz-btn.fz-btn-submit.fz-btn-activate:active:focus,
1955
+ button.fz-btn.fz-btn-submit.fz-btn-activate.active:focus {
1956
+ background: #8ce196;
1957
+ }
1958
+
1959
+ /*
1960
+ Toggle switches
1961
+ */
1962
+ .feedzy-toggle {
1963
+ visibility: hidden;
1964
+ position: absolute;
1965
+ margin-left: -9999px;
1966
+ }
1967
+
1968
+ .feedzy-toggle + label {
1969
+ display: block;
1970
+ position: relative;
1971
+ outline: none;
1972
+ cursor: pointer;
1973
+ -webkit-user-select: none;
1974
+ -moz-user-select: none;
1975
+ -ms-user-select: none;
1976
+ user-select: none;
1977
+ }
1978
+
1979
+ input.feedzy-toggle-round + label {
1980
+ width: 60px;
1981
+ height: 30px;
1982
+ padding: 2px;
1983
+ border-radius: 30px;
1984
+ background-color: #ddd;
1985
+ }
1986
+
1987
+ input.feedzy-toggle-round + label:before,
1988
+ input.feedzy-toggle-round + label:after {
1989
+ display: block;
1990
+ position: absolute;
1991
+ top: 1px;
1992
+ bottom: 1px;
1993
+ left: 1px;
1994
+ content: "";
1995
+ }
1996
+
1997
+ input.feedzy-toggle-round + label:before {
1998
+ right: 1px;
1999
+ border-radius: 15px;
2000
+ background-color: #f1f1f1;
2001
+ -webkit-transition: background 0.4s;
2002
+ transition: background 0.4s;
2003
+ }
2004
+
2005
+ input.feedzy-toggle-round + label:after {
2006
+ width: 28px;
2007
+ border-radius: 100%;
2008
+ background-color: #fff;
2009
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
2010
+ -webkit-transition: margin 0.4s;
2011
+ transition: margin 0.4s;
2012
+ }
2013
+
2014
+ input.feedzy-toggle-round:checked + label:before {
2015
+ background-color: #8ce196;
2016
+ }
2017
+
2018
+ input.feedzy-toggle-round:checked + label:after {
2019
+ margin-left: 34px;
2020
+ }
2021
+
2022
+ /*
2023
+ !!! CAUTION -- Hides Core WordPress Post Elements
2024
+ */
2025
+
2026
+ .post-type-feedzy_imports #poststuff #post-body.columns-2 {
2027
+ margin-right: 0;
2028
+ }
2029
+
2030
+ .post-type-feedzy_imports div#side-sortables {
2031
+ display: none;
2032
+ }
2033
+
2034
+ .post-type-feedzy_imports #titlediv .inside {
2035
+ display: none;
2036
+ }
2037
+
2038
+ .post-type-feedzy_imports div#advanced-sortables {
2039
+ display: none;
2040
+ }
2041
+
2042
+ .fz-feature-features button.fz-btn.fz-btn-submit.fz-btn-activate,
2043
+ .fz-feature-features button.fz-btn.fz-btn-submit.fz-btn-activate:focus,
2044
+ .fz-feature-features button.fz-btn.fz-btn-submit.fz-btn-activate:active:focus,
2045
+ .fz-feature-features button.fz-btn.fz-btn-submit.fz-btn-activate.active:focus {
2046
+ background-color: #62c370;
2047
+ }
feedzy-rss-feed.php CHANGED
@@ -15,7 +15,7 @@
15
  * Plugin Name: Feedzy RSS Feeds Lite
16
  * Plugin URI: https://themeisle.com/plugins/feedzy-rss-feeds-lite/
17
  * Description: A small and lightweight RSS aggregator plugin. Fast and very easy to use, it allows you to aggregate multiple RSS feeds into your WordPress site through fully customizable shortcodes & widgets.
18
- * Version: 3.2.0
19
  * Author: Themeisle
20
  * Author URI: http://themeisle.com
21
  * License: GPL-2.0+
@@ -102,19 +102,40 @@ function run_feedzy_rss_feeds() {
102
  define( 'FEEDZY_ABSURL', plugins_url( '/', __FILE__ ) );
103
  define( 'FEEDZY_ABSPATH', dirname( __FILE__ ) );
104
  define( 'FEEDZY_UPSELL_LINK', 'https://themeisle.com/plugins/feedzy-rss-feeds/' );
 
 
 
 
105
  $feedzy = Feedzy_Rss_Feeds::instance();
106
  $feedzy->run();
107
  $vendor_file = FEEDZY_ABSPATH . '/vendor/autoload_52.php';
108
  if ( is_readable( $vendor_file ) ) {
109
  require_once $vendor_file;
110
  }
111
- add_filter(
112
- 'themeisle_sdk_products', function ( $products ) {
113
- $products[] = FEEDZY_BASEFILE;
114
 
115
- return $products;
116
- }
117
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  }
119
 
120
  spl_autoload_register( 'feedzy_rss_feeds_autoload' );
15
  * Plugin Name: Feedzy RSS Feeds Lite
16
  * Plugin URI: https://themeisle.com/plugins/feedzy-rss-feeds-lite/
17
  * Description: A small and lightweight RSS aggregator plugin. Fast and very easy to use, it allows you to aggregate multiple RSS feeds into your WordPress site through fully customizable shortcodes & widgets.
18
+ * Version: 3.2.1
19
  * Author: Themeisle
20
  * Author URI: http://themeisle.com
21
  * License: GPL-2.0+
102
  define( 'FEEDZY_ABSURL', plugins_url( '/', __FILE__ ) );
103
  define( 'FEEDZY_ABSPATH', dirname( __FILE__ ) );
104
  define( 'FEEDZY_UPSELL_LINK', 'https://themeisle.com/plugins/feedzy-rss-feeds/' );
105
+ define( 'FEEDZY_NAME', 'Feedzy RSS Feeds' );
106
+
107
+ // always make this true before testing
108
+ define( 'FEEDZY_DISABLE_CACHE_FOR_TESTING', false );
109
  $feedzy = Feedzy_Rss_Feeds::instance();
110
  $feedzy->run();
111
  $vendor_file = FEEDZY_ABSPATH . '/vendor/autoload_52.php';
112
  if ( is_readable( $vendor_file ) ) {
113
  require_once $vendor_file;
114
  }
 
 
 
115
 
116
+ add_filter( 'themeisle_sdk_products', 'feedzy_register_sdk', 10, 1 );
117
+ add_filter( 'pirate_parrot_log', 'feedzy_register_parrot', 10, 1 );
118
+
119
+ }
120
+
121
+ /**
122
+ * Registers with the SDK
123
+ *
124
+ * @since 1.0.0
125
+ */
126
+ function feedzy_register_sdk( $products ) {
127
+ $products[] = FEEDZY_BASEFILE;
128
+ return $products;
129
+ }
130
+
131
+ /**
132
+ * Registers with the parrot plugin
133
+ *
134
+ * @since 1.0.0
135
+ */
136
+ function feedzy_register_parrot( $plugins ) {
137
+ $plugins[] = FEEDZY_NAME;
138
+ return $plugins;
139
  }
140
 
141
  spl_autoload_register( 'feedzy_rss_feeds_autoload' );
includes/abstract/feedzy-rss-feeds-admin-abstract.php CHANGED
@@ -281,7 +281,7 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
281
  'keywords_title' => '',
282
  // cache refresh
283
  'refresh' => '12_hours',
284
- // only display item if title contains specific keywords (comma-separated list/case sensitive)
285
  ), $atts, 'feedzy_default'
286
  );
287
  $sc = array_merge( $sc, apply_filters( 'feedzy_get_short_code_attributes_filter', $atts ) );
@@ -294,7 +294,9 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
294
  *
295
  * @since 3.0.0
296
  * @updated 3.1.7 Take into account $feedURL as array from PRO version.
 
297
  * @param string $raw Url or list of urls.
 
298
  * @return mixed|void Urls of the feeds.
299
  */
300
  public function normalize_urls( $raw ) {
@@ -312,6 +314,47 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
312
  }
313
 
314
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
315
  * Method to avoid using core implementation in order
316
  * order to fix issues reported here: https://core.trac.wordpress.org/ticket/41304
317
  * Bug: #41304 with WP wp_kses sanitizer used by WP SimplePie implementation.
@@ -320,17 +363,25 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
320
  *
321
  * @since 3.1.7
322
  * @access private
 
323
  * @param string $feedURL The feed URL.
324
  * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
 
325
  * @return SimplePie
326
  */
327
  private function init_feed( $feedURL, $cache ) {
 
 
 
 
 
 
328
  $unit_defaults = array(
329
- 'mins' => MINUTE_IN_SECONDS,
330
  'hours' => HOUR_IN_SECONDS,
331
- 'days' => DAY_IN_SECONDS,
332
  );
333
- $cache_time = 12 * HOUR_IN_SECONDS;
334
  if ( isset( $cache ) && $cache != '' ) {
335
  list( $value, $unit ) = explode( '_', $cache );
336
  if ( isset( $value ) && is_numeric( $value ) && $value >= 1 && $value <= 100 ) {
@@ -339,10 +390,14 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
339
  }
340
  }
341
  }
 
342
  $feed = new SimplePie();
343
- $feed->set_cache_class( 'WP_Feed_Cache' );
344
  $feed->set_file_class( 'WP_SimplePie_File' );
345
- $feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', $cache_time, $feedURL ) );
 
 
 
 
346
  $feed->set_feed_url( $feedURL );
347
  $feed->init();
348
  $feed->handle_content_type();
@@ -350,51 +405,15 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
350
  return $feed;
351
  }
352
 
353
- /**
354
- * Fetch the content feed from a group of urls.
355
- *
356
- * @since 3.0.0
357
- * @access public
358
- * @updated 3.2.0
359
- * @param array $feedURL The feeds urls to fetch content from.
360
- * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
361
- * @return SimplePie|string|void|WP_Error The feed resource.
362
- */
363
- public function fetch_feed( $feedURL, $cache = '12_hours' ) {
364
- // Load SimplePie if not already
365
- if ( ! class_exists( 'SimplePie' ) ) {
366
- require_once( ABSPATH . WPINC . '/feed.php' );
367
- }
368
- // Load SimplePie Instance
369
- $feed = fetch_feed( $feedURL ); // Not used as log as #41304 is Opened.
370
-
371
- // Report error when is an error loading the feed
372
- if ( is_wp_error( $feed ) ) {
373
- // Fallback for different edge cases.
374
- if ( is_array( $feedURL ) ) {
375
- $feedURL = array_map( 'html_entity_decode', $feedURL );
376
- } else {
377
- $feedURL = html_entity_decode( $feedURL );
378
- }
379
-
380
- $feedURL = $this->get_valid_feed_urls( $feedURL, $cache );
381
-
382
- // $feed = fetch_feed( $validFeedURL ); // Not used as log as #41304 is Opened.
383
- }
384
-
385
- $feed = $this->init_feed( $feedURL, $cache ); // Added in 3.1.7 -- TODO: Remove this line when #41304 is fixed.
386
-
387
- // var_dump( $feed );
388
- return $feed;
389
- }
390
-
391
  /**
392
  * Returns only valid URLs for fetching.
393
  *
394
  * @since 3.2.0
395
  * @access private
 
396
  * @param array|string $feedURL The feeds URL/s.
397
  * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
 
398
  * @return array
399
  */
400
  private function get_valid_feed_urls( $feedURL, $cache ) {
@@ -423,8 +442,10 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
423
  *
424
  * @since 3.2.0
425
  * @access private
 
426
  * @param string $url The URL to validate.
427
  * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
 
428
  * @return bool
429
  */
430
  private function check_valid_xml( $url, $cache ) {
@@ -432,6 +453,7 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
432
  if ( $feed->error() ) {
433
  return false;
434
  }
 
435
  return true;
436
  }
437
 
@@ -851,7 +873,7 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
851
  */
852
  public function feedzy_scrape_image( $string, $link = '' ) {
853
  $pattern = '/src=[\'"]?([^\'" >]+)[\'" >]/';
854
- $match = $link;
855
  preg_match( $pattern, $string, $link );
856
  if ( ! empty( $link ) && isset( $link[1] ) ) {
857
  $match = $link[1];
@@ -923,25 +945,14 @@ abstract class Feedzy_Rss_Feeds_Admin_Abstract {
923
  }
924
  }
925
  // Encode image name only en keep extra parameters
926
- $query = $extention = '';
927
- $url_tab = parse_url( $string );
928
  if ( isset( $url_tab['query'] ) ) {
929
  $query = '?' . $url_tab['query'];
930
  }
931
- $path_parts = pathinfo( $string );
932
- $path = $path_parts['dirname'];
933
- $file = rawurldecode( $path_parts['filename'] );
934
- $extention = pathinfo( $url_tab['path'], PATHINFO_EXTENSION );
935
- if ( ! empty( $extention ) ) {
936
- $extention = '.' . $extention;
937
- } else {
938
- if ( isset( $path_parts['extension'] ) ) {
939
- $extention = '.' . $path_parts['extension'];
940
- }
941
- }
942
 
943
  // Return a well encoded image url
944
- return $path . '/' . rawurlencode( $file ) . $extention . $query;
945
  }
946
 
947
  /**
281
  'keywords_title' => '',
282
  // cache refresh
283
  'refresh' => '12_hours',
284
+ // only display item if title contains specific keywords (comma-separated list/case sensitive)
285
  ), $atts, 'feedzy_default'
286
  );
287
  $sc = array_merge( $sc, apply_filters( 'feedzy_get_short_code_attributes_filter', $atts ) );
294
  *
295
  * @since 3.0.0
296
  * @updated 3.1.7 Take into account $feedURL as array from PRO version.
297
+ *
298
  * @param string $raw Url or list of urls.
299
+ *
300
  * @return mixed|void Urls of the feeds.
301
  */
302
  public function normalize_urls( $raw ) {
314
  }
315
 
316
  /**
317
+ * Fetch the content feed from a group of urls.
318
+ *
319
+ * @since 3.0.0
320
+ * @access public
321
+ * @updated 3.2.0
322
+ *
323
+ * @param array $feedURL The feeds urls to fetch content from.
324
+ * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
325
+ *
326
+ * @return SimplePie|string|void|WP_Error The feed resource.
327
+ */
328
+ public function fetch_feed( $feedURL, $cache = '12_hours' ) {
329
+ // Load SimplePie if not already
330
+ do_action( 'feedzy_pre_http_setup', $feedURL );
331
+
332
+ // Load SimplePie Instance
333
+ $feed = $this->init_feed( $feedURL, $cache ); // Not used as log as #41304 is Opened.
334
+
335
+ // Report error when is an error loading the feed
336
+ if ( is_wp_error( $feed ) ) {
337
+ // Fallback for different edge cases.
338
+ if ( is_array( $feedURL ) ) {
339
+ $feedURL = array_map( 'html_entity_decode', $feedURL );
340
+ } else {
341
+ $feedURL = html_entity_decode( $feedURL );
342
+ }
343
+
344
+ $feedURL = $this->get_valid_feed_urls( $feedURL, $cache );
345
+
346
+ $feed = $this->init_feed( $feedURL, $cache ); // Not used as log as #41304 is Opened.
347
+
348
+ }
349
+
350
+ do_action( 'feedzy_post_http_teardown', $feedURL );
351
+
352
+ // var_dump( $feed );
353
+ return $feed;
354
+ }
355
+
356
+ /**
357
+ *
358
  * Method to avoid using core implementation in order
359
  * order to fix issues reported here: https://core.trac.wordpress.org/ticket/41304
360
  * Bug: #41304 with WP wp_kses sanitizer used by WP SimplePie implementation.
363
  *
364
  * @since 3.1.7
365
  * @access private
366
+ *
367
  * @param string $feedURL The feed URL.
368
  * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
369
+ *
370
  * @return SimplePie
371
  */
372
  private function init_feed( $feedURL, $cache ) {
373
+ if ( ! class_exists( 'SimplePie' ) ) {
374
+ require_once( ABSPATH . WPINC . '/class-simplepie.php' );
375
+ require_once( ABSPATH . WPINC . '/class-wp-feed-cache.php' );
376
+ require_once( ABSPATH . WPINC . '/class-wp-feed-cache-transient.php' );
377
+ require_once( ABSPATH . WPINC . '/class-wp-simplepie-file.php' );
378
+ }
379
  $unit_defaults = array(
380
+ 'mins' => MINUTE_IN_SECONDS,
381
  'hours' => HOUR_IN_SECONDS,
382
+ 'days' => DAY_IN_SECONDS,
383
  );
384
+ $cache_time = 12 * HOUR_IN_SECONDS;
385
  if ( isset( $cache ) && $cache != '' ) {
386
  list( $value, $unit ) = explode( '_', $cache );
387
  if ( isset( $value ) && is_numeric( $value ) && $value >= 1 && $value <= 100 ) {
390
  }
391
  }
392
  }
393
+
394
  $feed = new SimplePie();
 
395
  $feed->set_file_class( 'WP_SimplePie_File' );
396
+ $feed->set_useragent( apply_filters( 'http_headers_useragent', SIMPLEPIE_USERAGENT ) );
397
+ if ( ! FEEDZY_DISABLE_CACHE_FOR_TESTING ) {
398
+ $feed->set_cache_class( 'WP_Feed_Cache' );
399
+ $feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', $cache_time, $feedURL ) );
400
+ }
401
  $feed->set_feed_url( $feedURL );
402
  $feed->init();
403
  $feed->handle_content_type();
405
  return $feed;
406
  }
407
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
408
  /**
409
  * Returns only valid URLs for fetching.
410
  *
411
  * @since 3.2.0
412
  * @access private
413
+ *
414
  * @param array|string $feedURL The feeds URL/s.
415
  * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
416
+ *
417
  * @return array
418
  */
419
  private function get_valid_feed_urls( $feedURL, $cache ) {
442
  *
443
  * @since 3.2.0
444
  * @access private
445
+ *
446
  * @param string $url The URL to validate.
447
  * @param string $cache The cache string (eg. 1_hour, 30_min etc.).
448
+ *
449
  * @return bool
450
  */
451
  private function check_valid_xml( $url, $cache ) {
453
  if ( $feed->error() ) {
454
  return false;
455
  }
456
+
457
  return true;
458
  }
459
 
873
  */
874
  public function feedzy_scrape_image( $string, $link = '' ) {
875
  $pattern = '/src=[\'"]?([^\'" >]+)[\'" >]/';
876
+ $match = $link;
877
  preg_match( $pattern, $string, $link );
878
  if ( ! empty( $link ) && isset( $link[1] ) ) {
879
  $match = $link[1];
945
  }
946
  }
947
  // Encode image name only en keep extra parameters
948
+ $query = '';
 
949
  if ( isset( $url_tab['query'] ) ) {
950
  $query = '?' . $url_tab['query'];
951
  }
952
+ $path = $url_tab['path'];
 
 
 
 
 
 
 
 
 
 
953
 
954
  // Return a well encoded image url
955
+ return $url_tab['scheme'] . '://' . $url_tab['host'] . '/' . $path . $query;
956
  }
957
 
958
  /**
includes/admin/feedzy-rss-feeds-admin.php CHANGED
@@ -24,6 +24,20 @@
24
  */
25
  class Feedzy_Rss_Feeds_Admin extends Feedzy_Rss_Feeds_Admin_Abstract {
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  /**
28
  * The version of this plugin.
29
  *
@@ -73,7 +87,12 @@ class Feedzy_Rss_Feeds_Admin extends Feedzy_Rss_Feeds_Admin_Abstract {
73
  * between the defined hooks and the functions defined in this
74
  * class.
75
  */
76
- wp_enqueue_style( $this->plugin_name, FEEDZY_ABSURL . 'css/feedzy-rss-feeds.css', array(), $this->version, 'all' );
 
 
 
 
 
77
  }
78
 
79
  /**
@@ -95,7 +114,6 @@ class Feedzy_Rss_Feeds_Admin extends Feedzy_Rss_Feeds_Admin_Abstract {
95
  * between the defined hooks and the functions defined in this
96
  * class.
97
  */
98
-
99
  }
100
 
101
  /**
@@ -329,5 +347,148 @@ class Feedzy_Rss_Feeds_Admin extends Feedzy_Rss_Feeds_Admin_Abstract {
329
  add_submenu_page( 'feedzy-admin-menu', __( 'Import Posts', 'feedzy-rss-feeds' ), __( 'Import Posts', 'feedzy-rss-feeds' ), 'manage_options', 'edit.php?post_type=feedzy_imports' );
330
  }
331
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
333
  }
24
  */
25
  class Feedzy_Rss_Feeds_Admin extends Feedzy_Rss_Feeds_Admin_Abstract {
26
 
27
+ /**
28
+ * Any notice we want to show in the settings screen.
29
+ *
30
+ * @access public
31
+ * @var string $notice The notice.
32
+ */
33
+ public $notice;
34
+ /**
35
+ * Any error we want to show in the settings screen.
36
+ *
37
+ * @access public
38
+ * @var string $error The error.
39
+ */
40
+ public $error;
41
  /**
42
  * The version of this plugin.
43
  *
87
  * between the defined hooks and the functions defined in this
88
  * class.
89
  */
90
+
91
+ wp_enqueue_style( $this->plugin_name, FEEDZY_ABSURL . 'css/feedzy-rss-feeds.css', array( 'feedzy-settings' ), $this->version, 'all' );
92
+
93
+ wp_enqueue_style( 'feedzy-upsell', FEEDZY_ABSURL . '/includes/layouts/css/upsell.css' );
94
+
95
+ wp_enqueue_style( 'feedzy-settings', FEEDZY_ABSURL . 'css/metabox-settings.css', array( 'feedzy-upsell' ) );
96
  }
97
 
98
  /**
114
  * between the defined hooks and the functions defined in this
115
  * class.
116
  */
 
117
  }
118
 
119
  /**
347
  add_submenu_page( 'feedzy-admin-menu', __( 'Import Posts', 'feedzy-rss-feeds' ), __( 'Import Posts', 'feedzy-rss-feeds' ), 'manage_options', 'edit.php?post_type=feedzy_imports' );
348
  }
349
  }
350
+ add_submenu_page(
351
+ 'feedzy-admin-menu', __( 'Settings', 'feedzy-rss-feeds' ), __( 'Settings', 'feedzy-rss-feeds' ), 'manage_options', 'feedzy-settings', array(
352
+ $this,
353
+ 'feedzy_settings_page',
354
+ )
355
+ );
356
+ }
357
+
358
+ /**
359
+ * Method to register the settings page.
360
+ *
361
+ * @access public
362
+ */
363
+ public function feedzy_settings_page() {
364
+ if ( isset( $_POST['feedzy-settings-submit'] ) && isset( $_POST['tab'] ) && wp_verify_nonce( $_POST['nonce'], $_POST['tab'] ) ) {
365
+ $this->save_settings();
366
+ $this->notice = __( 'Your settings were saved.', 'feedzy-rss-feeds' );
367
+ }
368
+
369
+ $settings = apply_filters( 'feedzy_get_settings', array() );
370
+ include( FEEDZY_ABSPATH . '/includes/layouts/settings.php' );
371
+ }
372
+
373
+ /**
374
+ * Method to save the settings.
375
+ *
376
+ * @access private
377
+ */
378
+ private function save_settings() {
379
+ $settings = apply_filters( 'feedzy_get_settings', array() );
380
+ switch ( $_POST['tab'] ) {
381
+ case 'headers':
382
+ $settings['header']['user-agent'] = $_POST['user-agent'];
383
+ break;
384
+ case 'proxy':
385
+ $settings['proxy'] = array(
386
+ 'host' => $_POST['proxy-host'],
387
+ 'port' => $_POST['proxy-port'],
388
+ 'user' => $_POST['proxy-user'],
389
+ 'pass' => $_POST['proxy-pass'],
390
+ );
391
+ break;
392
+ }
393
+
394
+ update_option( 'feedzy-settings', $settings );
395
+ }
396
+
397
+ /**
398
+ * Method to get the settings.
399
+ *
400
+ * @access public
401
+ */
402
+ public function get_settings() {
403
+ $settings = get_option( 'feedzy-settings' );
404
+
405
+ return $settings;
406
+ }
407
+
408
+ /**
409
+ * Set up the HTTP parameters/headers.
410
+ *
411
+ * @access public
412
+ */
413
+ public function pre_http_setup( $url ) {
414
+ $this->add_proxy( $url );
415
+ add_filter( 'http_headers_useragent', array( $this, 'add_user_agent' ) );
416
+ }
417
+
418
+ /**
419
+ * Add the proxy settings as specified in the settings.
420
+ *
421
+ * @access private
422
+ */
423
+ private function add_proxy( $url ) {
424
+ $settings = apply_filters( 'feedzy_get_settings', null );
425
+ if ( $settings && is_array( $settings['proxy'] ) && ! empty( $settings['proxy'] ) ) {
426
+ // if even one constant is defined, escape.
427
+ if ( defined( 'WP_PROXY_HOST' ) || defined( 'WP_PROXY_PORT' ) || defined( 'WP_PROXY_USERNAME' ) || defined( 'WP_PROXY_PASSWORD' ) ) {
428
+ do_action( 'themeisle_log_event', FEEDZY_NAME, 'Some proxy constants already defined; ignoring proxy settings', 'info', __FILE__, __LINE__ );
429
+
430
+ return;
431
+ }
432
+ if ( isset( $settings['proxy']['host'] ) ) {
433
+ define( 'WP_PROXY_HOST', $settings['proxy']['host'] );
434
+ }
435
+ if ( isset( $settings['proxy']['port'] ) ) {
436
+ define( 'WP_PROXY_PORT', $settings['proxy']['port'] );
437
+ }
438
+ if ( isset( $settings['proxy']['user'] ) ) {
439
+ define( 'WP_PROXY_USERNAME', $settings['proxy']['user'] );
440
+ }
441
+ if ( isset( $settings['proxy']['pass'] ) ) {
442
+ define( 'WP_PROXY_PASSWORD', $settings['proxy']['pass'] );
443
+ }
444
+
445
+ // temporary constant for use in the pre_http_send_through_proxy filter.
446
+ if ( ! defined( 'FEEZY_URL_THRU_PROXY' ) ) {
447
+ define( 'FEEZY_URL_THRU_PROXY', $url );
448
+ }
449
+ add_filter( 'pre_http_send_through_proxy', array( $this, 'send_through_proxy' ), 10, 4 );
450
+ }
451
  }
452
+
453
+ /**
454
+ * Add the user agent if specified in the settings.
455
+ *
456
+ * @access public
457
+ */
458
+ public function add_user_agent( $ua ) {
459
+ $settings = apply_filters( 'feedzy_get_settings', null );
460
+ if ( $settings && isset( $settings['header']['user-agent'] ) && ! empty( $settings['header']['user-agent'] ) ) {
461
+ do_action( 'themeisle_log_event', FEEDZY_NAME, sprintf( 'Override user-agent from %s to %s', $ua, $settings['header']['user-agent'] ), 'info', __FILE__, __LINE__ );
462
+ $ua = $settings['header']['user-agent'];
463
+ }
464
+
465
+ return $ua;
466
+ }
467
+
468
+ /**
469
+ * Check if the uri should go through the proxy.
470
+ *
471
+ * @access public
472
+ */
473
+ public function send_through_proxy( $return, $uri, $check, $home ) {
474
+ $proxied = defined( 'FEEZY_URL_THRU_PROXY' ) ? FEEZY_URL_THRU_PROXY : null;
475
+ if ( $proxied && ( ( is_array( $proxied ) && in_array( $uri, $proxied ) ) || $uri === $proxied ) ) {
476
+ do_action( 'themeisle_log_event', FEEDZY_NAME, sprintf( 'sending %s through proxy', $uri ), 'info', __FILE__, __LINE__ );
477
+
478
+ return true;
479
+ }
480
+
481
+ return false;
482
+ }
483
+
484
+ /**
485
+ * Teardown the HTTP parameters/headers.
486
+ *
487
+ * @access public
488
+ */
489
+ public function post_http_teardown( $url ) {
490
+ remove_filter( 'http_headers_useragent', array( $this, 'add_user_agent' ) );
491
+ }
492
+
493
+
494
  }
includes/feedzy-rss-feeds.php CHANGED
@@ -104,7 +104,7 @@ class Feedzy_Rss_Feeds {
104
  */
105
  public function init() {
106
  self::$plugin_name = 'feedzy-rss-feeds';
107
- self::$version = '3.2.0';
108
  self::$instance->load_dependencies();
109
  self::$instance->set_locale();
110
  self::$instance->define_admin_hooks();
@@ -190,6 +190,8 @@ class Feedzy_Rss_Feeds {
190
  self::$instance->loader->add_action( 'init', $plugin_ui, 'register_init' );
191
  self::$instance->loader->add_action( 'init', self::$instance->admin, 'register_post_type' );
192
  self::$instance->loader->add_action( 'save_post', self::$instance->admin, 'save_feedzy_post_type_meta', 1, 2 );
 
 
193
 
194
  self::$instance->loader->add_action( 'manage_feedzy_categories_posts_custom_column', self::$instance->admin, 'manage_feedzy_category_columns', 10, 2 );
195
  self::$instance->loader->add_filter( 'manage_feedzy_categories_posts_columns', self::$instance->admin, 'feedzy_category_columns' );
@@ -207,6 +209,7 @@ class Feedzy_Rss_Feeds {
207
  self::$instance->loader->add_filter( 'feedzy_get_feed_array', self::$instance->admin, 'get_feed_array', 10, 5 );
208
  self::$instance->loader->add_filter( 'feedzy_process_feed_source', self::$instance->admin, 'process_feed_source', 10, 1 );
209
  self::$instance->loader->add_filter( 'feedzy_get_feed_url', self::$instance->admin, 'get_feed_url', 10, 1 );
 
210
  add_shortcode( 'feedzy-rss', array( self::$instance->admin, 'feedzy_rss' ) );
211
  self::$instance->loader->add_action( 'wp_ajax_get_tinymce_form', self::$instance->admin, 'get_tinymce_form' );
212
  self::$instance->loader->add_action( 'wp_enqueue_scripts', self::$instance->admin, 'enqueue_styles' );
104
  */
105
  public function init() {
106
  self::$plugin_name = 'feedzy-rss-feeds';
107
+ self::$version = '3.2.1';
108
  self::$instance->load_dependencies();
109
  self::$instance->set_locale();
110
  self::$instance->define_admin_hooks();
190
  self::$instance->loader->add_action( 'init', $plugin_ui, 'register_init' );
191
  self::$instance->loader->add_action( 'init', self::$instance->admin, 'register_post_type' );
192
  self::$instance->loader->add_action( 'save_post', self::$instance->admin, 'save_feedzy_post_type_meta', 1, 2 );
193
+ self::$instance->loader->add_action( 'feedzy_pre_http_setup', self::$instance->admin, 'pre_http_setup', 10, 1 );
194
+ self::$instance->loader->add_action( 'feedzy_post_http_teardown', self::$instance->admin, 'post_http_teardown', 10, 1 );
195
 
196
  self::$instance->loader->add_action( 'manage_feedzy_categories_posts_custom_column', self::$instance->admin, 'manage_feedzy_category_columns', 10, 2 );
197
  self::$instance->loader->add_filter( 'manage_feedzy_categories_posts_columns', self::$instance->admin, 'feedzy_category_columns' );
209
  self::$instance->loader->add_filter( 'feedzy_get_feed_array', self::$instance->admin, 'get_feed_array', 10, 5 );
210
  self::$instance->loader->add_filter( 'feedzy_process_feed_source', self::$instance->admin, 'process_feed_source', 10, 1 );
211
  self::$instance->loader->add_filter( 'feedzy_get_feed_url', self::$instance->admin, 'get_feed_url', 10, 1 );
212
+ self::$instance->loader->add_filter( 'feedzy_get_settings', self::$instance->admin, 'get_settings', 10, 1 );
213
  add_shortcode( 'feedzy-rss', array( self::$instance->admin, 'feedzy_rss' ) );
214
  self::$instance->loader->add_action( 'wp_ajax_get_tinymce_form', self::$instance->admin, 'get_tinymce_form' );
215
  self::$instance->loader->add_action( 'wp_enqueue_scripts', self::$instance->admin, 'enqueue_styles' );
includes/layouts/css/upsell.css CHANGED
@@ -6,15 +6,14 @@
6
  * @package feedzy-rss-feeds
7
  */
8
 
9
- #pro-features .pro-features-header {
10
- -webkit-box-sizing: border-box;
11
  box-sizing: border-box;
12
  padding: 20px 30px 30px;
13
  border-top: 5px solid #252b37;
14
  background: #fff;
15
  }
16
 
17
- #pro-features .logo {
18
  display: inline-block;
19
  margin: 0 0 0 20px;
20
  padding: 0 0 0 70px;
@@ -28,7 +27,7 @@
28
  letter-spacing: -1px;
29
  }
30
 
31
- #pro-features .slogan {
32
  display: inline-block;
33
  margin: 0 0 0 8px;
34
  padding: 0;
@@ -39,7 +38,7 @@
39
  vertical-align: 4px;
40
  }
41
 
42
- #pro-features .slogan a {
43
  color: #858585;
44
  font-weight: 600;
45
  font-style: italic;
@@ -48,23 +47,22 @@
48
  transition: all 0.250s ease-in-out;
49
  }
50
 
51
- #pro-features .slogan a:hover {
52
  color: #ff6160;
53
  }
54
 
55
- #pro-features .slogan a:focus {
56
  outline: none;
57
- -webkit-box-shadow: none;
58
  box-shadow: none;
59
  }
60
 
61
- #pro-features .header-btns {
62
  float: right;
63
  margin: 7px 20px;
64
  text-align: right;
65
  }
66
 
67
- #pro-features .header-btns .buy-now {
68
  display: inline-block;
69
  margin-top: 2px;
70
  margin-right: 5px;
@@ -82,117 +80,114 @@
82
  transition: all 0.250s ease-in-out;
83
  }
84
 
85
- #pro-features .header-btns .buy-now:hover {
86
  background: #252b37;
87
  }
88
 
89
- #pro-features .header-btns .buy-now .dashicons {
90
  padding-right: 3px;
91
  }
92
 
93
- #pro-features {
94
  padding: 0;
95
  }
96
 
97
- #pro-features .pro-features-content {
98
  width: 100%;
99
  padding: 0;
100
  }
101
 
102
- #pro-features .pro-features-header,
103
- #pro-features .pro-feature {
104
  display: table;
105
  float: left;
106
- -webkit-box-sizing: border-box;
107
  box-sizing: border-box;
108
  width: 100%;
109
  margin: 30px 0 0;
110
  padding: 30px;
111
  background-color: #fff;
112
- -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
113
  box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
114
  }
115
 
116
- #pro-features .pro-feature .pro-feature-features,
117
- #pro-features .pro-feature .pro-feature-image {
118
  display: table-cell;
119
  margin: 0;
120
  vertical-align: middle;
121
  }
122
 
123
- #pro-features .pro-feature .pro-feature-features {
124
- -webkit-box-sizing: border-box;
125
  box-sizing: border-box;
126
  padding: 0 0 20px;
127
  }
128
 
129
- #pro-features .pro-feature .pro-feature-image {
130
  width: 470px;
131
  }
132
 
133
- #pro-features .pro-feature .pro-feature-features h2 {
134
  margin: 0 0 20px;
135
  font-size: 28px;
136
  font-weight: 700;
137
  line-height: 1.2;
138
  }
139
 
140
- #pro-features .pro-feature .pro-feature-features h4 {
141
  margin: 0 0 10px;
142
  font-size: 24px;
143
  }
144
 
145
- #pro-features .pro-feature .pro-feature-features p {
146
  margin: 0 0 15px;
147
  font-size: 18px;
148
  line-height: 1.5;
149
  }
150
 
151
- #pro-features .pro-feature .pro-feature-image img {
152
  width: 100%;
153
  height: auto;
154
  }
155
 
156
  @media screen and (min-width: 768px) {
157
- #pro-features {
158
  padding: 0 15px;
159
  }
160
  }
161
 
162
  @media screen and (min-width: 1200px) {
163
- #pro-features .pro-feature {
164
  padding: 30px 60px;
165
  }
166
 
167
- #pro-features .pro-feature .pro-feature-features {
168
  padding: 0 30px 0 0;
169
  }
170
 
171
- #pro-features .pro-feature .pro-feature-features h2 {
172
  font-size: 30px;
173
  }
174
 
175
- #pro-features .pro-feature .pro-feature-features p {
176
  font-size: 20px;
177
  }
178
  }
179
 
180
  @media screen and (min-width: 1500px) {
181
- #pro-features .pro-feature .pro-feature-features {
182
  padding: 0 120px 0 0;
183
  }
184
  }
185
 
186
  @media screen and (max-width: 1100px) {
187
- #pro-features {
188
  text-align: center;
189
  }
190
 
191
- #pro-features .logo {
192
  margin-left: 0;
193
  }
194
 
195
- #pro-features .header-btns {
196
  display: block;
197
  float: none;
198
  margin: 10px 0 0;
@@ -201,18 +196,41 @@
201
  }
202
 
203
  @media screen and (max-width: 1200px) {
204
- #pro-features .pro-feature .pro-feature-features,
205
- #pro-features .pro-feature .pro-feature-image {
206
  display: block;
207
  }
208
 
209
- #pro-features .pro-feature .pro-feature-image {
210
  display: inline-block;
211
  max-width: 100%;
212
  margin: 0 auto 30px;
213
  }
214
 
215
- #pro-features .slogan {
216
  display: none;
217
  }
218
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  * @package feedzy-rss-feeds
7
  */
8
 
9
+ #fz-features .fz-features-header {
 
10
  box-sizing: border-box;
11
  padding: 20px 30px 30px;
12
  border-top: 5px solid #252b37;
13
  background: #fff;
14
  }
15
 
16
+ #fz-features .logo {
17
  display: inline-block;
18
  margin: 0 0 0 20px;
19
  padding: 0 0 0 70px;
27
  letter-spacing: -1px;
28
  }
29
 
30
+ #fz-features .slogan {
31
  display: inline-block;
32
  margin: 0 0 0 8px;
33
  padding: 0;
38
  vertical-align: 4px;
39
  }
40
 
41
+ #fz-features .slogan a {
42
  color: #858585;
43
  font-weight: 600;
44
  font-style: italic;
47
  transition: all 0.250s ease-in-out;
48
  }
49
 
50
+ #fz-features .slogan a:hover {
51
  color: #ff6160;
52
  }
53
 
54
+ #fz-features .slogan a:focus {
55
  outline: none;
 
56
  box-shadow: none;
57
  }
58
 
59
+ #fz-features .header-btns {
60
  float: right;
61
  margin: 7px 20px;
62
  text-align: right;
63
  }
64
 
65
+ #fz-features .header-btns .buy-now {
66
  display: inline-block;
67
  margin-top: 2px;
68
  margin-right: 5px;
80
  transition: all 0.250s ease-in-out;
81
  }
82
 
83
+ #fz-features .header-btns .buy-now:hover {
84
  background: #252b37;
85
  }
86
 
87
+ #fz-features .header-btns .buy-now .dashicons {
88
  padding-right: 3px;
89
  }
90
 
91
+ #fz-features {
92
  padding: 0;
93
  }
94
 
95
+ #fz-features .fz-features-content {
96
  width: 100%;
97
  padding: 0;
98
  }
99
 
100
+ #fz-features .fz-features-header,
101
+ #fz-features .fz-feature {
102
  display: table;
103
  float: left;
 
104
  box-sizing: border-box;
105
  width: 100%;
106
  margin: 30px 0 0;
107
  padding: 30px;
108
  background-color: #fff;
 
109
  box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
110
  }
111
 
112
+ #fz-features .fz-feature .fz-feature-features,
113
+ #fz-features .fz-feature .fz-feature-image {
114
  display: table-cell;
115
  margin: 0;
116
  vertical-align: middle;
117
  }
118
 
119
+ #fz-features .fz-feature .fz-feature-features {
 
120
  box-sizing: border-box;
121
  padding: 0 0 20px;
122
  }
123
 
124
+ #fz-features .fz-feature .fz-feature-image {
125
  width: 470px;
126
  }
127
 
128
+ #fz-features .fz-feature .fz-feature-features h2 {
129
  margin: 0 0 20px;
130
  font-size: 28px;
131
  font-weight: 700;
132
  line-height: 1.2;
133
  }
134
 
135
+ #fz-features .fz-feature .fz-feature-features h4 {
136
  margin: 0 0 10px;
137
  font-size: 24px;
138
  }
139
 
140
+ #fz-features .fz-feature .fz-feature-features p {
141
  margin: 0 0 15px;
142
  font-size: 18px;
143
  line-height: 1.5;
144
  }
145
 
146
+ #fz-features .fz-feature .fz-feature-image img {
147
  width: 100%;
148
  height: auto;
149
  }
150
 
151
  @media screen and (min-width: 768px) {
152
+ #fz-features {
153
  padding: 0 15px;
154
  }
155
  }
156
 
157
  @media screen and (min-width: 1200px) {
158
+ #fz-features .fz-feature {
159
  padding: 30px 60px;
160
  }
161
 
162
+ #fz-features .fz-feature .fz-feature-features {
163
  padding: 0 30px 0 0;
164
  }
165
 
166
+ #fz-features .fz-feature .fz-feature-features h2 {
167
  font-size: 30px;
168
  }
169
 
170
+ #fz-features .fz-feature .fz-feature-features p {
171
  font-size: 20px;
172
  }
173
  }
174
 
175
  @media screen and (min-width: 1500px) {
176
+ #fz-features .fz-feature .fz-feature-features {
177
  padding: 0 120px 0 0;
178
  }
179
  }
180
 
181
  @media screen and (max-width: 1100px) {
182
+ #fz-features {
183
  text-align: center;
184
  }
185
 
186
+ #fz-features .logo {
187
  margin-left: 0;
188
  }
189
 
190
+ #fz-features .header-btns {
191
  display: block;
192
  float: none;
193
  margin: 10px 0 0;
196
  }
197
 
198
  @media screen and (max-width: 1200px) {
199
+ #fz-features .fz-feature .fz-feature-features,
200
+ #fz-features .fz-feature .fz-feature-image {
201
  display: block;
202
  }
203
 
204
+ #fz-features .fz-feature .fz-feature-image {
205
  display: inline-block;
206
  max-width: 100%;
207
  margin: 0 auto 30px;
208
  }
209
 
210
+ #fz-features .slogan {
211
  display: none;
212
  }
213
  }
214
+
215
+ #fz-features.fz-settings .fz-feature {
216
+ margin-top: 0;
217
+ border: none;
218
+ }
219
+
220
+ #fz-features.fz-settings .nav-tab-wrapper {
221
+ border-bottom: none;
222
+ }
223
+
224
+ #fz-features.fz-settings .nav-tab-wrapper a.nav-tab-active,
225
+ #fz-features.fz-settings .nav-tab-wrapper a:hover {
226
+ background: #fff;
227
+ }
228
+
229
+ #fz-features.fz-settings .nav-tab-wrapper a {
230
+ margin-top: 10px;
231
+ padding: 10px 20px;
232
+ border: 0;
233
+ color: #000;
234
+ background: #e0e0e0;
235
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
236
+ }
includes/layouts/feedzy-upsell.php CHANGED
@@ -4,53 +4,44 @@ Layout For Upsell Page of Feedzy RSS Feeds
4
  @since 3.0.12
5
  @package feedzy-rss-feeds
6
  -->
7
- <div id="pro-features">
8
 
9
- <div class="pro-features-header">
10
- <p class="logo">Feedzy RSS Feeds PRO</p>
11
- <span class="slogan">by <a
12
- href="https://themeisle.com/">ThemeIsle</a></span>
13
- <div class="header-btns">
14
 
15
- <a target="_blank" href="<?php echo FEEDZY_UPSELL_LINK; ?>" class="buy-now"><span
16
- class="dashicons dashicons-cart"></span> Buy now</a>
17
- </div>
18
- </div><!-- .pro-features-header -->
19
-
20
- <div class="pro-features-content">
21
 
22
- <div class="pro-feature">
23
- <div class="pro-feature-features">
24
  <h2>Feed to post</h2>
25
  <p>Insert into your site, content from various RSS sources. Feedzy will automatically filter the feed items and place the content wherever you want in your WordPress instance with no hassle.</p>
26
  </div>
27
- <div class="pro-feature-image">
28
  <img src="<?php echo FEEDZY_ABSURL; ?>/img/features-feed-to-post.jpg" alt="Feed to post">
29
  </div>
30
  </div>
31
- <div class="pro-feature">
32
- <div class="pro-feature-features">
33
  <h2>Feed templates</h2>
34
- <p>Use the style that best fits your website design with three available templates. For product related
35
  feeds, the plugin fetches and displays the price separately.</p>
36
  </div>
37
- <div class="pro-feature-image">
38
  <img src="<?php echo FEEDZY_ABSURL; ?>/img/features-templates.jpg" alt="Feed templates">
39
  </div>
40
  </div>
41
- <div class="pro-feature">
42
- <div class="pro-feature-features">
43
  <h2>Affiliate ready</h2>
44
  <p>Make some extra money by featuring affiliate links on your site. Feedzy RSS plugin automatically
45
  includes your referral/affiliate ID to the feed links.</p>
46
  </div>
47
- <div class="pro-feature-image">
48
  <img src="<?php echo FEEDZY_ABSURL; ?>/img/features-affiliate-ready.jpg" alt="Affiliate ready">
49
  </div>
50
  </div>
51
 
52
 
53
 
54
- </div><!-- .pro-features-content -->
55
 
56
  </div>
4
  @since 3.0.12
5
  @package feedzy-rss-feeds
6
  -->
7
+ <div id="fz-features">
8
 
9
+ <?php load_template( FEEDZY_ABSPATH . '/includes/layouts/header.php' ); ?>
 
 
 
 
10
 
11
+ <div class="fz-features-content">
 
 
 
 
 
12
 
13
+ <div class="fz-feature">
14
+ <div class="fz-feature-features">
15
  <h2>Feed to post</h2>
16
  <p>Insert into your site, content from various RSS sources. Feedzy will automatically filter the feed items and place the content wherever you want in your WordPress instance with no hassle.</p>
17
  </div>
18
+ <div class="fz-feature-image">
19
  <img src="<?php echo FEEDZY_ABSURL; ?>/img/features-feed-to-post.jpg" alt="Feed to post">
20
  </div>
21
  </div>
22
+ <div class="fz-feature">
23
+ <div class="fz-feature-features">
24
  <h2>Feed templates</h2>
25
+ <p>Use the style that best fits your website design with three available templates. For fzduct related
26
  feeds, the plugin fetches and displays the price separately.</p>
27
  </div>
28
+ <div class="fz-feature-image">
29
  <img src="<?php echo FEEDZY_ABSURL; ?>/img/features-templates.jpg" alt="Feed templates">
30
  </div>
31
  </div>
32
+ <div class="fz-feature">
33
+ <div class="fz-feature-features">
34
  <h2>Affiliate ready</h2>
35
  <p>Make some extra money by featuring affiliate links on your site. Feedzy RSS plugin automatically
36
  includes your referral/affiliate ID to the feed links.</p>
37
  </div>
38
+ <div class="fz-feature-image">
39
  <img src="<?php echo FEEDZY_ABSURL; ?>/img/features-affiliate-ready.jpg" alt="Affiliate ready">
40
  </div>
41
  </div>
42
 
43
 
44
 
45
+ </div><!-- .fz-features-content -->
46
 
47
  </div>
includes/layouts/header.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Header file for admin pages
4
+ *
5
+ * @package Feedzy
6
+ * @copyright Copyright (c) 2017, Marius Cristea
7
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
8
+ */
9
+ ?>
10
+ <div class="fz-features-header">
11
+ <p class="logo">Feedzy RSS Feeds</p>
12
+ <span class="slogan">by <a
13
+ href="https://themeisle.com/">ThemeIsle</a></span>
14
+ <div class="header-btns">
15
+ <?php
16
+ if ( ! defined( 'FEEDZY_PRO_ABSURL' ) ) :
17
+ ?>
18
+
19
+ <a target="_blank" href="<?php echo FEEDZY_UPSELL_LINK; ?>" class="buy-now"><span
20
+ class="dashicons dashicons-cart"></span> Upgrade</a>
21
+ <?php
22
+ endif;
23
+ ?>
24
+ </div>
25
+ </div><!-- .fz-features-header -->
includes/layouts/settings.php ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="fz-features" class="fz-settings">
2
+
3
+ <?php load_template( FEEDZY_ABSPATH . '/includes/layouts/header.php' ); ?>
4
+
5
+ <?php
6
+ $active_tab = isset( $_REQUEST['tab'] ) ? sanitize_text_field( $_REQUEST['tab'] ) : 'headers';
7
+ $show_button = true;
8
+ ?>
9
+
10
+ <h2 class="nav-tab-wrapper">
11
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=feedzy-settings&tab=headers' ) ); ?>"
12
+ class="nav-tab <?php echo $active_tab == 'headers' ? 'nav-tab-active' : ''; ?>"><?php _e( 'Headers', 'feedzy-rss-feeds' ); ?></a>
13
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=feedzy-settings&tab=proxy' ) ); ?>"
14
+ class="nav-tab <?php echo $active_tab == 'proxy' ? 'nav-tab-active' : ''; ?>"><?php _e( 'Proxy', 'feedzy-rss-feeds' ); ?></a>
15
+ <?php
16
+ $tabs = apply_filters( 'feedzy_settings_tabs', array() );
17
+ if ( $tabs ) {
18
+ foreach ( $tabs as $tab => $label ) {
19
+ ?>
20
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=feedzy-settings&tab=' . $tab ) ); ?>"
21
+ class="nav-tab <?php echo $active_tab == $tab ? 'nav-tab-active' : ''; ?>"><?php echo $label; ?></a>
22
+ <?php
23
+ }
24
+ }
25
+ ?>
26
+ </h2>
27
+
28
+ <?php if ( $this->notice ) { ?>
29
+ <div class="updated"><p><?php echo $this->notice; ?></p></div>
30
+ <?php } ?>
31
+
32
+ <?php if ( $this->error ) { ?>
33
+ <div class="error"><p><?php echo $this->error; ?></p></div>
34
+ <?php } ?>
35
+
36
+ <div class="fz-features-content">
37
+ <div class="fz-feature">
38
+ <div id="feedzy_import_feeds" class="fz-feature-features">
39
+
40
+ <form method="post" action="">
41
+ <?php
42
+ switch ( $active_tab ) {
43
+ case 'headers':
44
+ ?>
45
+ <h2><?php _e( 'Headers', 'feedzy-rss-feeds' ); ?></h2>
46
+ <div class="fz-form-group">
47
+ <label><?php echo __( 'User Agent to use when accessing the feed', 'feedzy-rss-feeds' ); ?>:</label>
48
+ </div>
49
+ <div class="fz-form-group">
50
+ <input type="text" class="fz-form-control" name="user-agent"
51
+ value="<?php echo isset( $settings['header']['user-agent'] ) ? $settings['header']['user-agent'] : ''; ?>">
52
+ </div>
53
+ <?php
54
+ break;
55
+ case 'proxy':
56
+ ?>
57
+ <h2><?php _e( 'Proxy Settings', 'feedzy-rss-feeds' ); ?></h2>
58
+ <div class="fz-form-group">
59
+ <label><?php echo __( 'Host', 'feedzy-rss-feeds' ); ?>:</label>
60
+ </div>
61
+ <div class="fz-form-group">
62
+ <input type="text" class="fz-form-control" name="proxy-host"
63
+ value="<?php echo isset( $settings['proxy']['host'] ) ? $settings['proxy']['host'] : ''; ?>">
64
+ </div>
65
+
66
+ <div class="fz-form-group">
67
+ <label><?php echo __( 'Port', 'feedzy-rss-feeds' ); ?>:</label>
68
+ </div>
69
+ <div class="fz-form-group">
70
+ <input type="number" min="0" max="65535" class="fz-form-control" name="proxy-port"
71
+ value="<?php echo isset( $settings['proxy']['port'] ) ? $settings['proxy']['port'] : ''; ?>">
72
+ </div>
73
+
74
+ <div class="fz-form-group">
75
+ <label><?php echo __( 'Username', 'feedzy-rss-feeds' ); ?>:</label>
76
+ </div>
77
+ <div class="fz-form-group">
78
+ <input type="text" class="fz-form-control" name="proxy-user"
79
+ value="<?php echo isset( $settings['proxy']['user'] ) ? $settings['proxy']['user'] : ''; ?>">
80
+ </div>
81
+
82
+ <div class="fz-form-group">
83
+ <label><?php echo __( 'Password', 'feedzy-rss-feeds' ); ?>:</label>
84
+ </div>
85
+ <div class="fz-form-group">
86
+ <input type="password" class="fz-form-control" name="proxy-pass"
87
+ value="<?php echo isset( $settings['proxy']['pass'] ) ? $settings['proxy']['pass'] : ''; ?>">
88
+ </div>
89
+ <?php
90
+ break;
91
+ default:
92
+ $field = apply_filters( 'feedzy_display_tab_settings', array(), $active_tab );
93
+ if ( $field ) {
94
+ echo $field['content'];
95
+ if ( isset( $field['ajax'] ) && $field['ajax'] ) {
96
+ $show_button = false;
97
+ }
98
+ }
99
+ break;
100
+ }
101
+ ?>
102
+
103
+ <input type="hidden" name="tab" value="<?php echo $active_tab; ?>">
104
+
105
+ <?php
106
+ wp_nonce_field( $active_tab, 'nonce' );
107
+ if ( $show_button ) {
108
+ ?>
109
+ <button type="submit" class="fz-btn fz-btn-submit fz-btn-activate" id="feedzy-settings-submit"
110
+ name="feedzy-settings-submit"><?php _e( 'Save', 'feedzy-rss-feeds' ); ?></button>
111
+ <?php
112
+ }
113
+ ?>
114
+ </form>
115
+ </div>
116
+ </div>
117
+ </div>
118
+
119
+ </div>
languages/feedzy-rss-feeds.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the GPL-2.0+.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Feedzy RSS Feeds Lite 3.2.0\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Codeinwp/feedzy-rss-feeds/issues\n"
7
- "POT-Creation-Date: 2017-08-17 13:49:33+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -32,111 +32,119 @@ msgstr ""
32
  msgid "Sorry, this feed is currently unavailable or does not exists anymore."
33
  msgstr ""
34
 
35
- #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:407
36
- #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:414
37
  msgid "Feed URL: %s not valid and removed from fetch."
38
  msgstr ""
39
 
40
- #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:695
41
  msgid "by"
42
  msgstr ""
43
 
44
- #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:701
45
  msgid "on"
46
  msgstr ""
47
 
48
- #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:703
49
  msgid "at"
50
  msgstr ""
51
 
52
- #: includes/admin/feedzy-rss-feeds-admin.php:110
53
  msgid "Feed Categories"
54
  msgstr ""
55
 
56
- #: includes/admin/feedzy-rss-feeds-admin.php:111
57
  msgid "Feed Category"
58
  msgstr ""
59
 
60
- #: includes/admin/feedzy-rss-feeds-admin.php:112
61
- #: includes/admin/feedzy-rss-feeds-admin.php:113
62
  msgid "Add Category"
63
  msgstr ""
64
 
65
- #: includes/admin/feedzy-rss-feeds-admin.php:114
66
  msgid "Edit Category"
67
  msgstr ""
68
 
69
- #: includes/admin/feedzy-rss-feeds-admin.php:115
70
  msgid "New Feed Category"
71
  msgstr ""
72
 
73
- #: includes/admin/feedzy-rss-feeds-admin.php:116
74
  msgid "View Category"
75
  msgstr ""
76
 
77
- #: includes/admin/feedzy-rss-feeds-admin.php:117
78
  msgid "Search Category"
79
  msgstr ""
80
 
81
- #: includes/admin/feedzy-rss-feeds-admin.php:118
82
  msgid "No categories found"
83
  msgstr ""
84
 
85
- #: includes/admin/feedzy-rss-feeds-admin.php:119
86
  msgid "No categories in the trash"
87
  msgstr ""
88
 
89
- #: includes/admin/feedzy-rss-feeds-admin.php:149
90
  msgid "Category Feeds"
91
  msgstr ""
92
 
93
- #: includes/admin/feedzy-rss-feeds-admin.php:155
94
  msgid "Increase your social media presence"
95
  msgstr ""
96
 
97
- #: includes/admin/feedzy-rss-feeds-admin.php:185
98
  msgid "Place your URL's here followed by a comma."
99
  msgstr ""
100
 
101
- #: includes/admin/feedzy-rss-feeds-admin.php:246
102
  msgid "Category Title"
103
  msgstr ""
104
 
105
- #: includes/admin/feedzy-rss-feeds-admin.php:247
106
- #: includes/admin/feedzy-rss-feeds-admin.php:250
107
  msgid "Slug"
108
  msgstr ""
109
 
110
- #: includes/admin/feedzy-rss-feeds-admin.php:274
111
  msgid "Undefined"
112
  msgstr ""
113
 
114
- #: includes/admin/feedzy-rss-feeds-admin.php:299
115
  msgid "Documentation and examples"
116
  msgstr ""
117
 
118
- #: includes/admin/feedzy-rss-feeds-admin.php:300
119
  msgid "More Plugins"
120
  msgstr ""
121
 
122
- #: includes/admin/feedzy-rss-feeds-admin.php:300
123
- #: includes/admin/feedzy-rss-feeds-admin.php:319
124
  msgid "More Features"
125
  msgstr ""
126
 
127
- #: includes/admin/feedzy-rss-feeds-admin.php:316
128
  #: includes/admin/feedzy-wp-widget.php:40
129
  msgid "Feedzy RSS Feeds"
130
  msgstr ""
131
 
132
- #: includes/admin/feedzy-rss-feeds-admin.php:316
133
  msgid "Feedzy RSS"
134
  msgstr ""
135
 
136
- #: includes/admin/feedzy-rss-feeds-admin.php:329
137
  msgid "Import Posts"
138
  msgstr ""
139
 
 
 
 
 
 
 
 
 
140
  #: includes/admin/feedzy-rss-feeds-ui-lang.php:52
141
  msgid "Feedzy Lite"
142
  msgstr ""
@@ -391,14 +399,40 @@ msgstr ""
391
  msgid "Intro text"
392
  msgstr ""
393
 
394
- #: vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-licenser.php:453
395
- msgid ""
396
- "Updating this theme will lose any customizations you have made. Cancel to "
397
- "stop, OK to update."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  msgstr ""
399
 
400
- #: vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget-dashboard-blog.php:197
401
- msgid "Install"
402
  msgstr ""
403
 
404
  #. Plugin Name of the plugin/theme
2
  # This file is distributed under the GPL-2.0+.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Feedzy RSS Feeds Lite 3.2.1\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Codeinwp/feedzy-rss-feeds/issues\n"
7
+ "POT-Creation-Date: 2017-10-12 09:53:07+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
32
  msgid "Sorry, this feed is currently unavailable or does not exists anymore."
33
  msgstr ""
34
 
35
+ #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:426
36
+ #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:433
37
  msgid "Feed URL: %s not valid and removed from fetch."
38
  msgstr ""
39
 
40
+ #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:717
41
  msgid "by"
42
  msgstr ""
43
 
44
+ #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:723
45
  msgid "on"
46
  msgstr ""
47
 
48
+ #: includes/abstract/feedzy-rss-feeds-admin-abstract.php:725
49
  msgid "at"
50
  msgstr ""
51
 
52
+ #: includes/admin/feedzy-rss-feeds-admin.php:128
53
  msgid "Feed Categories"
54
  msgstr ""
55
 
56
+ #: includes/admin/feedzy-rss-feeds-admin.php:129
57
  msgid "Feed Category"
58
  msgstr ""
59
 
60
+ #: includes/admin/feedzy-rss-feeds-admin.php:130
61
+ #: includes/admin/feedzy-rss-feeds-admin.php:131
62
  msgid "Add Category"
63
  msgstr ""
64
 
65
+ #: includes/admin/feedzy-rss-feeds-admin.php:132
66
  msgid "Edit Category"
67
  msgstr ""
68
 
69
+ #: includes/admin/feedzy-rss-feeds-admin.php:133
70
  msgid "New Feed Category"
71
  msgstr ""
72
 
73
+ #: includes/admin/feedzy-rss-feeds-admin.php:134
74
  msgid "View Category"
75
  msgstr ""
76
 
77
+ #: includes/admin/feedzy-rss-feeds-admin.php:135
78
  msgid "Search Category"
79
  msgstr ""
80
 
81
+ #: includes/admin/feedzy-rss-feeds-admin.php:136
82
  msgid "No categories found"
83
  msgstr ""
84
 
85
+ #: includes/admin/feedzy-rss-feeds-admin.php:137
86
  msgid "No categories in the trash"
87
  msgstr ""
88
 
89
+ #: includes/admin/feedzy-rss-feeds-admin.php:167
90
  msgid "Category Feeds"
91
  msgstr ""
92
 
93
+ #: includes/admin/feedzy-rss-feeds-admin.php:173
94
  msgid "Increase your social media presence"
95
  msgstr ""
96
 
97
+ #: includes/admin/feedzy-rss-feeds-admin.php:203
98
  msgid "Place your URL's here followed by a comma."
99
  msgstr ""
100
 
101
+ #: includes/admin/feedzy-rss-feeds-admin.php:264
102
  msgid "Category Title"
103
  msgstr ""
104
 
105
+ #: includes/admin/feedzy-rss-feeds-admin.php:265
106
+ #: includes/admin/feedzy-rss-feeds-admin.php:268
107
  msgid "Slug"
108
  msgstr ""
109
 
110
+ #: includes/admin/feedzy-rss-feeds-admin.php:292
111
  msgid "Undefined"
112
  msgstr ""
113
 
114
+ #: includes/admin/feedzy-rss-feeds-admin.php:317
115
  msgid "Documentation and examples"
116
  msgstr ""
117
 
118
+ #: includes/admin/feedzy-rss-feeds-admin.php:318
119
  msgid "More Plugins"
120
  msgstr ""
121
 
122
+ #: includes/admin/feedzy-rss-feeds-admin.php:318
123
+ #: includes/admin/feedzy-rss-feeds-admin.php:337
124
  msgid "More Features"
125
  msgstr ""
126
 
127
+ #: includes/admin/feedzy-rss-feeds-admin.php:334
128
  #: includes/admin/feedzy-wp-widget.php:40
129
  msgid "Feedzy RSS Feeds"
130
  msgstr ""
131
 
132
+ #: includes/admin/feedzy-rss-feeds-admin.php:334
133
  msgid "Feedzy RSS"
134
  msgstr ""
135
 
136
+ #: includes/admin/feedzy-rss-feeds-admin.php:347
137
  msgid "Import Posts"
138
  msgstr ""
139
 
140
+ #: includes/admin/feedzy-rss-feeds-admin.php:351
141
+ msgid "Settings"
142
+ msgstr ""
143
+
144
+ #: includes/admin/feedzy-rss-feeds-admin.php:366
145
+ msgid "Your settings were saved."
146
+ msgstr ""
147
+
148
  #: includes/admin/feedzy-rss-feeds-ui-lang.php:52
149
  msgid "Feedzy Lite"
150
  msgstr ""
399
  msgid "Intro text"
400
  msgstr ""
401
 
402
+ #: includes/layouts/settings.php:12 includes/layouts/settings.php:45
403
+ msgid "Headers"
404
+ msgstr ""
405
+
406
+ #: includes/layouts/settings.php:14
407
+ msgid "Proxy"
408
+ msgstr ""
409
+
410
+ #: includes/layouts/settings.php:47
411
+ msgid "User Agent to use when accessing the feed"
412
+ msgstr ""
413
+
414
+ #: includes/layouts/settings.php:57
415
+ msgid "Proxy Settings"
416
+ msgstr ""
417
+
418
+ #: includes/layouts/settings.php:59
419
+ msgid "Host"
420
+ msgstr ""
421
+
422
+ #: includes/layouts/settings.php:67
423
+ msgid "Port"
424
+ msgstr ""
425
+
426
+ #: includes/layouts/settings.php:75
427
+ msgid "Username"
428
+ msgstr ""
429
+
430
+ #: includes/layouts/settings.php:83
431
+ msgid "Password"
432
  msgstr ""
433
 
434
+ #: includes/layouts/settings.php:110
435
+ msgid "Save"
436
  msgstr ""
437
 
438
  #. Plugin Name of the plugin/theme
readme.md ADDED
@@ -0,0 +1,503 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # FEEDZY RSS Feeds Lite #
2
+ **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle), [codeinwp](https://profiles.wordpress.org/codeinwp), [hardeepasrani](https://profiles.wordpress.org/hardeepasrani)
3
+ **Tags:** RSS, SimplePie, shortcode, feed, thumbnail, image, rss feeds, aggregator, tinyMCE, WYSIWYG, MCE, UI, flux, plugin, WordPress, widget, importer, XML, ATOM, API, parser
4
+ **Requires at least:** 3.7
5
+ **Tested up to:** 4.8
6
+ **Stable tag:** trunk
7
+ **License:** GPLv2 or later
8
+ **License URI:** http://www.gnu.org/licenses/gpl-2.0.html
9
+
10
+
11
+ FEEDZY RSS Feeds is a small & lightweight plugin. Fast and easy to use, it aggregates RSS feeds into your site with shortcodes & widgets.
12
+
13
+
14
+ ## Description ##
15
+
16
+ FEEDZY RSS Feeds is a small and lightweight RSS aggregator plugin. Fast and very easy to use, it allows you to aggregate multiple RSS feeds into your WordPress site through fully customizable shortcodes & widgets.
17
+
18
+ > **Time-saving features available in the FULL version:**
19
+ >
20
+ > * Integration with WordAI to avoid duplicate content
21
+ > * Audio playback template
22
+ > * Convert feed items to WordPress posts/pages/any
23
+ > * Multiple templates for feed items
24
+ > * Automatically build affiliate links
25
+ > * Parse price from product feeds
26
+ > * Blacklist specific keywords from feeds
27
+ > * Priority email support from the developer of the plugin
28
+ > * Support and updates for 12 months
29
+ >
30
+ > **[Learn more about Feedzy Full version]( https://themeisle.com/plugins/feedzy-rss-feeds/ )**
31
+
32
+
33
+ The plugin uses the SimplePie php CLASS natively included in WordPress. SimplePie is a RSS parser that can read the information contained in a feed, process it, and finally display it.
34
+
35
+ **Full cache control**
36
+
37
+ Choose right from the shortcode how often do you want your content from feeds to get updated.
38
+
39
+ **Feed Categories**
40
+
41
+ You can now group feeds into categories and reuse them across your content without worrying of their url.
42
+
43
+
44
+ FEEDZY RSS Feeds therefore supports any additional library and uses only the bare minimum to ensure good performance (minimalistic CSS + cache). This will ensure compatibility with any hosting provider that supports WordPress, but if for any reason it doesn't work for yours feel free to <a href="http://themeisle.com/contact/" rel="nofollow">contact us</a>.
45
+
46
+
47
+ = See how Feedzy can integrate with your website =
48
+
49
+ * [Audio playback template](https://demo.themeisle.com/feedzy-rss-feeds/audio-feed-template/)
50
+ * [Shop feed – 3 columns layout](https://demo.themeisle.com/feedzy-rss-feeds/shop-feed/)
51
+ * [Feed categories – 1 columns layout](https://demo.themeisle.com/feedzy-rss-feeds/group-feeds-categories/)
52
+ * [Large image square grid – 2 columns layout](https://demo.themeisle.com/feedzy-rss-feeds/2-columns-large-images-square-grid/)
53
+ * [Square grid template – 3 columns layout](https://demo.themeisle.com/feedzy-rss-feeds/square-template/)
54
+ * [Round grid templates – 3 columns layout](https://demo.themeisle.com/feedzy-rss-feeds/round-grid-template/)
55
+ * [Standard grid layout – 2 columns layout](https://demo.themeisle.com/feedzy-rss-feeds/grid-layout-feed-items/)
56
+ * [Blog layout – 1 column layout](https://demo.themeisle.com/feedzy-rss-feeds/blog-layout/)
57
+
58
+
59
+ You may use this plugin in your widgets and your pages and reuse the shortcode + widget several times within the same page.
60
+
61
+ By activating this plugin, your cover picture will be inserted into your RSS feeds. By doing so, you'll make it will easier for external sites to retrieve images from your feeds.
62
+
63
+ **Please ask for help or report bugs if anything goes wrong. It is the best way to make the community benefit!**
64
+
65
+
66
+ = Shortcode Parameters =
67
+
68
+
69
+ * feeds
70
+ * max
71
+ * feed_title
72
+ * target
73
+ * title
74
+ * meta
75
+ * summary
76
+ * summarylength
77
+ * thumb
78
+ * default
79
+ * refresh
80
+ * size
81
+ * keywords_title
82
+
83
+
84
+
85
+ **Plugin is now using the TinyMCE API to improve UI and makes it easy to insert shortcodes!**
86
+
87
+
88
+ ### Basic example ###
89
+
90
+ `[feedzy-rss feeds="http://themeisle.com/feed"]`
91
+
92
+
93
+ ### Advanced example ###
94
+
95
+ `[feedzy-rss feeds="http://themeisle.com/feed" max="2" feed_title="yes" target="_blank" refresh="12_hours" title="50" meta="yes" summary="yes" summarylength="300" thumb="yes" size="100" default="http://your-site/default-image.jpg" keywords_title="WordPress"]`
96
+
97
+
98
+ ### Available Hooks ###
99
+
100
+
101
+ * feedzy_feed_items
102
+ * feedzy_item_keyword
103
+ * feedzy_item_attributes
104
+ * feedzy_thumb_output
105
+ * feedzy_title_output
106
+ * feedzy_meta_args
107
+ * feedzy_meta_output
108
+ * feedzy_summary_input
109
+ * feedzy_summary_output
110
+ * feedzy_global_output
111
+ * feedzy_thumb_sizes
112
+ * feedzy_feed_blacklist_images
113
+ * feedzy_default_image
114
+ * feedzy_default_error
115
+ * feedzy_item_filter
116
+ * feedzy_author_url
117
+ * feedzy_item_url_filter
118
+ * feedzy_feed_timestamp
119
+ * shortcode_atts_feedzy_default
120
+
121
+ This plugin is maintained and supported by Themeisle, check out some of the other <a href="http://themeisle.com/wordpress-plugins/" rel="nofollow">WordPress plugins</a> and <a href="http://themeisle.com/wordpress-themes/free/" rel="nofollow">free themes</a> we've developed.
122
+
123
+ ### Languages ###
124
+
125
+ * English
126
+ * French
127
+ * Serbian [Borisa Djuraskovic](http://www.webhostinghub.com/ "Borisa Djuraskovic")
128
+ * Japanese [sama55](http://askive.cmsbox.jp/ "sama55")
129
+ * German [ralfsteck](https://profiles.wordpress.org/ralfsteck/ "ralfsteck")
130
+ * Spanish [Angel Calzado](http://sintaxisweb.es "Angel Calzado")
131
+
132
+ Become a translator and send me your translation! [Contact-me](http://themeisle.com/contact "Contact")
133
+
134
+ ## Installation ##
135
+
136
+ 1. Upload and activate the plugin (or install it through the WP admin console)
137
+ 2. Insert shortcode ! ;-)
138
+
139
+ ## Frequently Asked Questions ##
140
+
141
+ ### Is it responsive friendly? ###
142
+
143
+ Yes it is.
144
+
145
+ ### My feed is not displayed and the following message appears "Sorry, this feed is currently unavailable or does not exists anymore." ###
146
+
147
+ You have to check first if your feed is valid. Please test it here: https://validator.w3.org/feed/
148
+
149
+ ### Where do i find the plugin documentation ###
150
+ [http://docs.themeisle.com/article/658-feedzy-rss-feeds](http://docs.themeisle.com/article/658-feedzy-rss-feeds)
151
+
152
+ ### How to fix images that are not showing in the feed ###
153
+ [http://docs.themeisle.com/article/666-how-to-fix-images-that-are-not-showing-in-the-feed](http://docs.themeisle.com/article/666-how-to-fix-images-that-are-not-showing-in-the-feed)
154
+
155
+ ### How to change cache lifetime for a specific feed ###
156
+ [http://docs.themeisle.com/article/547-how-to-change-cache-lifetime-for-a-specific-feed](http://docs.themeisle.com/article/547-how-to-change-cache-lifetime-for-a-specific-feed)
157
+
158
+ ### How to change thumbs size and aspect ratio ###
159
+ [http://docs.themeisle.com/article/551-how-to-change-thumbs-size-and-aspect-ratio](http://docs.themeisle.com/article/551-how-to-change-thumbs-size-and-aspect-ratio)
160
+
161
+ ### What hooks and filters are available in Feedzy ###
162
+ [http://docs.themeisle.com/article/540-what-hooks-and-filters-are-available-in-feedzy](http://docs.themeisle.com/article/540-what-hooks-and-filters-are-available-in-feedzy)
163
+
164
+ ### How to change the blacklist image name ###
165
+ [http://docs.themeisle.com/article/552-how-to-change-the-blacklist-image-name](http://docs.themeisle.com/article/552-how-to-change-the-blacklist-image-name)
166
+
167
+ ### How to decode item title ###
168
+ [http://docs.themeisle.com/article/548-how-to-decode-item-title-with](http://docs.themeisle.com/article/548-how-to-decode-item-title-with)
169
+
170
+ ### How to remove featured image from blog feed ###
171
+ [http://docs.themeisle.com/article/554-how-to-remove-featured-image-from-blog-feed](http://docs.themeisle.com/article/554-how-to-remove-featured-image-from-blog-feed)
172
+
173
+ ### How to keep html in feed items content ###
174
+ [http://docs.themeisle.com/article/542-how-to-keep-html-in-feed-items-content](http://docs.themeisle.com/article/542-how-to-keep-html-in-feed-items-content)
175
+
176
+ ### How to remove plugin css ###
177
+ [http://docs.themeisle.com/article/545-how-to-remove-plugin-css](http://docs.themeisle.com/article/545-how-to-remove-plugin-css)
178
+
179
+ ### How to remove links ###
180
+ [http://docs.themeisle.com/article/541-how-to-remove-links](http://docs.themeisle.com/article/541-how-to-remove-links)
181
+
182
+ ### How to add a read more link ###
183
+ [http://docs.themeisle.com/article/544-how-to-add-a-read-more-link](http://docs.themeisle.com/article/544-how-to-add-a-read-more-link)
184
+
185
+ ### How to remove time from publication date ###
186
+ [http://docs.themeisle.com/article/553-how-to-remove-time-from-publication-date](http://docs.themeisle.com/article/553-how-to-remove-time-from-publication-date)
187
+
188
+ ### How to handle publication date and author content ###
189
+ [http://docs.themeisle.com/article/549-how-to-handle-time-and-date-content](http://docs.themeisle.com/article/549-how-to-handle-time-and-date-content)
190
+
191
+ ### How to use your own inline css ###
192
+ [http://docs.themeisle.com/article/546-how-to-use-your-own-inline-css](http://docs.themeisle.com/article/546-how-to-use-your-own-inline-css)
193
+
194
+ ### How to remove the end hellip ###
195
+ [http://docs.themeisle.com/article/543-how-to-remove-the-end-hellip](http://docs.themeisle.com/article/543-how-to-remove-the-end-hellip)
196
+
197
+ ### How to display items in a random order ###
198
+ [http://docs.themeisle.com/article/550-how-to-display-items-in-a-random-order](http://docs.themeisle.com/article/550-how-to-display-items-in-a-random-order)
199
+
200
+ ### How to sort items alphabetically by their title ###
201
+ [http://docs.themeisle.com/article/633-how-to-sort-feed-items-by-title](http://docs.themeisle.com/article/633-how-to-sort-feed-items-by-title)
202
+
203
+ ### How to display RSS feed time and date in local time ###
204
+ [http://docs.themeisle.com/article/567-how-to-display-rss-feed-time-and-date-in-local-time](http://docs.themeisle.com/article/567-how-to-display-rss-feed-time-and-date-in-local-time)
205
+
206
+ ### How to change author url ###
207
+ [http://docs.themeisle.com/article/636-how-to-change-author-url](http://docs.themeisle.com/article/636-how-to-change-author-url)
208
+
209
+ ### How remove feed items duplicates by url ###
210
+ [http://docs.themeisle.com/article/638-how-to-eliminate-duplicate-feed-item](http://docs.themeisle.com/article/638-how-to-eliminate-duplicate-feed-item)
211
+
212
+ ### How to use feedzy categories ###
213
+ [http://docs.themeisle.com/article/640-how-to-use-feedzy-categories](http://docs.themeisle.com/article/640-how-to-use-feedzy-categories)
214
+
215
+ ## Screenshots ##
216
+
217
+ 1. Simple example
218
+ 2. Inserting a shortcode in the WYSIWYG
219
+ 3. Widget admin
220
+ 4. Widget render
221
+
222
+
223
+ ## Changelog ##
224
+ ### 3.2.1 - 2017-10-12 ###
225
+
226
+ * Adds global settings page.
227
+ * Adds User Agent and Proxy settings.
228
+ * Fix for some edge cases regarding images in the feed.
229
+
230
+
231
+ ### 3.2.0 - 2017-08-17 ###
232
+
233
+ * Fix for image URL issue following some strange patterns.
234
+ * Added fallback for broken feed, now if one feed from the list is not working, others will will be used.
235
+ * Added shortcode parameter for feed cache control.
236
+
237
+
238
+ ### 3.1.10 - 2017-08-03 ###
239
+
240
+ * Fixed typos in shortcode builder.
241
+ * Fixed image encoding issue.
242
+
243
+
244
+ ### 3.1.9 - 2017-07-21 ###
245
+
246
+ * Fixed issue with fetching images containg GET parameters.
247
+
248
+
249
+ ### 3.1.8 - 2017-07-17 ###
250
+
251
+ * Fixed image fetching issues.
252
+ * Fixed link opening behaviour
253
+ * Improved description ( Thanks to @chesio )
254
+
255
+
256
+ ### 3.1.7 ###
257
+
258
+ * Added new sdk logic.
259
+ * Improved compatibility with the pro version.
260
+
261
+
262
+
263
+ ### 3.1.5 - 30/05/2017 ###
264
+ * Fixed issues with sdk notifications.
265
+ * Added more compatibility with pro version.
266
+
267
+ ### 3.1.4 - 29/05/2017 ###
268
+ * Added new doc on how to use feedzy categories.
269
+
270
+ ### 3.1.3 - 29/05/2017 ###
271
+ * Added new SDK features.
272
+ * Fixed some edge case issues on image parsing.
273
+
274
+ ### 3.1.2 - 22/05/2017 ###
275
+ * Fixed author protocol.
276
+ * Added core fetch_feed method.
277
+
278
+ ### 3.1.1 - 22/05/2017 ###
279
+ * Fixed span alt tag, replaced with title.
280
+
281
+ ### 3.1.0 - 17/05/2017 ###
282
+ * Added feed categories for grouping urls.
283
+ * Added support for feed to post feature.
284
+ * Fixed regex for jpeg image ( Reported by @piccart )
285
+ * Added filter for author url ( Thanks to @piccart )
286
+
287
+ ### 3.0.10 - 24/04/2017 ###
288
+ * Fixed wrong image regex.
289
+ * Fixed image compression.
290
+
291
+ ### 3.0.9 - 21/02/2017 ###
292
+ * Added wrong feed title check.
293
+
294
+ ### 3.0.8 - 20/02/2017 ###
295
+ * Added $sizes param to feedzy_thumb_output.
296
+ * Added check when title is empty.
297
+ * Fixed image encoding url.
298
+
299
+ ### 3.0.6 - 27/01/2017 ###
300
+ * Added feedzy_feed_timestamp filter.
301
+ * Fixed issue with edge cases feed urls.
302
+ * Fixed error when using [] on string vars.
303
+
304
+
305
+ ### 3.0.5 - 06/01/2017 ###
306
+ * Fixed issue with google news feed
307
+
308
+ ### 3.0.4 - 06/01/2017 ###
309
+ * Fixed thumb='auto' behaviour
310
+
311
+ ### 3.0.3 - 06/01/2017 ###
312
+ * Fixed blog feed feature image filter
313
+ * Improved documentation and examples
314
+
315
+ ### 3.0.2 - 06/01/2017 ###
316
+ * Fixed default class back
317
+
318
+ ### 3.0.1 - 05/01/2017 ###
319
+ * Fixed html markup error which was breaking user websites
320
+
321
+ ### 3.0.0 - 10/11/2016 ###
322
+ * Refactored code base from 2.8.1 to OOP style
323
+ * Added support for PRO version
324
+ * Added new hooks feedzy_item_filter, feedzy_item_url_filter
325
+
326
+
327
+ ### 2.8 - 04/14/2016 ###
328
+ * Tested on WP 4.5 with success!
329
+ * themeisle added as plugin author
330
+ * Fix a PHP7 warning in the widget contructor regarding [this topic](https://wordpress.org/support/topic/php7-debug-error?replies=1)
331
+
332
+ ### 2.7.1 ###
333
+ * Remove unnecessary and redundant feedzy_wp_widget_box div container in the widget's body
334
+ * Best compliance with WordPress coding standards
335
+ * Fix a PHP warning on SimplePie error display & log
336
+ * Readme.txt update
337
+
338
+ ### 2.7 ###
339
+ * Better displaying of fetching feeds errors (see error message div error-attr).
340
+ * Write errors in the WP log file
341
+ * New hook: feedzy_default_error to filter error message
342
+ * New hook: shortcode_atts_feedzy_default to filter default shortcode attibutes
343
+ * Add a link to validate feed in the TinyMCE popup modal
344
+ * French translation update
345
+ * Remove unnecessary functions
346
+ * New constant FEEDZY_VERSION
347
+ * readme.txt and hooks documentation update
348
+
349
+ ### 2.6.2 ###
350
+ * Spanish translation thanks to [Angel Calzado](http://sintaxisweb.es "Angel Calzado")
351
+ * PHP issue fix in feedzy_returnImage() "strpos() expects parameter 1 to be string"
352
+ * Remove SSL from feeds URL to prevent fetching errors
353
+ * New hook: feedzy_default_image
354
+ * readme.txt and hooks documentation update
355
+
356
+ ### 2.6.1 ###
357
+ * Replace jQuery live() function by on() function to prevent JS error (fix the issue with Visual composer)
358
+ * Improve image's fetching on itunes feeds
359
+ * New feature: default WP smilies are now blacklisted from image fetching
360
+ * New hook: feedzy_feed_blacklist_images
361
+ * Tested on WP 4.3 with success!
362
+
363
+ ### 2.6 ###
364
+ * Fix a conflict with PageBuilder where Feedzy button does not show up in the visual editor
365
+ * Fix a typo in feedzy-rss-feeds-shortcode.php on the thumbnails span
366
+ * Replace WP_Widget by __construct() to initiate the widget because it has been deprecated since version 4.3.0
367
+ * German translation thanks to [ralfsteck](https://profiles.wordpress.org/ralfsteck/ "ralfsteck")
368
+ * Tested on WP 4.3 with success!
369
+
370
+ ### 2.5.1 ###
371
+ * Japanese translation thanks to [sama55](http://askive.cmsbox.jp/ "sama55")
372
+ * Image optimisation (feedzy-default.jpg)
373
+ * Improve image's fetching to avoid catching audio or video files from item description
374
+
375
+ ### 2.5 ###
376
+ * Improve author name fetching
377
+ * Better HTML marckup
378
+ * Fix PHP warning within the widget
379
+ * Fix CSS on IE when displaying images as a fallback
380
+ * CSS stylesheet update
381
+ * New hook: feedzy_item_attributes
382
+
383
+ ### 2.4.3 ###
384
+ * Improve image fetching (again...)
385
+ * Fix an issue on files encoding (UTF8)
386
+ * Minor PHP improvements on the main shortcode's function
387
+
388
+ ### 2.4.2 ###
389
+ * Minor fix on already encoded images names
390
+
391
+ ### 2.4.1 ###
392
+ * Fix an issue on img url encode
393
+ * Retrive img url in url parameters
394
+ * Fix minor PHP warning
395
+ * New hook: feedzy_add_classes_item
396
+
397
+ ### 2.4 ###
398
+ * New feature: 'auto' thumbs option added
399
+ * New hook: feedzy_thumb_sizes
400
+ * Fix issue on max number of feeds to display
401
+ * Fix HTML decode in the feed's title
402
+ * Minor PHP improvements
403
+ * readme.txt and hooks documentation update
404
+
405
+ ### 2.3 ###
406
+ * New hook: feedzy_feed_items
407
+ * New hook: feedzy_item_keyword
408
+ * Introduce SimplePie native strip_htmltags() method
409
+ * Use PNG icon as SVG fallback on the visual editor button
410
+ * Improve plugin's files structure
411
+ * readme.txt and hooks documentation update
412
+
413
+ ### 2.2.2 ###
414
+ * New hook: feedzy_meta_args
415
+
416
+ ### 2.2.1 ###
417
+ * Minor security improvements
418
+ * Better WordPress coding standard respect
419
+ * Minor fix if does not provide item's author
420
+ * Translations update
421
+
422
+ ### 2.2 ###
423
+ * Minor PHP improvements
424
+ * Remove logo from plugin meta
425
+ * New hook: feedzy_summary_input
426
+ * $feedURL argument added on every available hooks
427
+ * French translation update
428
+ * readme.txt and hooks documentation update
429
+
430
+ ### 2.1 ###
431
+ * internationalization of feeds dates and times (date_i18n)
432
+
433
+ ### 2.0 ###
434
+ * Widget added
435
+ * Translation update
436
+ * Better plugin file structure
437
+ * Improve image fetching with multiple enclosures
438
+ * Tested on WP 4.1 with success!
439
+
440
+ ### 1.7.1 ###
441
+ * Fix typo in PHP which cause issue on fetching images
442
+
443
+ ### 1.7 ###
444
+ * Minor Template and CSS changes
445
+ * New hook: feedzy_thumb_output
446
+ * New hook: feedzy_title_output
447
+ * New hook: feedzy_meta_output
448
+ * New hook: feedzy_summary_output
449
+ * New hook: feedzy_global_output
450
+ * readme.txt update
451
+
452
+ ### 1.6 ###
453
+ * Minor CSS fix
454
+ * Add actions: add_action('rss_item', 'feedzy_include_thumbnail_RSS'); & add_action('rss2_item', 'feedzy_include_thumbnail_RSS')
455
+
456
+ ### 1.5.4 ###
457
+ * Plugin meta translation
458
+ * Remove unnecessary spaces
459
+
460
+ ### 1.5.3 ###
461
+ * TinyMCE UI translation
462
+ * Better fetching image
463
+ * Space between items is calculated based on thumbs size
464
+
465
+ ### 1.5.2 ###
466
+ * Plugin meta update
467
+
468
+ ### 1.5.1 ###
469
+ * New logo
470
+ * Minor CSS fixes
471
+
472
+ ### 1.5 ###
473
+ * New param added to filter item with keywords
474
+ * Default thumb added
475
+ * Fix minor php issue
476
+ * Rename files of the plugin
477
+ * New logo + screenshot (assets)
478
+
479
+ ### 1.4 ###
480
+ * Add "default" parameter to fill image container if no image is fetch or if it is offline
481
+ * Add more control over numeric format in max, size, title & summarylength parameters
482
+
483
+ ### 1.03 ###
484
+ * Shortcode can now be displayed everywhere in the page (CSS is loaded via global var)
485
+
486
+ ### 1.02 ###
487
+ * Error on svn tag
488
+
489
+ ### 1.01 ###
490
+ * Minor CSS fix.
491
+ * Minor PHP changes.
492
+ * Readme.txt updated
493
+
494
+ ### 1.0 ###
495
+ * First release.
496
+
497
+ ## Upgrade Notice ##
498
+
499
+ ### 1.5 ###
500
+ * IMPORTANT: You have to reactivate the plugin after its update!
501
+
502
+ ### 1.0 ###
503
+ * First release.
readme.txt CHANGED
@@ -221,6 +221,13 @@ You have to check first if your feed is valid. Please test it here: https://vali
221
 
222
 
223
  == Changelog ==
 
 
 
 
 
 
 
224
  = 3.2.0 - 2017-08-17 =
225
 
226
  * Fix for image URL issue following some strange patterns.
221
 
222
 
223
  == Changelog ==
224
+ = 3.2.1 - 2017-10-12 =
225
+
226
+ * Adds global settings page.
227
+ * Adds User Agent and Proxy settings.
228
+ * Fix for some edge cases regarding images in the feed.
229
+
230
+
231
  = 3.2.0 - 2017-08-17 =
232
 
233
  * Fix for image URL issue following some strange patterns.
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit858f4bd6988fbef9ce8c9bdd9f52c407::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit5f39049e2ab8c432062d5d8bff102dc0::getLoader();
vendor/autoload_52.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
- return ComposerAutoloaderInit66f0edee7658d67c88aa60a93e45fd69::getLoader();
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
+ return ComposerAutoloaderInita65d57f992be8f52f9013180ac7c1d01::getLoader();
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-deactivate.php CHANGED
@@ -413,7 +413,7 @@ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Deactivate' ) ) :
413
  $list .= '<li ti-option-id="' . $id . '"><input type="radio" name="ti-deactivate-option" id="' . $key . $id . '"><label for="' . $key . $id . '">' . str_replace( '{theme}', $this->product->get_name(), $title ) . '</label>';
414
  if ( array_key_exists( 'type', $attributes ) ) {
415
  $list .= '<div>';
416
- $placeholder = array_key_exists( 'placeholder', $attributes ) ? __( $attributes['placeholder'] ) : '';
417
  switch ( $attributes['type'] ) {
418
  case 'text':
419
  $list .= '<textarea style="width: 100%" rows="1" name="comments" placeholder="' . $placeholder . '"></textarea>';
@@ -431,11 +431,11 @@ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Deactivate' ) ) :
431
  . '<ul class="ti-list">' . $list . '</ul>'
432
  . '<div class="actions">'
433
  . get_submit_button(
434
- __( $button_submit_before ), 'secondary', $this->product->get_key() . 'ti-deactivate-yes', false, array(
435
  'data-after-text' => $button_submit,
436
  )
437
  )
438
- . get_submit_button( __( $button_cancel ), 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
439
  . '</div></div>';
440
  }
441
 
413
  $list .= '<li ti-option-id="' . $id . '"><input type="radio" name="ti-deactivate-option" id="' . $key . $id . '"><label for="' . $key . $id . '">' . str_replace( '{theme}', $this->product->get_name(), $title ) . '</label>';
414
  if ( array_key_exists( 'type', $attributes ) ) {
415
  $list .= '<div>';
416
+ $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
417
  switch ( $attributes['type'] ) {
418
  case 'text':
419
  $list .= '<textarea style="width: 100%" rows="1" name="comments" placeholder="' . $placeholder . '"></textarea>';
431
  . '<ul class="ti-list">' . $list . '</ul>'
432
  . '<div class="actions">'
433
  . get_submit_button(
434
+ $button_submit_before , 'secondary', $this->product->get_key() . 'ti-deactivate-yes', false, array(
435
  'data-after-text' => $button_submit,
436
  )
437
  )
438
+ . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
439
  . '</div></div>';
440
  }
441
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-review.php CHANGED
@@ -21,7 +21,12 @@ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Review' ) ) :
21
  /**
22
  * @var string $heading The heading of the modal
23
  */
24
- private $heading = 'Hey, it’s great to see you have {product} active for a few days now. How is everything going? If you can spare a few moments to rate it on WordPress.org it would help us a lot (and boost my motivation). Cheers! <br/> <br/>~ {developer}, developer of {product}';
 
 
 
 
 
25
 
26
  /**
27
  * @var string $button_cancel The text of the cancel button
@@ -56,9 +61,11 @@ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Review' ) ) :
56
  }
57
 
58
  /**
59
- * Shows the notification
 
 
60
  */
61
- function show_notification() {
62
  if ( ! $this->product->is_wordpress_available() ) {
63
  $this->disable();
64
 
@@ -68,11 +75,26 @@ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Review' ) ) :
68
  if ( 'no' === $show ) {
69
  return false;
70
  }
71
- add_action( 'admin_notices', array( $this, 'admin_notices' ) );
 
 
 
 
 
 
 
 
72
 
73
  return true;
74
  }
75
 
 
 
 
 
 
 
 
76
  /**
77
  * Shows the admin notice
78
  */
@@ -144,15 +166,17 @@ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Review' ) ) :
144
  $heading = apply_filters( $this->product->get_key() . '_feedback_review_heading', $this->heading );
145
  $heading = str_replace(
146
  array( '{product}' ),
147
- trim( str_replace( 'Lite', '', $this->product->get_name() ) ), $heading
148
  );
149
  $heading = str_replace( '{developer}', $this->developers[ $this->product->get_type() ][ rand( 0, ( count( $this->developers[ $this->product->get_type() ] ) - 1 ) ) ], $heading );
150
 
151
  $button_cancel = apply_filters( $this->product->get_key() . '_feedback_review_button_cancel', $this->button_cancel );
152
  $button_do = apply_filters( $this->product->get_key() . '_feedback_review_button_do', $this->button_do );
 
153
 
154
  return '<div id="' . $this->product->get_key() . '-review-notification" class="themeisle-sdk-review-box">'
155
  . '<p>' . $heading . '</p>'
 
156
  . '<div class="actions">'
157
  . '<a href="' . $link . '" target="_blank" class="button button-primary review-dismiss"> ' . $button_do . '</a>'
158
  . get_submit_button( $button_cancel, 'review-dismiss ' . $this->product->get_key() . '-ti-review', $this->product->get_key() . 'ti-review-no', false )
21
  /**
22
  * @var string $heading The heading of the modal
23
  */
24
+ private $heading = 'Hey, it’s great to see you have <b>{product}</b> active for a few days now. How is everything going? If you can spare a few moments to rate it on WordPress.org it would help us a lot (and boost my motivation). Cheers! <br/> <br/>~ {developer}, developer of {product}';
25
+
26
+ /**
27
+ * @var string $msg The text of the modal
28
+ */
29
+ private $msg = '';
30
 
31
  /**
32
  * @var string $button_cancel The text of the cancel button
61
  }
62
 
63
  /**
64
+ * Either we can notify or not.
65
+ *
66
+ * @return bool Notification available or not.
67
  */
68
+ public function can_notify() {
69
  if ( ! $this->product->is_wordpress_available() ) {
70
  $this->disable();
71
 
75
  if ( 'no' === $show ) {
76
  return false;
77
  }
78
+ $finally_show = apply_filters( $this->product->get_key() . '_feedback_review_trigger', true );
79
+ if ( false !== $finally_show ) {
80
+ if ( is_array( $finally_show ) && ! empty( $finally_show ) ) {
81
+ $this->heading = $finally_show['heading'];
82
+ $this->msg = $finally_show['msg'];
83
+ }
84
+ } else {
85
+ return false;
86
+ }
87
 
88
  return true;
89
  }
90
 
91
+ /**
92
+ * Shows the notification
93
+ */
94
+ function show_notification() {
95
+ add_action( 'admin_notices', array( $this, 'admin_notices' ) );
96
+ }
97
+
98
  /**
99
  * Shows the admin notice
100
  */
166
  $heading = apply_filters( $this->product->get_key() . '_feedback_review_heading', $this->heading );
167
  $heading = str_replace(
168
  array( '{product}' ),
169
+ $this->product->get_friendly_name(), $heading
170
  );
171
  $heading = str_replace( '{developer}', $this->developers[ $this->product->get_type() ][ rand( 0, ( count( $this->developers[ $this->product->get_type() ] ) - 1 ) ) ], $heading );
172
 
173
  $button_cancel = apply_filters( $this->product->get_key() . '_feedback_review_button_cancel', $this->button_cancel );
174
  $button_do = apply_filters( $this->product->get_key() . '_feedback_review_button_do', $this->button_do );
175
+ $msg = apply_filters( $this->product->get_key() . '_feedback_review_message', $this->msg );
176
 
177
  return '<div id="' . $this->product->get_key() . '-review-notification" class="themeisle-sdk-review-box">'
178
  . '<p>' . $heading . '</p>'
179
+ . ( $msg ? '<p>' . $msg . '</p>' : '' )
180
  . '<div class="actions">'
181
  . '<a href="' . $link . '" target="_blank" class="button button-primary review-dismiss"> ' . $button_do . '</a>'
182
  . get_submit_button( $button_cancel, 'review-dismiss ' . $this->product->get_key() . '-ti-review', $this->product->get_key() . 'ti-review-no', false )
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-translate.php ADDED
@@ -0,0 +1,966 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The Translate feedback model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Feedback
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+ // Exit if accessed directly.
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Translate' ) ) :
16
+ /**
17
+ * Translate feedback model for ThemeIsle SDK.
18
+ */
19
+ class ThemeIsle_SDK_Feedback_Translate extends ThemeIsle_SDK_Feedback {
20
+
21
+ /**
22
+ * @var string $heading The heading of the modal
23
+ */
24
+ private $heading = 'Improve {product}';
25
+ /**
26
+ * @var string The message.
27
+ */
28
+ private $msg = 'Translating <b>{product}</b> into as many languages as possible is a huge project. We still need help with a lot of them, so if you are good at translating into <b>{language}</b>, it would be greatly appreciated.
29
+ The process is easy, and you can join by following the link below!';
30
+ /**
31
+ * @var string $button_cancel The text of the cancel button
32
+ */
33
+ private $button_cancel = 'No, thanks.';
34
+ /**
35
+ * @var string $button_already The text of the already did it button
36
+ */
37
+ private $button_do = 'Ok, I will gladly help.';
38
+ /**
39
+ * @var array Array of available locals.
40
+ */
41
+ private $locales = array(
42
+ 'af' => array(
43
+ 'slug' => 'af',
44
+ 'name' => 'Afrikaans',
45
+ ),
46
+ 'ak' => array(
47
+ 'slug' => 'ak',
48
+ 'name' => 'Akan',
49
+ ),
50
+ 'am' => array(
51
+ 'slug' => 'am',
52
+ 'name' => 'Amharic',
53
+ ),
54
+ 'ar' => array(
55
+ 'slug' => 'ar',
56
+ 'name' => 'Arabic',
57
+ ),
58
+ 'arq' => array(
59
+ 'slug' => 'arq',
60
+ 'name' => 'Algerian Arabic',
61
+ ),
62
+ 'ary' => array(
63
+ 'slug' => 'ary',
64
+ 'name' => 'Moroccan Arabic',
65
+ ),
66
+ 'as' => array(
67
+ 'slug' => 'as',
68
+ 'name' => 'Assamese',
69
+ ),
70
+ 'ast' => array(
71
+ 'slug' => 'ast',
72
+ 'name' => 'Asturian',
73
+ ),
74
+ 'az' => array(
75
+ 'slug' => 'az',
76
+ 'name' => 'Azerbaijani',
77
+ ),
78
+ 'azb' => array(
79
+ 'slug' => 'azb',
80
+ 'name' => 'South Azerbaijani',
81
+ ),
82
+ 'az_TR' => array(
83
+ 'slug' => 'az-tr',
84
+ 'name' => 'Azerbaijani (Turkey)',
85
+ ),
86
+ 'ba' => array(
87
+ 'slug' => 'ba',
88
+ 'name' => 'Bashkir',
89
+ ),
90
+ 'bal' => array(
91
+ 'slug' => 'bal',
92
+ 'name' => 'Catalan (Balear)',
93
+ ),
94
+ 'bcc' => array(
95
+ 'slug' => 'bcc',
96
+ 'name' => 'Balochi Southern',
97
+ ),
98
+ 'bel' => array(
99
+ 'slug' => 'bel',
100
+ 'name' => 'Belarusian',
101
+ ),
102
+ 'bg_BG' => array(
103
+ 'slug' => 'bg',
104
+ 'name' => 'Bulgarian',
105
+ ),
106
+ 'bn_BD' => array(
107
+ 'slug' => 'bn',
108
+ 'name' => 'Bengali',
109
+ ),
110
+ 'bo' => array(
111
+ 'slug' => 'bo',
112
+ 'name' => 'Tibetan',
113
+ ),
114
+ 'bre' => array(
115
+ 'slug' => 'br',
116
+ 'name' => 'Breton',
117
+ ),
118
+ 'bs_BA' => array(
119
+ 'slug' => 'bs',
120
+ 'name' => 'Bosnian',
121
+ ),
122
+ 'ca' => array(
123
+ 'slug' => 'ca',
124
+ 'name' => 'Catalan',
125
+ ),
126
+ 'ceb' => array(
127
+ 'slug' => 'ceb',
128
+ 'name' => 'Cebuano',
129
+ ),
130
+ 'ckb' => array(
131
+ 'slug' => 'ckb',
132
+ 'name' => 'Kurdish (Sorani)',
133
+ ),
134
+ 'co' => array(
135
+ 'slug' => 'co',
136
+ 'name' => 'Corsican',
137
+ ),
138
+ 'cs_CZ' => array(
139
+ 'slug' => 'cs',
140
+ 'name' => 'Czech',
141
+ ),
142
+ 'cy' => array(
143
+ 'slug' => 'cy',
144
+ 'name' => 'Welsh',
145
+ ),
146
+ 'da_DK' => array(
147
+ 'slug' => 'da',
148
+ 'name' => 'Danish',
149
+ ),
150
+ 'de_DE' => array(
151
+ 'slug' => 'de',
152
+ 'name' => 'German',
153
+ ),
154
+ 'de_CH' => array(
155
+ 'slug' => 'de-ch',
156
+ 'name' => 'German (Switzerland)',
157
+ ),
158
+ 'dv' => array(
159
+ 'slug' => 'dv',
160
+ 'name' => 'Dhivehi',
161
+ ),
162
+ 'dzo' => array(
163
+ 'slug' => 'dzo',
164
+ 'name' => 'Dzongkha',
165
+ ),
166
+ 'el' => array(
167
+ 'slug' => 'el',
168
+ 'name' => 'Greek',
169
+ ),
170
+ 'art_xemoji' => array(
171
+ 'slug' => 'art-xemoji',
172
+ 'name' => 'Emoji',
173
+ ),
174
+ 'en_US' => array(
175
+ 'slug' => 'en',
176
+ 'name' => 'English',
177
+ ),
178
+ 'en_AU' => array(
179
+ 'slug' => 'en-au',
180
+ 'name' => 'English (Australia)',
181
+ ),
182
+ 'en_CA' => array(
183
+ 'slug' => 'en-ca',
184
+ 'name' => 'English (Canada)',
185
+ ),
186
+ 'en_GB' => array(
187
+ 'slug' => 'en-gb',
188
+ 'name' => 'English (UK)',
189
+ ),
190
+ 'en_NZ' => array(
191
+ 'slug' => 'en-nz',
192
+ 'name' => 'English (New Zealand)',
193
+ ),
194
+ 'en_ZA' => array(
195
+ 'slug' => 'en-za',
196
+ 'name' => 'English (South Africa)',
197
+ ),
198
+ 'eo' => array(
199
+ 'slug' => 'eo',
200
+ 'name' => 'Esperanto',
201
+ ),
202
+ 'es_ES' => array(
203
+ 'slug' => 'es',
204
+ 'name' => 'Spanish (Spain)',
205
+ ),
206
+ 'es_AR' => array(
207
+ 'slug' => 'es-ar',
208
+ 'name' => 'Spanish (Argentina)',
209
+ ),
210
+ 'es_CL' => array(
211
+ 'slug' => 'es-cl',
212
+ 'name' => 'Spanish (Chile)',
213
+ ),
214
+ 'es_CO' => array(
215
+ 'slug' => 'es-co',
216
+ 'name' => 'Spanish (Colombia)',
217
+ ),
218
+ 'es_CR' => array(
219
+ 'slug' => 'es-cr',
220
+ 'name' => 'Spanish (Costa Rica)',
221
+ ),
222
+ 'es_GT' => array(
223
+ 'slug' => 'es-gt',
224
+ 'name' => 'Spanish (Guatemala)',
225
+ ),
226
+ 'es_MX' => array(
227
+ 'slug' => 'es-mx',
228
+ 'name' => 'Spanish (Mexico)',
229
+ ),
230
+ 'es_PE' => array(
231
+ 'slug' => 'es-pe',
232
+ 'name' => 'Spanish (Peru)',
233
+ ),
234
+ 'es_PR' => array(
235
+ 'slug' => 'es-pr',
236
+ 'name' => 'Spanish (Puerto Rico)',
237
+ ),
238
+ 'es_VE' => array(
239
+ 'slug' => 'es-ve',
240
+ 'name' => 'Spanish (Venezuela)',
241
+ ),
242
+ 'et' => array(
243
+ 'slug' => 'et',
244
+ 'name' => 'Estonian',
245
+ ),
246
+ 'eu' => array(
247
+ 'slug' => 'eu',
248
+ 'name' => 'Basque',
249
+ ),
250
+ 'fa_IR' => array(
251
+ 'slug' => 'fa',
252
+ 'name' => 'Persian',
253
+ ),
254
+ 'fa_AF' => array(
255
+ 'slug' => 'fa-af',
256
+ 'name' => 'Persian (Afghanistan)',
257
+ ),
258
+ 'fuc' => array(
259
+ 'slug' => 'fuc',
260
+ 'name' => 'Fulah',
261
+ ),
262
+ 'fi' => array(
263
+ 'slug' => 'fi',
264
+ 'name' => 'Finnish',
265
+ ),
266
+ 'fo' => array(
267
+ 'slug' => 'fo',
268
+ 'name' => 'Faroese',
269
+ ),
270
+ 'fr_FR' => array(
271
+ 'slug' => 'fr',
272
+ 'name' => 'French (France)',
273
+ ),
274
+ 'fr_BE' => array(
275
+ 'slug' => 'fr-be',
276
+ 'name' => 'French (Belgium)',
277
+ ),
278
+ 'fr_CA' => array(
279
+ 'slug' => 'fr-ca',
280
+ 'name' => 'French (Canada)',
281
+ ),
282
+ 'frp' => array(
283
+ 'slug' => 'frp',
284
+ 'name' => 'Arpitan',
285
+ ),
286
+ 'fur' => array(
287
+ 'slug' => 'fur',
288
+ 'name' => 'Friulian',
289
+ ),
290
+ 'fy' => array(
291
+ 'slug' => 'fy',
292
+ 'name' => 'Frisian',
293
+ ),
294
+ 'ga' => array(
295
+ 'slug' => 'ga',
296
+ 'name' => 'Irish',
297
+ ),
298
+ 'gd' => array(
299
+ 'slug' => 'gd',
300
+ 'name' => 'Scottish Gaelic',
301
+ ),
302
+ 'gl_ES' => array(
303
+ 'slug' => 'gl',
304
+ 'name' => 'Galician',
305
+ ),
306
+ 'gn' => array(
307
+ 'slug' => 'gn',
308
+ 'name' => 'Guaraní',
309
+ ),
310
+ 'gsw' => array(
311
+ 'slug' => 'gsw',
312
+ 'name' => 'Swiss German',
313
+ ),
314
+ 'gu' => array(
315
+ 'slug' => 'gu',
316
+ 'name' => 'Gujarati',
317
+ ),
318
+ 'hat' => array(
319
+ 'slug' => 'hat',
320
+ 'name' => 'Haitian Creole',
321
+ ),
322
+ 'hau' => array(
323
+ 'slug' => 'hau',
324
+ 'name' => 'Hausa',
325
+ ),
326
+ 'haw_US' => array(
327
+ 'slug' => 'haw',
328
+ 'name' => 'Hawaiian',
329
+ ),
330
+ 'haz' => array(
331
+ 'slug' => 'haz',
332
+ 'name' => 'Hazaragi',
333
+ ),
334
+ 'he_IL' => array(
335
+ 'slug' => 'he',
336
+ 'name' => 'Hebrew',
337
+ ),
338
+ 'hi_IN' => array(
339
+ 'slug' => 'hi',
340
+ 'name' => 'Hindi',
341
+ ),
342
+ 'hr' => array(
343
+ 'slug' => 'hr',
344
+ 'name' => 'Croatian',
345
+ ),
346
+ 'hu_HU' => array(
347
+ 'slug' => 'hu',
348
+ 'name' => 'Hungarian',
349
+ ),
350
+ 'hy' => array(
351
+ 'slug' => 'hy',
352
+ 'name' => 'Armenian',
353
+ ),
354
+ 'id_ID' => array(
355
+ 'slug' => 'id',
356
+ 'name' => 'Indonesian',
357
+ ),
358
+ 'ido' => array(
359
+ 'slug' => 'ido',
360
+ 'name' => 'Ido',
361
+ ),
362
+ 'is_IS' => array(
363
+ 'slug' => 'is',
364
+ 'name' => 'Icelandic',
365
+ ),
366
+ 'it_IT' => array(
367
+ 'slug' => 'it',
368
+ 'name' => 'Italian',
369
+ ),
370
+ 'ja' => array(
371
+ 'slug' => 'ja',
372
+ 'name' => 'Japanese',
373
+ ),
374
+ 'jv_ID' => array(
375
+ 'slug' => 'jv',
376
+ 'name' => 'Javanese',
377
+ ),
378
+ 'ka_GE' => array(
379
+ 'slug' => 'ka',
380
+ 'name' => 'Georgian',
381
+ ),
382
+ 'kab' => array(
383
+ 'slug' => 'kab',
384
+ 'name' => 'Kabyle',
385
+ ),
386
+ 'kal' => array(
387
+ 'slug' => 'kal',
388
+ 'name' => 'Greenlandic',
389
+ ),
390
+ 'kin' => array(
391
+ 'slug' => 'kin',
392
+ 'name' => 'Kinyarwanda',
393
+ ),
394
+ 'kk' => array(
395
+ 'slug' => 'kk',
396
+ 'name' => 'Kazakh',
397
+ ),
398
+ 'km' => array(
399
+ 'slug' => 'km',
400
+ 'name' => 'Khmer',
401
+ ),
402
+ 'kn' => array(
403
+ 'slug' => 'kn',
404
+ 'name' => 'Kannada',
405
+ ),
406
+ 'ko_KR' => array(
407
+ 'slug' => 'ko',
408
+ 'name' => 'Korean',
409
+ ),
410
+ 'kir' => array(
411
+ 'slug' => 'kir',
412
+ 'name' => 'Kyrgyz',
413
+ ),
414
+ 'lb_LU' => array(
415
+ 'slug' => 'lb',
416
+ 'name' => 'Luxembourgish',
417
+ ),
418
+ 'li' => array(
419
+ 'slug' => 'li',
420
+ 'name' => 'Limburgish',
421
+ ),
422
+ 'lin' => array(
423
+ 'slug' => 'lin',
424
+ 'name' => 'Lingala',
425
+ ),
426
+ 'lo' => array(
427
+ 'slug' => 'lo',
428
+ 'name' => 'Lao',
429
+ ),
430
+ 'lt_LT' => array(
431
+ 'slug' => 'lt',
432
+ 'name' => 'Lithuanian',
433
+ ),
434
+ 'lv' => array(
435
+ 'slug' => 'lv',
436
+ 'name' => 'Latvian',
437
+ ),
438
+ 'me_ME' => array(
439
+ 'slug' => 'me',
440
+ 'name' => 'Montenegrin',
441
+ ),
442
+ 'mg_MG' => array(
443
+ 'slug' => 'mg',
444
+ 'name' => 'Malagasy',
445
+ ),
446
+ 'mk_MK' => array(
447
+ 'slug' => 'mk',
448
+ 'name' => 'Macedonian',
449
+ ),
450
+ 'ml_IN' => array(
451
+ 'slug' => 'ml',
452
+ 'name' => 'Malayalam',
453
+ ),
454
+ 'mlt' => array(
455
+ 'slug' => 'mlt',
456
+ 'name' => 'Maltese',
457
+ ),
458
+ 'mn' => array(
459
+ 'slug' => 'mn',
460
+ 'name' => 'Mongolian',
461
+ ),
462
+ 'mr' => array(
463
+ 'slug' => 'mr',
464
+ 'name' => 'Marathi',
465
+ ),
466
+ 'mri' => array(
467
+ 'slug' => 'mri',
468
+ 'name' => 'Maori',
469
+ ),
470
+ 'ms_MY' => array(
471
+ 'slug' => 'ms',
472
+ 'name' => 'Malay',
473
+ ),
474
+ 'my_MM' => array(
475
+ 'slug' => 'mya',
476
+ 'name' => 'Myanmar (Burmese)',
477
+ ),
478
+ 'ne_NP' => array(
479
+ 'slug' => 'ne',
480
+ 'name' => 'Nepali',
481
+ ),
482
+ 'nb_NO' => array(
483
+ 'slug' => 'nb',
484
+ 'name' => 'Norwegian (Bokmål)',
485
+ ),
486
+ 'nl_NL' => array(
487
+ 'slug' => 'nl',
488
+ 'name' => 'Dutch',
489
+ ),
490
+ 'nl_BE' => array(
491
+ 'slug' => 'nl-be',
492
+ 'name' => 'Dutch (Belgium)',
493
+ ),
494
+ 'nn_NO' => array(
495
+ 'slug' => 'nn',
496
+ 'name' => 'Norwegian (Nynorsk)',
497
+ ),
498
+ 'oci' => array(
499
+ 'slug' => 'oci',
500
+ 'name' => 'Occitan',
501
+ ),
502
+ 'ory' => array(
503
+ 'slug' => 'ory',
504
+ 'name' => 'Oriya',
505
+ ),
506
+ 'os' => array(
507
+ 'slug' => 'os',
508
+ 'name' => 'Ossetic',
509
+ ),
510
+ 'pa_IN' => array(
511
+ 'slug' => 'pa',
512
+ 'name' => 'Punjabi',
513
+ ),
514
+ 'pl_PL' => array(
515
+ 'slug' => 'pl',
516
+ 'name' => 'Polish',
517
+ ),
518
+ 'pt_BR' => array(
519
+ 'slug' => 'pt-br',
520
+ 'name' => 'Portuguese (Brazil)',
521
+ ),
522
+ 'pt_PT' => array(
523
+ 'slug' => 'pt',
524
+ 'name' => 'Portuguese (Portugal)',
525
+ ),
526
+ 'ps' => array(
527
+ 'slug' => 'ps',
528
+ 'name' => 'Pashto',
529
+ ),
530
+ 'rhg' => array(
531
+ 'slug' => 'rhg',
532
+ 'name' => 'Rohingya',
533
+ ),
534
+ 'ro_RO' => array(
535
+ 'slug' => 'ro',
536
+ 'name' => 'Romanian',
537
+ ),
538
+ 'roh' => array(
539
+ 'slug' => 'roh',
540
+ 'name' => 'Romansh',
541
+ ),
542
+ 'ru_RU' => array(
543
+ 'slug' => 'ru',
544
+ 'name' => 'Russian',
545
+ ),
546
+ 'rue' => array(
547
+ 'slug' => 'rue',
548
+ 'name' => 'Rusyn',
549
+ ),
550
+ 'rup_MK' => array(
551
+ 'slug' => 'rup',
552
+ 'name' => 'Aromanian',
553
+ ),
554
+ 'sah' => array(
555
+ 'slug' => 'sah',
556
+ 'name' => 'Sakha',
557
+ ),
558
+ 'sa_IN' => array(
559
+ 'slug' => 'sa-in',
560
+ 'name' => 'Sanskrit',
561
+ ),
562
+ 'scn' => array(
563
+ 'slug' => 'scn',
564
+ 'name' => 'Sicilian',
565
+ ),
566
+ 'si_LK' => array(
567
+ 'slug' => 'si',
568
+ 'name' => 'Sinhala',
569
+ ),
570
+ 'sk_SK' => array(
571
+ 'slug' => 'sk',
572
+ 'name' => 'Slovak',
573
+ ),
574
+ 'sl_SI' => array(
575
+ 'slug' => 'sl',
576
+ 'name' => 'Slovenian',
577
+ ),
578
+ 'sna' => array(
579
+ 'slug' => 'sna',
580
+ 'name' => 'Shona',
581
+ ),
582
+ 'snd' => array(
583
+ 'slug' => 'snd',
584
+ 'name' => 'Sindhi',
585
+ ),
586
+ 'so_SO' => array(
587
+ 'slug' => 'so',
588
+ 'name' => 'Somali',
589
+ ),
590
+ 'sq' => array(
591
+ 'slug' => 'sq',
592
+ 'name' => 'Albanian',
593
+ ),
594
+ 'sq_XK' => array(
595
+ 'slug' => 'sq-xk',
596
+ 'name' => 'Shqip (Kosovo)',
597
+ ),
598
+ 'sr_RS' => array(
599
+ 'slug' => 'sr',
600
+ 'name' => 'Serbian',
601
+ ),
602
+ 'srd' => array(
603
+ 'slug' => 'srd',
604
+ 'name' => 'Sardinian',
605
+ ),
606
+ 'su_ID' => array(
607
+ 'slug' => 'su',
608
+ 'name' => 'Sundanese',
609
+ ),
610
+ 'sv_SE' => array(
611
+ 'slug' => 'sv',
612
+ 'name' => 'Swedish',
613
+ ),
614
+ 'sw' => array(
615
+ 'slug' => 'sw',
616
+ 'name' => 'Swahili',
617
+ ),
618
+ 'syr' => array(
619
+ 'slug' => 'syr',
620
+ 'name' => 'Syriac',
621
+ ),
622
+ 'szl' => array(
623
+ 'slug' => 'szl',
624
+ 'name' => 'Silesian',
625
+ ),
626
+ 'ta_IN' => array(
627
+ 'slug' => 'ta',
628
+ 'name' => 'Tamil',
629
+ ),
630
+ 'ta_LK' => array(
631
+ 'slug' => 'ta-lk',
632
+ 'name' => 'Tamil (Sri Lanka)',
633
+ ),
634
+ 'tah' => array(
635
+ 'slug' => 'tah',
636
+ 'name' => 'Tahitian',
637
+ ),
638
+ 'te' => array(
639
+ 'slug' => 'te',
640
+ 'name' => 'Telugu',
641
+ ),
642
+ 'tg' => array(
643
+ 'slug' => 'tg',
644
+ 'name' => 'Tajik',
645
+ ),
646
+ 'th' => array(
647
+ 'slug' => 'th',
648
+ 'name' => 'Thai',
649
+ ),
650
+ 'tir' => array(
651
+ 'slug' => 'tir',
652
+ 'name' => 'Tigrinya',
653
+ ),
654
+ 'tl' => array(
655
+ 'slug' => 'tl',
656
+ 'name' => 'Tagalog',
657
+ ),
658
+ 'tr_TR' => array(
659
+ 'slug' => 'tr',
660
+ 'name' => 'Turkish',
661
+ ),
662
+ 'tt_RU' => array(
663
+ 'slug' => 'tt',
664
+ 'name' => 'Tatar',
665
+ ),
666
+ 'tuk' => array(
667
+ 'slug' => 'tuk',
668
+ 'name' => 'Turkmen',
669
+ ),
670
+ 'twd' => array(
671
+ 'slug' => 'twd',
672
+ 'name' => 'Tweants',
673
+ ),
674
+ 'tzm' => array(
675
+ 'slug' => 'tzm',
676
+ 'name' => 'Tamazight (Central Atlas)',
677
+ ),
678
+ 'ug_CN' => array(
679
+ 'slug' => 'ug',
680
+ 'name' => 'Uighur',
681
+ ),
682
+ 'uk' => array(
683
+ 'slug' => 'uk',
684
+ 'name' => 'Ukrainian',
685
+ ),
686
+ 'ur' => array(
687
+ 'slug' => 'ur',
688
+ 'name' => 'Urdu',
689
+ ),
690
+ 'uz_UZ' => array(
691
+ 'slug' => 'uz',
692
+ 'name' => 'Uzbek',
693
+ ),
694
+ 'vi' => array(
695
+ 'slug' => 'vi',
696
+ 'name' => 'Vietnamese',
697
+ ),
698
+ 'wa' => array(
699
+ 'slug' => 'wa',
700
+ 'name' => 'Walloon',
701
+ ),
702
+ 'xho' => array(
703
+ 'slug' => 'xho',
704
+ 'name' => 'Xhosa',
705
+ ),
706
+ 'xmf' => array(
707
+ 'slug' => 'xmf',
708
+ 'name' => 'Mingrelian',
709
+ ),
710
+ 'yor' => array(
711
+ 'slug' => 'yor',
712
+ 'name' => 'Yoruba',
713
+ ),
714
+ 'zh_CN' => array(
715
+ 'slug' => 'zh-cn',
716
+ 'name' => 'Chinese (China)',
717
+ ),
718
+ 'zh_HK' => array(
719
+ 'slug' => 'zh-hk',
720
+ 'name' => 'Chinese (Hong Kong)',
721
+ ),
722
+ 'zh_TW' => array(
723
+ 'slug' => 'zh-tw',
724
+ 'name' => 'Chinese (Taiwan)',
725
+ ),
726
+ 'de_DE_formal' => array(
727
+ 'slug' => 'de/formal',
728
+ 'name' => 'German (Formal)',
729
+ ),
730
+ 'nl_NL_formal' => array(
731
+ 'slug' => 'nl/formal',
732
+ 'name' => 'Dutch (Formal)',
733
+ ),
734
+ 'de_CH_informal' => array(
735
+ 'slug' => 'de-ch/informal',
736
+ 'name' => 'Chinese (Taiwan)',
737
+ ),
738
+ 'pt_PT_ao90' => array(
739
+ 'slug' => 'pt/ao90',
740
+ 'name' => 'Portuguese (Portugal, AO90)',
741
+ ),
742
+ );
743
+
744
+ /**
745
+ * ThemeIsle_SDK_Feedback_Translate constructor.
746
+ *
747
+ * @param ThemeIsle_SDK_Product $product_object The product object.
748
+ */
749
+ public function __construct( $product_object ) {
750
+ parent::__construct( $product_object );
751
+ }
752
+
753
+ /**
754
+ * Return the locale path.
755
+ *
756
+ * @param string $locale Locale code.
757
+ *
758
+ * @return string Locale path.
759
+ */
760
+ private function get_locale_paths( $locale ) {
761
+ if ( empty( $locale ) ) {
762
+ return '';
763
+ }
764
+
765
+ $slug = isset( $this->locales[ $locale ] ) ? $this->locales[ $locale ]['slug'] : '';
766
+ if ( empty( $slug ) ) {
767
+ return '';
768
+ }
769
+ if ( strpos( $slug, '/' ) === false ) {
770
+ $slug .= '/default';
771
+ }
772
+ $url = 'https://translate.wordpress.org/projects/wp-' . $this->product->get_type() . 's/' . $this->product->get_slug() . '/' . ( $this->product->get_type() === 'plugin' ? 'dev/' : '' ) . $slug . '?filters%5Bstatus%5D=untranslated&sort%5Bby%5D=random';
773
+
774
+ return $url;
775
+ }
776
+
777
+ /**
778
+ * Registers the hooks
779
+ */
780
+ public function setup_hooks_child() {
781
+ add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'dismiss' ) );
782
+ }
783
+
784
+ /**
785
+ * Either we should show the notification or not.
786
+ *
787
+ * @return bool Valid notification.
788
+ */
789
+ function can_notify() {
790
+ if ( ! $this->product->is_wordpress_available() ) {
791
+ $this->disable();
792
+
793
+ return false;
794
+ }
795
+ $show = get_option( $this->product->get_key() . '_translate_flag', 'yes' );
796
+ if ( 'no' === $show ) {
797
+ return false;
798
+ }
799
+ $lang = get_user_locale();
800
+ if ( 'en_US' === $lang ) {
801
+ return false;
802
+ }
803
+ $languages = $this->get_translations();
804
+ if ( ! isset( $languages['translations'] ) ) {
805
+ return false;
806
+ }
807
+
808
+ $languages = $languages['translations'];
809
+ $available = wp_list_pluck( $languages, 'language' );
810
+ if ( in_array( $lang, $available ) ) {
811
+ return false;
812
+ }
813
+ if ( ! isset( $this->locales[ $lang ] ) ) {
814
+ return false;
815
+ }
816
+
817
+ return true;
818
+ }
819
+
820
+ /**
821
+ * Shows the notification
822
+ */
823
+ function show_notification() {
824
+ add_action( 'admin_notices', array( $this, 'admin_notices' ) );
825
+ }
826
+
827
+ /**
828
+ * Shows the admin notice
829
+ */
830
+ function admin_notices() {
831
+ $id = $this->product->get_key() . '_translate';
832
+
833
+ $this->add_css( $this->product->get_key() );
834
+ $this->add_js( $this->product->get_key() );
835
+ $html = $this->get_html( $this->product->get_key() );
836
+
837
+ if ( $html ) {
838
+ echo '<div class="notice notice-success is-dismissible" id="' . $id . '" ><div class="themeisle-translate-box">' . $html . '</div></div>';
839
+ }
840
+ }
841
+
842
+ /**
843
+ * Loads the css
844
+ *
845
+ * @param string $key The product key.
846
+ */
847
+ function add_css( $key ) {
848
+ ?>
849
+ <style type="text/css" id="<?php echo $key; ?>ti-translate-css">
850
+ </style>
851
+ <?php
852
+ }
853
+
854
+ /**
855
+ * Loads the js
856
+ *
857
+ * @param string $key The product key.
858
+ */
859
+ function add_js( $key ) {
860
+ ?>
861
+ <script type="text/javascript" id="<?php echo $key; ?>ti-translate-js">
862
+ (function ($) {
863
+ $(document).ready(function () {
864
+ $('#<?php echo $key; ?>_translate').on('click', '.translate-dismiss', function (e) {
865
+
866
+ $.ajax({
867
+ url: ajaxurl,
868
+ method: "post",
869
+ data: {
870
+ 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
871
+ 'action': '<?php echo $this->product->get_key() . __CLASS__; ?>'
872
+ },
873
+ success: function () {
874
+ $('#<?php echo $key; ?>_translate').hide();
875
+ }
876
+ });
877
+ });
878
+ });
879
+ })(jQuery);
880
+ </script>
881
+ <?php
882
+ }
883
+
884
+ /**
885
+ * Fetch translations from api.
886
+ *
887
+ * @return mixed Translation array.
888
+ */
889
+ private function get_translations() {
890
+ $cache_key = $this->product->get_key() . '_all_languages';
891
+ $translations = get_transient( $cache_key );
892
+
893
+ if ( $translations === false ) {
894
+ require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
895
+ $translations = translations_api(
896
+ $this->product->get_type() . 's',
897
+ array(
898
+ 'slug' => $this->product->get_slug(),
899
+ 'version' => $this->product->get_version(),
900
+ )
901
+ );
902
+ set_transient( $cache_key, $translations, WEEK_IN_SECONDS );
903
+ }
904
+
905
+ return $translations;
906
+
907
+ }
908
+
909
+ /**
910
+ * Generates the HTML
911
+ *
912
+ * @param string $key The product key.
913
+ *
914
+ * @return void|string Html code of the notification.
915
+ */
916
+ function get_html( $key ) {
917
+ $lang = get_user_locale();
918
+ $link = $this->get_locale_paths( $lang );
919
+ $heading = apply_filters( $this->product->get_key() . '_feedback_translate_heading', $this->heading );
920
+ $product = $this->product->get_friendly_name();
921
+ $heading = str_replace(
922
+ array( '{product}' ),
923
+ $product, $heading
924
+ );
925
+
926
+ $message = apply_filters( $this->product->get_key() . '_feedback_translation', $this->msg );
927
+ $language_meta = $this->locales[ $lang ];
928
+ $message = str_replace( '{language}', $language_meta['name'], $message );
929
+ $message = str_replace( '{product}', $product, $message );
930
+ $button_cancel = apply_filters( $this->product->get_key() . '_feedback_translate_button_cancel', $this->button_cancel );
931
+ $button_do = apply_filters( $this->product->get_key() . '_feedback_translate_button_do', $this->button_do );
932
+
933
+ return '<div id="' . $this->product->get_key() . '-translate-notification" class="themeisle-sdk-translate-box">'
934
+ . '<h2>' . $heading . '</h2>'
935
+ . '<p>' . $message . '</p>'
936
+ . '<div class="actions">'
937
+ . '<a href="' . $link . '" target="_blank" class="button button-primary translate-dismiss"> ' . $button_do . '</a>&nbsp;'
938
+ . get_submit_button( $button_cancel, 'translate-dismiss ' . $this->product->get_key() . '-ti-translate', $this->product->get_key() . 'ti-translate-no', false )
939
+ . '</div></br></div>';
940
+ }
941
+
942
+ /**
943
+ * Called when the either button is clicked
944
+ */
945
+ function dismiss() {
946
+ check_ajax_referer( (string) __CLASS__, 'nonce' );
947
+
948
+ $this->disable();
949
+ }
950
+
951
+ /**
952
+ * Disables the notification
953
+ */
954
+ protected function disable() {
955
+
956
+ update_option( $this->product->get_key() . '_translate_flag', 'no' );
957
+ }
958
+
959
+ /**
960
+ * Enables the notification
961
+ */
962
+ protected function enable() {
963
+ update_option( $this->product->get_key() . '_translate_flag', 'yes' );
964
+ }
965
+ }
966
+ endif;
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-loader.php CHANGED
@@ -66,11 +66,16 @@ if ( ! class_exists( 'ThemeIsle_SDK_Loader' ) ) :
66
  if ( array_key_exists( 'review', $instances ) ) {
67
  $notifications[] = $instances['review'];
68
  }
 
 
 
69
  new ThemeIsle_SDK_Notification_Manager( $product_object, $notifications );
70
  if ( ! $product_object->is_external_author() ) {
71
  new ThemeIsle_SDK_Widgets_Factory( $product_object, $product_object->get_widget_types() );
72
  }
73
-
 
 
74
  return self::$instance;
75
  }
76
 
66
  if ( array_key_exists( 'review', $instances ) ) {
67
  $notifications[] = $instances['review'];
68
  }
69
+ if ( array_key_exists( 'translate', $instances ) ) {
70
+ $notifications[] = $instances['translate'];
71
+ }
72
  new ThemeIsle_SDK_Notification_Manager( $product_object, $notifications );
73
  if ( ! $product_object->is_external_author() ) {
74
  new ThemeIsle_SDK_Widgets_Factory( $product_object, $product_object->get_widget_types() );
75
  }
76
+ if ( ! $product_object->is_external_author() ) {
77
+ new ThemeIsle_SDK_Rollback( $product_object );
78
+ }
79
  return self::$instance;
80
  }
81
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-logger.php CHANGED
@@ -37,7 +37,7 @@ if ( ! class_exists( 'ThemeIsle_SDK_Logger' ) ) :
37
  /**
38
  * @var string $heading The heading of the modal
39
  */
40
- private $heading = 'Do you enjoy {product}? Become a contributor by opting in to our anonymous data tracking. We guarantee no sensitive data is collected.';
41
 
42
  /**
43
  * @var string $button_submit The text of the submit button
@@ -110,20 +110,27 @@ if ( ! class_exists( 'ThemeIsle_SDK_Logger' ) ) :
110
  }
111
 
112
  /**
113
- * Shows the notification
 
 
114
  */
115
- function show_notification() {
116
  $show = $this->product->is_logger_active();
117
  $checked = get_option( $this->product->logger_option, '' );
118
  if ( ! $show && $checked == '' ) {
119
- add_action( 'admin_notices', array( $this, 'admin_notices' ) );
120
-
121
  return true;
122
  }
123
 
124
  return false;
125
  }
126
 
 
 
 
 
 
 
 
127
  /**
128
  * Shows the admin notice
129
  */
@@ -155,12 +162,12 @@ if ( ! class_exists( 'ThemeIsle_SDK_Logger' ) ) :
155
  . '<p>' . $heading . '</p>'
156
  . '<div class="actions">'
157
  . get_submit_button(
158
- __( $button_submit ), 'primary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-yes', false, array(
159
  'data-ti-log-enable' => 1,
160
  )
161
  )
162
  . get_submit_button(
163
- __( $button_cancel ), 'secondary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-no', false, array(
164
  'data-ti-log-enable' => 0,
165
  )
166
  )
37
  /**
38
  * @var string $heading The heading of the modal
39
  */
40
+ private $heading = 'Do you enjoy <b>{product}</b>? Become a contributor by opting in to our anonymous data tracking. We guarantee no sensitive data is collected.';
41
 
42
  /**
43
  * @var string $button_submit The text of the submit button
110
  }
111
 
112
  /**
113
+ * Either we should show the notification or not.
114
+ *
115
+ * @return bool Valida notification.
116
  */
117
+ function can_notify() {
118
  $show = $this->product->is_logger_active();
119
  $checked = get_option( $this->product->logger_option, '' );
120
  if ( ! $show && $checked == '' ) {
 
 
121
  return true;
122
  }
123
 
124
  return false;
125
  }
126
 
127
+ /**
128
+ * Shows the notification
129
+ */
130
+ function show_notification() {
131
+ add_action( 'admin_notices', array( $this, 'admin_notices' ) );
132
+ }
133
+
134
  /**
135
  * Shows the admin notice
136
  */
162
  . '<p>' . $heading . '</p>'
163
  . '<div class="actions">'
164
  . get_submit_button(
165
+ $button_submit, 'primary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-yes', false, array(
166
  'data-ti-log-enable' => 1,
167
  )
168
  )
169
  . get_submit_button(
170
+ $button_cancel, 'secondary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-no', false, array(
171
  'data-ti-log-enable' => 0,
172
  )
173
  )
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-notification-manager.php CHANGED
@@ -24,7 +24,7 @@ if ( ! class_exists( 'ThemeIsle_SDK_Notification_Manager' ) ) :
24
  /**
25
  * @var array Notifications for the current product.
26
  */
27
- private $notifications = array();
28
  /**
29
  * @var ThemeIsle_SDK_Product Current product.
30
  */
@@ -57,7 +57,7 @@ if ( ! class_exists( 'ThemeIsle_SDK_Notification_Manager' ) ) :
57
  if ( ( time() - $this->product->get_install_time() ) > self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) {
58
  if ( $this->product instanceof ThemeIsle_SDK_Product && $this->callbacks && is_array( $this->callbacks ) ) {
59
  foreach ( $this->callbacks as $instance ) {
60
- $this->notifications[ $this->product->get_key() . get_class( $instance ) ] = $instance;
61
  }
62
  }
63
  }
@@ -75,45 +75,31 @@ if ( ! class_exists( 'ThemeIsle_SDK_Notification_Manager' ) ) :
75
  * Shows the notification
76
  */
77
  function show_notification() {
78
-
79
- $hidden = get_option( 'themeisle_sdk_notification_hidden', array() );
80
- $instances = $this->notifications;
81
  if ( empty( $instances ) ) {
82
  return;
83
  }
84
 
85
- // Get timestamp of last notification.
86
- $old = 0;
87
- if ( ! empty( $hidden ) ) {
88
- $old = $hidden[ count( $hidden ) - 1 ]['time'];
89
- }
90
- // Check if the current one is expired.
91
- if ( ( time() - $old ) > self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) {
92
- // Get hidden notifications key.
93
- $hidden_ones = wp_list_pluck( $hidden, 'key' );
94
- // Get the non-hidden notifications.
95
- $available_notifications = array_diff( array_keys( $instances ), $hidden_ones );
96
- if ( empty( $available_notifications ) ) {
97
- return;
98
- }
99
- // Get the first notification available.
100
- $new_one = reset( $available_notifications );
101
 
102
- $instance = $instances[ $new_one ];
103
- $hidden[] = array(
104
- 'time' => time(),
105
- 'key' => $new_one,
106
- );
107
- update_option( 'themeisle_sdk_notification_hidden', $hidden );
108
- } else {
109
- $key = $hidden[ count( $hidden ) - 1 ]['key'];
110
- if ( ! isset( $this->notifications[ $key ] ) ) {
111
- return;
112
- } else {
113
- $instance = $this->notifications[ $key ];
114
  }
115
  }
116
- $instance->show_notification();
117
  }
118
  }
119
  endif;
24
  /**
25
  * @var array Notifications for the current product.
26
  */
27
+ static private $notifications = array();
28
  /**
29
  * @var ThemeIsle_SDK_Product Current product.
30
  */
57
  if ( ( time() - $this->product->get_install_time() ) > self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) {
58
  if ( $this->product instanceof ThemeIsle_SDK_Product && $this->callbacks && is_array( $this->callbacks ) ) {
59
  foreach ( $this->callbacks as $instance ) {
60
+ self::$notifications[ $this->product->get_key() . get_class( $instance ) ] = $instance;
61
  }
62
  }
63
  }
75
  * Shows the notification
76
  */
77
  function show_notification() {
78
+ $instances = self::$notifications;
 
 
79
  if ( empty( $instances ) ) {
80
  return;
81
  }
82
 
83
+ $available = array_keys( $instances );
84
+ $active = get_option( 'themeisle_sdk_active_notification', array() );
85
+
86
+ foreach ( $available as $key ) {
87
+ $instance = $instances[ $key ];
88
+ if ( $instance->can_notify() ) {
 
 
 
 
 
 
 
 
 
 
89
 
90
+ // Detect notification switch.
91
+ if ( empty( $active['key'] ) || ( $active['key'] != $key ) ) {
92
+ $active['key'] = $key;
93
+ $active['time'] = time();
94
+ update_option( 'themeisle_sdk_active_notification', $active );
95
+ }
96
+ if ( ( time() - $active['time'] ) > ( self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) ) {
97
+ $instance->show_notification();
98
+ }
99
+ break;
 
 
100
  }
101
  }
102
+
103
  }
104
  }
105
  endif;
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php CHANGED
@@ -154,6 +154,7 @@ if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
154
  }
155
  if ( $this->is_wordpress_available() ) {
156
  $this->feedback_types[] = 'review';
 
157
  }
158
  }
159
 
@@ -247,6 +248,147 @@ if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
247
  return $this->wordpress_available;
248
  }
249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  /**
251
  * Return the product key.
252
  *
@@ -256,6 +398,18 @@ if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
256
  return $this->key;
257
  }
258
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  /**
260
  * Either the product requires license or not.
261
  *
154
  }
155
  if ( $this->is_wordpress_available() ) {
156
  $this->feedback_types[] = 'review';
157
+ $this->feedback_types[] = 'translate';
158
  }
159
  }
160
 
248
  return $this->wordpress_available;
249
  }
250
 
251
+ /**
252
+ * @return array Array of available versions.
253
+ */
254
+ private function get_plugin_versions() {
255
+
256
+ $url = sprintf( 'https://api.wordpress.org/plugins/info/1.0/%s', $this->get_slug() );
257
+ $response = wp_remote_get( $url );
258
+ if ( is_wp_error( $response ) ) {
259
+ return array();
260
+ }
261
+ $response = wp_remote_retrieve_body( $response );
262
+ $response = maybe_unserialize( $response );
263
+
264
+ if ( ! is_object( $response ) ) {
265
+ return array();
266
+ }
267
+ if ( ! isset( $response->versions ) ) {
268
+ return array();
269
+ }
270
+ $versions = array();
271
+ foreach ( $response->versions as $version => $zip ) {
272
+ $versions[] = array(
273
+ 'version' => $version,
274
+ 'url' => $zip,
275
+ );
276
+ }
277
+
278
+ return $versions;
279
+ }
280
+
281
+ /**
282
+ * Return theme versions.
283
+ *
284
+ * @return array Theme versions array.
285
+ */
286
+ public function get_theme_versions() {
287
+ $url = sprintf( 'https://api.wordpress.org/themes/info/1.1/?action=theme_information&request[slug]=%s&request[fields][versions]=true', $this->get_slug() );
288
+ $response = wp_remote_get( $url );
289
+ if ( is_wp_error( $response ) ) {
290
+ return array();
291
+ }
292
+ $response = wp_remote_retrieve_body( $response );
293
+ $response = json_decode( $response );
294
+
295
+ if ( ! is_object( $response ) ) {
296
+ return array();
297
+ }
298
+ if ( ! isset( $response->versions ) ) {
299
+ return array();
300
+ }
301
+ $versions = array();
302
+ foreach ( $response->versions as $version => $zip ) {
303
+ $versions[] = array(
304
+ 'version' => $version,
305
+ 'url' => $zip,
306
+ );
307
+ }
308
+
309
+ return $versions;
310
+ }
311
+
312
+ /**
313
+ * Get versions array from wp.org
314
+ *
315
+ * @return array Array of versions.
316
+ */
317
+ private function get_api_versions() {
318
+ if ( ! $this->is_wordpress_available() ) {
319
+ return array();
320
+ }
321
+
322
+ $cache_key = $this->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->version ) . 'versions';
323
+ $cache_versions = get_transient( $this->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->version ) . 'versions' );
324
+ if ( false == $cache_versions ) {
325
+ $versions = array();
326
+ if ( $this->get_type() === 'plugin' ) {
327
+ $versions = $this->get_plugin_versions();
328
+ }
329
+
330
+ if ( $this->get_type() === 'theme' ) {
331
+ $versions = $this->get_theme_versions();
332
+ }
333
+ set_transient( $cache_key, $versions, MONTH_IN_SECONDS );
334
+ } else {
335
+ $versions = is_array( $cache_versions ) ? $cache_versions : array();
336
+ }
337
+
338
+ return $versions;
339
+ }
340
+
341
+ /**
342
+ * Get the last rollback for this product.
343
+ *
344
+ * @return array The rollback version.
345
+ */
346
+ public function get_rollback() {
347
+ $rollback = array();
348
+ $versions = $this->get_api_versions();
349
+ $versions = apply_filters( $this->get_key() . '_rollbacks', $versions );
350
+
351
+ if ( $versions ) {
352
+ usort( $versions, array( $this, 'sort_rollback_array' ) );
353
+ foreach ( $versions as $version ) {
354
+ if ( isset( $version['version'] ) && isset( $version['url'] ) && version_compare( $this->version, $version['version'], '>' ) ) {
355
+ $rollback = $version;
356
+ break;
357
+ }
358
+ }
359
+ }
360
+
361
+ return $rollback;
362
+ }
363
+
364
+ /**
365
+ * Sort the rollbacks array in descending order.
366
+ */
367
+ public function sort_rollback_array( $a, $b ) {
368
+ return version_compare( $a['version'], $b['version'], '<' ) > 0;
369
+ }
370
+
371
+ /**
372
+ * If product can be rolled back.
373
+ *
374
+ * @return bool Can the product be rolled back or not.
375
+ */
376
+ public function can_rollback() {
377
+ if ( $this->get_type() === 'theme' ) {
378
+ if ( ! current_user_can( 'switch_themes' ) ) {
379
+ return false;
380
+ }
381
+ }
382
+ if ( $this->get_type() === 'plugin' ) {
383
+ if ( ! current_user_can( 'install_plugins' ) ) {
384
+ return false;
385
+ }
386
+ }
387
+ $rollback = $this->get_rollback();
388
+
389
+ return ! empty( $rollback );
390
+ }
391
+
392
  /**
393
  * Return the product key.
394
  *
398
  return $this->key;
399
  }
400
 
401
+ /**
402
+ * Return friendly name.
403
+ *
404
+ * @return string Friendly name.
405
+ */
406
+ public function get_friendly_name() {
407
+ $name = apply_filters( $this->get_key() . '_friendly_name', trim( str_replace( 'Lite', '', $this->get_name() ) ) );
408
+ $name = rtrim( $name, '- ' );
409
+
410
+ return $name;
411
+ }
412
+
413
  /**
414
  * Either the product requires license or not.
415
  *
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-rollback.php ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The rollback class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Rollback
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+ // Exit if accessed directly.
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+ if ( ! class_exists( 'ThemeIsle_SDK_Rollback' ) ) :
16
+ /**
17
+ * Rollback for ThemeIsle SDK.
18
+ */
19
+ class ThemeIsle_SDK_Rollback {
20
+
21
+ /**
22
+ * @var ThemeIsle_SDK_Product $product Themeisle Product.
23
+ */
24
+ protected $product;
25
+
26
+
27
+ /**
28
+ * ThemeIsle_SDK_Rollback constructor.
29
+ *
30
+ * @param ThemeIsle_SDK_Product $product_object Product Object.
31
+ */
32
+ public function __construct( $product_object ) {
33
+ if ( $product_object instanceof ThemeIsle_SDK_Product ) {
34
+ $this->product = $product_object;
35
+ }
36
+ if ( $this->product->can_rollback() ) {
37
+ $this->show_link();
38
+ $this->add_hooks();
39
+
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Add js scripts for themes rollback.
45
+ */
46
+ public function add_footer() {
47
+ $screen = get_current_screen();
48
+ if ( ! isset( $screen->parent_file ) ) {
49
+ return;
50
+ }
51
+ if ( $screen->parent_file !== 'themes.php' ) {
52
+ return;
53
+ }
54
+ if ( $this->product->get_type() === 'plugin' ) {
55
+ return;
56
+ }
57
+
58
+ $version = $this->product->get_rollback();
59
+ ?>
60
+ <script type="text/javascript">
61
+ jQuery(document).ready(function ($) {
62
+ setInterval(checkTheme, 500);
63
+
64
+ function checkTheme() {
65
+ var theme = '<?php echo esc_attr( $this->product->get_slug() ); ?>-action';
66
+
67
+ if (jQuery('#' + theme).length > 0) {
68
+ if (jQuery('.theme-overlay.active').is(':visible')) {
69
+ if (jQuery('#' + theme + '-rollback').length === 0) {
70
+ jQuery('.theme-actions .active-theme').prepend('<a class="button" style="float:left" id="' + theme + '-rollback" href="<?php echo esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=' . $this->product->get_key() . '_rollback' ), $this->product->get_key() . '_rollback' ) ); ?>">Rollback to v<?php echo esc_attr( $version['version'] ); ?></a>')
71
+ }
72
+ }
73
+
74
+ }
75
+ }
76
+ })
77
+
78
+ </script>
79
+ <?php
80
+
81
+ }
82
+
83
+ /**
84
+ * Set the rollback hook. Strangely, this does not work if placed in the ThemeIsle_SDK_Rollback class, so it is being called from there instead.
85
+ */
86
+ public function add_hooks() {
87
+ add_action( 'admin_post_' . $this->product->get_key() . '_rollback', array( $this, 'start_rollback' ) );
88
+ add_action( 'admin_footer', array( $this, 'add_footer' ) );
89
+ }
90
+
91
+ /**
92
+ * If product can be rolled back, show the link to rollback.
93
+ */
94
+ private function show_link() {
95
+ add_filter(
96
+ 'plugin_action_links_' . plugin_basename( $this->product->get_basefile() ), array(
97
+ $this,
98
+ 'add_rollback_link',
99
+ )
100
+ );
101
+ }
102
+
103
+ /**
104
+ * Show the rollback links in the plugin page.
105
+ *
106
+ * @return array The links.
107
+ */
108
+ public function add_rollback_link( $links ) {
109
+ $version = $this->product->get_rollback();
110
+ $links[] = '<a href="' . wp_nonce_url( admin_url( 'admin-post.php?action=' . $this->product->get_key() . '_rollback' ), $this->product->get_key() . '_rollback' ) . '">' . sprintf( apply_filters( $this->product->get_key() . '_rollback_label', 'Rollback to v%s' ), $version['version'] ) . '</a>';
111
+
112
+ return $links;
113
+ }
114
+
115
+ /**
116
+ * Start the rollback operation.
117
+ */
118
+ public function start_rollback() {
119
+ if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], $this->product->get_key() . '_rollback' ) ) {
120
+ wp_nonce_ays( '' );
121
+ }
122
+
123
+ if ( $this->product->get_type() === 'plugin' ) {
124
+ $this->start_rollback_plugin();
125
+ } elseif ( $this->product->get_type() === 'theme' ) {
126
+ $this->start_rollback_theme();
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Alter links and remove duplicate customize message.
132
+ *
133
+ * @param array $links Array of old links.
134
+ *
135
+ * @return mixed Array of links.
136
+ */
137
+ public function alter_links_theme_upgrade( $links ) {
138
+ if ( isset( $links['preview'] ) ) {
139
+ $links['preview'] = str_replace( '<span aria-hidden="true">Customize</span>', '', $links['preview'] );
140
+ }
141
+
142
+ return $links;
143
+ }
144
+
145
+ /**
146
+ * Start the rollback operation for the theme.
147
+ */
148
+ private function start_rollback_theme() {
149
+ add_filter( 'update_theme_complete_actions', array( $this, 'alter_links_theme_upgrade' ) );
150
+ $rollback = $this->product->get_rollback();
151
+ $transient = get_site_transient( 'update_themes' );
152
+ $folder = $this->product->get_slug();
153
+ $version = $rollback['version'];
154
+ $temp_array = array(
155
+ 'new_version' => $version,
156
+ 'package' => $rollback['url'],
157
+ );
158
+
159
+ $transient->response[ $folder . '/style.css' ] = $temp_array;
160
+ set_site_transient( 'update_themes', $transient );
161
+
162
+ $transient = get_transient( $this->product->get_key() . '_warning_rollback' );
163
+
164
+ if ( false === $transient ) {
165
+ set_transient( $this->product->get_key() . '_warning_rollback', 'in progress', 30 );
166
+ require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
167
+ $title = sprintf( apply_filters( $this->product->get_key() . '_rollback_message', 'Rolling back %s to v%s' ), $this->product->get_name(), $version );
168
+ $theme = $folder . '/style.css';
169
+ $nonce = 'upgrade-theme_' . $theme;
170
+ $url = 'update.php?action=upgrade-theme&theme=' . urlencode( $theme );
171
+
172
+ $upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'theme' ) ) );
173
+ $upgrader->upgrade( $theme );
174
+ delete_transient( $this->product->get_key() . '_warning_rollback' );
175
+ wp_die(
176
+ '', $title, array(
177
+ 'response' => 200,
178
+ )
179
+ );
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Start the rollback operation for the plugin.
185
+ */
186
+ private function start_rollback_plugin() {
187
+ $rollback = $this->product->get_rollback();
188
+ $plugin_transient = get_site_transient( 'update_plugins' );
189
+ $plugin_folder = $this->product->get_slug();
190
+ $plugin_file = $this->product->get_file();
191
+ $version = $rollback['version'];
192
+ $temp_array = array(
193
+ 'slug' => $plugin_folder,
194
+ 'new_version' => $version,
195
+ 'package' => $rollback['url'],
196
+ );
197
+
198
+ $temp_object = (object) $temp_array;
199
+ $plugin_transient->response[ $plugin_folder . '/' . $plugin_file ] = $temp_object;
200
+ set_site_transient( 'update_plugins', $plugin_transient );
201
+
202
+ $transient = get_transient( $this->product->get_key() . '_warning_rollback' );
203
+
204
+ if ( false === $transient ) {
205
+ set_transient( $this->product->get_key() . '_warning_rollback', 'in progress', 30 );
206
+ require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
207
+ $title = sprintf( apply_filters( $this->product->get_key() . '_rollback_message', 'Rolling back %s to v%s' ), $this->product->get_name(), $version );
208
+ $plugin = $plugin_folder . '/' . $plugin_file;
209
+ $nonce = 'upgrade-plugin_' . $plugin;
210
+ $url = 'update.php?action=upgrade-plugin&plugin=' . urlencode( $plugin );
211
+ $upgrader_skin = new Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'plugin' ) );
212
+ $upgrader = new Plugin_Upgrader( $upgrader_skin );
213
+ $upgrader->upgrade( $plugin );
214
+ delete_transient( $this->product->get_key() . '_warning_rollback' );
215
+ wp_die(
216
+ '', $title, array(
217
+ 'response' => 200,
218
+ )
219
+ );
220
+ }
221
+ }
222
+ }
223
+ endif;
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget-dashboard-blog.php CHANGED
@@ -170,6 +170,12 @@ if ( ! class_exists( 'ThemeIsle_SDK_Widget_Dashboard_Blog' ) ) :
170
  color: #72777c;
171
  }
172
 
 
 
 
 
 
 
173
  </style>
174
  <ul>
175
  <?php
@@ -231,6 +237,9 @@ if ( ! class_exists( 'ThemeIsle_SDK_Widget_Dashboard_Blog' ) ) :
231
  (<a class="thickbox open-plugin-details-modal"
232
  href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
233
  </li>
 
 
 
234
 
235
  <?php
236
  }
170
  color: #72777c;
171
  }
172
 
173
+ .ti-dw-powered-by {
174
+ font-style: italic;
175
+ text-align: right;
176
+ margin-top:3px;
177
+ }
178
+
179
  </style>
180
  <ul>
181
  <?php
237
  (<a class="thickbox open-plugin-details-modal"
238
  href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
239
  </li>
240
+ <li class="ti-dw-powered-by">
241
+ Powered by <?php echo esc_attr( $this->product->get_friendly_name() ); ?>
242
+ </li>
243
 
244
  <?php
245
  }
vendor/codeinwp/themeisle-sdk/load.php CHANGED
@@ -11,7 +11,7 @@
11
  */
12
 
13
  // Current SDK version and path.
14
- $themeisle_sdk_version = '1.5.5';
15
  $themeisle_sdk_path = dirname( __FILE__ );
16
 
17
  global $themeisle_sdk_max_version;
11
  */
12
 
13
  // Current SDK version and path.
14
+ $themeisle_sdk_version = '1.9.1';
15
  $themeisle_sdk_path = dirname( __FILE__ );
16
 
17
  global $themeisle_sdk_max_version;
vendor/codeinwp/themeisle-sdk/start.php CHANGED
@@ -14,10 +14,12 @@ $files_to_load = array(
14
  'class-themeisle-sdk-product.php',
15
  'class-themeisle-sdk-logger.php',
16
  'class-themeisle-sdk-licenser.php',
 
17
  'class-themeisle-sdk-feedback-factory.php',
18
  'class-themeisle-sdk-feedback.php',
19
  'class-themeisle-sdk-feedback-deactivate.php',
20
  'class-themeisle-sdk-feedback-review.php',
 
21
  'class-themeisle-sdk-notification-manager.php',
22
  'class-themeisle-sdk-widget.php',
23
  'class-themeisle-sdk-widget-dashboard-blog.php',
14
  'class-themeisle-sdk-product.php',
15
  'class-themeisle-sdk-logger.php',
16
  'class-themeisle-sdk-licenser.php',
17
+ 'class-themeisle-sdk-rollback.php',
18
  'class-themeisle-sdk-feedback-factory.php',
19
  'class-themeisle-sdk-feedback.php',
20
  'class-themeisle-sdk-feedback-deactivate.php',
21
  'class-themeisle-sdk-feedback-review.php',
22
+ 'class-themeisle-sdk-feedback-translate.php',
23
  'class-themeisle-sdk-notification-manager.php',
24
  'class-themeisle-sdk-widget.php',
25
  'class-themeisle-sdk-widget-dashboard-blog.php',
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit858f4bd6988fbef9ce8c9bdd9f52c407
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit858f4bd6988fbef9ce8c9bdd9f52c407
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit858f4bd6988fbef9ce8c9bdd9f52c407', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit858f4bd6988fbef9ce8c9bdd9f52c407', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
@@ -42,14 +42,14 @@ class ComposerAutoloaderInit858f4bd6988fbef9ce8c9bdd9f52c407
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
- composerRequire858f4bd6988fbef9ce8c9bdd9f52c407($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
- function composerRequire858f4bd6988fbef9ce8c9bdd9f52c407($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit5f39049e2ab8c432062d5d8bff102dc0
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit5f39049e2ab8c432062d5d8bff102dc0', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit5f39049e2ab8c432062d5d8bff102dc0', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
+ composerRequire5f39049e2ab8c432062d5d8bff102dc0($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
+ function composerRequire5f39049e2ab8c432062d5d8bff102dc0($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
vendor/composer/autoload_real_52.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
- class ComposerAutoloaderInit66f0edee7658d67c88aa60a93e45fd69 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit66f0edee7658d67c88aa60a93e45fd69 {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit66f0edee7658d67c88aa60a93e45fd69', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit66f0edee7658d67c88aa60a93e45fd69', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
+ class ComposerAutoloaderInita65d57f992be8f52f9013180ac7c1d01 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInita65d57f992be8f52f9013180ac7c1d01', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInita65d57f992be8f52f9013180ac7c1d01', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
vendor/composer/installed.json CHANGED
@@ -1,37 +1,4 @@
1
  [
2
- {
3
- "name": "xrstf/composer-php52",
4
- "version": "v1.0.20",
5
- "version_normalized": "1.0.20.0",
6
- "source": {
7
- "type": "git",
8
- "url": "https://github.com/composer-php52/composer-php52.git",
9
- "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8"
10
- },
11
- "dist": {
12
- "type": "zip",
13
- "url": "https://api.github.com/repos/composer-php52/composer-php52/zipball/bd41459d5e27df8d33057842b32377c39e97a5a8",
14
- "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8",
15
- "shasum": ""
16
- },
17
- "time": "2016-04-16 21:52:24",
18
- "type": "library",
19
- "extra": {
20
- "branch-alias": {
21
- "dev-default": "1.x-dev"
22
- }
23
- },
24
- "installation-source": "dist",
25
- "autoload": {
26
- "psr-0": {
27
- "xrstf\\Composer52": "lib/"
28
- }
29
- },
30
- "notification-url": "https://packagist.org/downloads/",
31
- "license": [
32
- "MIT"
33
- ]
34
- },
35
  {
36
  "name": "codeinwp/themeisle-sdk",
37
  "version": "dev-master",
@@ -39,15 +6,15 @@
39
  "source": {
40
  "type": "git",
41
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
42
- "reference": "f05bd8f0fe4d628424484e2bdd6d20ee65f454ee"
43
  },
44
  "dist": {
45
  "type": "zip",
46
- "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/f05bd8f0fe4d628424484e2bdd6d20ee65f454ee",
47
- "reference": "f05bd8f0fe4d628424484e2bdd6d20ee65f454ee",
48
  "shasum": ""
49
  },
50
- "time": "2017-08-08 22:09:54",
51
  "type": "library",
52
  "installation-source": "dist",
53
  "autoload": {
@@ -55,6 +22,7 @@
55
  "load.php"
56
  ]
57
  },
 
58
  "license": [
59
  "GPL-2.0+"
60
  ],
@@ -69,10 +37,39 @@
69
  "homepage": "https://github.com/Codeinwp/themeisle-sdk",
70
  "keywords": [
71
  "wordpress"
72
- ],
73
- "support": {
74
- "issues": "https://github.com/Codeinwp/themeisle-sdk/issues",
75
- "source": "https://github.com/Codeinwp/themeisle-sdk/tree/master"
76
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  }
78
  ]
1
  [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  {
3
  "name": "codeinwp/themeisle-sdk",
4
  "version": "dev-master",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
+ "reference": "1a64ea86e864d07a99c0f6fe89d3a1370df47c35"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/1a64ea86e864d07a99c0f6fe89d3a1370df47c35",
14
+ "reference": "1a64ea86e864d07a99c0f6fe89d3a1370df47c35",
15
  "shasum": ""
16
  },
17
+ "time": "2017-09-27 13:25:43",
18
  "type": "library",
19
  "installation-source": "dist",
20
  "autoload": {
22
  "load.php"
23
  ]
24
  },
25
+ "notification-url": "https://packagist.org/downloads/",
26
  "license": [
27
  "GPL-2.0+"
28
  ],
37
  "homepage": "https://github.com/Codeinwp/themeisle-sdk",
38
  "keywords": [
39
  "wordpress"
40
+ ]
41
+ },
42
+ {
43
+ "name": "xrstf/composer-php52",
44
+ "version": "v1.0.20",
45
+ "version_normalized": "1.0.20.0",
46
+ "source": {
47
+ "type": "git",
48
+ "url": "https://github.com/composer-php52/composer-php52.git",
49
+ "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8"
50
+ },
51
+ "dist": {
52
+ "type": "zip",
53
+ "url": "https://api.github.com/repos/composer-php52/composer-php52/zipball/bd41459d5e27df8d33057842b32377c39e97a5a8",
54
+ "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8",
55
+ "shasum": ""
56
+ },
57
+ "time": "2016-04-16 21:52:24",
58
+ "type": "library",
59
+ "extra": {
60
+ "branch-alias": {
61
+ "dev-default": "1.x-dev"
62
+ }
63
+ },
64
+ "installation-source": "dist",
65
+ "autoload": {
66
+ "psr-0": {
67
+ "xrstf\\Composer52": "lib/"
68
+ }
69
+ },
70
+ "notification-url": "https://packagist.org/downloads/",
71
+ "license": [
72
+ "MIT"
73
+ ]
74
  }
75
  ]