Version Description
(2014.04.11) = -Bug fixes - SVN bug fix that did not add the MailChimp List sync power-up
Download this release
Release Info
Developer | AndyGCook |
Plugin | HubSpot – Free Marketing Plugin for WordPress |
Version | 0.7.1 |
Comparing to | |
See all releases |
Code changes from version 0.6.2 to 0.7.1
- admin/css/leadin-admin.css +63 -29
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_appearance.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_background-clip.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_background-origin.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_background-size.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_border-radius.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_box-shadow.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_box-sizing.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_box.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_columns.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_filter.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_font-face.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_hyphenation.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_images.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_inline-block.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_opacity.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_regions.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_shared.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_text-shadow.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_transform.scssc +0 -0
- admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_transition.scssc +0 -0
- admin/sass/.sass-cache/aa1b4daeb1aa66522abf94710543639284144823/_clearfix.scssc +0 -0
- admin/sass/.sass-cache/aa1b4daeb1aa66522abf94710543639284144823/_hacks.scssc +0 -0
- admin/sass/.sass-cache/ba1a1c8b7407a74496e0f1bb0af5e060acd9c6b4/_css3.scssc +0 -0
- admin/sass/.sass-cache/ba1a1c8b7407a74496e0f1bb0af5e060acd9c6b4/_support.scssc +0 -0
- admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_contact_detail_page.sassc +0 -0
- admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_contacts_list_page.sassc +0 -0
- admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_settings_page.sassc +0 -0
- admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_tables.sassc +0 -0
- admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_variables.sassc +0 -0
- admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/leadin-admin.sassc +0 -0
- admin/sass/_grid.sass +5 -2
- admin/sass/_settings_page.sass +11 -0
- images/power-up-icon-mailchimp-list-sync.png +0 -0
- images/power-up-icon-mailchimp-list-sync@2x.png +0 -0
- images/power-up-icon-mailchimp-list-sync_small.png +0 -0
- images/power-up-icon-mailchimp-list-sync_small@2x.png +0 -0
- inc/class-emailer.php +3 -4
- inc/leadin-ajax-functions.php +12 -0
- leadin.php +6 -4
- power-ups/contacts.php +2 -1
- power-ups/mailchimp-list-sync.php +122 -0
- power-ups/mailchimp-list-sync/admin/mailchimp-list-sync-admin.php +130 -0
- power-ups/mailchimp-list-sync/inc/MailChimp-API.php +86 -0
- power-ups/subscribe-widget.php +10 -48
- power-ups/subscribe-widget/admin/subscribe-widget-admin.php +31 -42
- power-ups/subscribe-widget/frontend/css/vex.css +1547 -293
- power-ups/subscribe-widget/frontend/js/leadin-subscribe.js +19 -6
- power-ups/subscribe-widget/frontend/sass/_keyframes.sass +141 -0
- power-ups/subscribe-widget/frontend/sass/_mixins.sass +31 -0
- power-ups/subscribe-widget/frontend/sass/_vex-theme-bottom-right-corner.sass +118 -0
- power-ups/subscribe-widget/frontend/sass/_vex-theme-default.sass +131 -0
- power-ups/subscribe-widget/frontend/sass/_vex-theme-top.sass +144 -0
- power-ups/subscribe-widget/frontend/sass/config.rb +30 -0
- power-ups/subscribe-widget/frontend/sass/vex.sass +133 -0
- readme.txt +19 -8
- trunk/admin/css/leadin-admin.css +546 -0
- trunk/admin/inc/class-leadin-contact.php +200 -0
- trunk/admin/inc/class-leadin-list-table.php +455 -0
- trunk/admin/inc/class-leadin-pointers.php +117 -0
- trunk/admin/js/leadin-admin.js +3 -0
- trunk/admin/leadin-admin.php +503 -0
- trunk/admin/sass/_contact_detail_page.sass +116 -0
- trunk/admin/sass/_contacts_list_page.sass +13 -0
- trunk/admin/sass/_grid.sass +25 -0
- trunk/admin/sass/_powerups_page.sass +27 -0
- trunk/admin/sass/_settings_page.sass +106 -0
- trunk/admin/sass/_tables.sass +81 -0
- trunk/admin/sass/_variables.sass +60 -0
- trunk/admin/sass/config.rb +30 -0
- trunk/admin/sass/leadin-admin.sass +55 -0
- trunk/frontend/js/jquery.cookie.js +113 -0
- trunk/frontend/js/leadin.js +435 -0
- trunk/images/checkmark.png +0 -0
- trunk/images/leadin-icon-32x32.png +0 -0
- trunk/images/leadin-svg-icon.svg +11 -0
- trunk/images/power-up-icon-mailchimp-list-sync.png +0 -0
- trunk/images/power-up-icon-mailchimp-list-sync@2x.png +0 -0
- trunk/images/power-up-icon-mailchimp-list-sync_small.png +0 -0
- trunk/images/power-up-icon-mailchimp-list-sync_small@2x.png +0 -0
- trunk/images/powerup-icon-analytics.png +0 -0
- trunk/images/powerup-icon-analytics@2x.png +0 -0
- trunk/images/powerup-icon-ideas.png +0 -0
- trunk/images/powerup-icon-ideas@2x.png +0 -0
- trunk/images/powerup-icon-leads.png +0 -0
- trunk/images/powerup-icon-leads@2x.png +0 -0
- trunk/images/powerup-icon-subscribe.png +0 -0
- trunk/images/powerup-icon-subscribe@2x.png +0 -0
- trunk/images/powerups.png +0 -0
- trunk/images/triangle.png +0 -0
- trunk/inc/class-emailer.php +435 -0
- trunk/inc/class-leadin-options.php +149 -0
- trunk/inc/leadin-ajax-functions.php +324 -0
- trunk/inc/leadin-functions.php +250 -0
- trunk/leadin.php +488 -0
- trunk/lib/mixpanel/Base/MixpanelBase.php +65 -0
- trunk/lib/mixpanel/ConsumerStrategies/AbstractConsumer.php +57 -0
- trunk/lib/mixpanel/ConsumerStrategies/CurlConsumer.php +221 -0
- trunk/lib/mixpanel/ConsumerStrategies/FileConsumer.php +38 -0
- trunk/lib/mixpanel/ConsumerStrategies/SocketConsumer.php +308 -0
- trunk/lib/mixpanel/Mixpanel.php +302 -0
- trunk/lib/mixpanel/Producers/MixpanelBaseProducer.php +229 -0
- trunk/lib/mixpanel/Producers/MixpanelEvents.php +164 -0
- trunk/lib/mixpanel/Producers/MixpanelPeople.php +138 -0
- trunk/power-ups/contacts.php +96 -0
- trunk/power-ups/contacts/admin/contacts-admin.php +385 -0
- trunk/power-ups/contacts/admin/css/leadin-contacts-admin.css +12 -0
- trunk/power-ups/contacts/admin/js/leadin-contacts-admin.js +72 -0
- trunk/power-ups/contacts/images/powerup-icon-contacts@2x.png +0 -0
- trunk/power-ups/mailchimp-list-sync.php +122 -0
- trunk/power-ups/mailchimp-list-sync/admin/mailchimp-list-sync-admin.php +130 -0
- trunk/power-ups/mailchimp-list-sync/inc/MailChimp-API.php +86 -0
- trunk/power-ups/subscribe-widget.php +145 -0
- trunk/power-ups/subscribe-widget/admin/subscribe-widget-admin.php +116 -0
- trunk/power-ups/subscribe-widget/frontend/css/leadin-subscribe.css +47 -0
- trunk/power-ups/subscribe-widget/frontend/css/vex.css +2230 -0
- trunk/power-ups/subscribe-widget/frontend/js/leadin-subscribe.js +130 -0
- trunk/power-ups/subscribe-widget/frontend/js/vex.dialog.js +149 -0
- trunk/power-ups/subscribe-widget/frontend/js/vex.js +189 -0
- trunk/power-ups/subscribe-widget/frontend/sass/_keyframes.sass +141 -0
- trunk/power-ups/subscribe-widget/frontend/sass/_mixins.sass +31 -0
- trunk/power-ups/subscribe-widget/frontend/sass/_vex-theme-bottom-right-corner.sass +118 -0
- trunk/power-ups/subscribe-widget/frontend/sass/_vex-theme-default.sass +131 -0
- trunk/power-ups/subscribe-widget/frontend/sass/_vex-theme-top.sass +144 -0
- trunk/power-ups/subscribe-widget/frontend/sass/config.rb +30 -0
- trunk/power-ups/subscribe-widget/frontend/sass/vex.sass +133 -0
- trunk/readme.txt +253 -0
- trunk/screenshot-1.png +0 -0
- trunk/screenshot-2.png +0 -0
- trunk/screenshot-3.png +0 -0
admin/css/leadin-admin.css
CHANGED
@@ -2,15 +2,18 @@
|
|
2 |
#leadin {
|
3 |
*zoom: 1;
|
4 |
max-width: 1180px;
|
|
|
5 |
_width: 1180px;
|
6 |
padding-left: 20px;
|
|
|
7 |
padding-right: 20px;
|
|
|
8 |
margin-left: auto;
|
9 |
margin-right: auto;
|
10 |
-
margin
|
11 |
padding: 0;
|
12 |
}
|
13 |
-
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.
|
14 |
#leadin:after {
|
15 |
content: "";
|
16 |
display: table;
|
@@ -19,13 +22,33 @@
|
|
19 |
@media (min-width: 782px) {
|
20 |
/* line 12, ../sass/_grid.sass */
|
21 |
#leadin {
|
|
|
22 |
max-width: 1180px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
}
|
24 |
}
|
25 |
/* line 17, ../sass/_grid.sass */
|
26 |
#leadin * {
|
27 |
box-sizing: border-box;
|
28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
/* line 6, ../sass/_tables.sass */
|
31 |
#leadin .top_table_controls {
|
@@ -34,7 +57,7 @@
|
|
34 |
margin-bottom: 16px;
|
35 |
*zoom: 1;
|
36 |
}
|
37 |
-
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.
|
38 |
#leadin .top_table_controls:after {
|
39 |
content: "";
|
40 |
display: table;
|
@@ -147,7 +170,7 @@
|
|
147 |
#leadin .metabox-holder {
|
148 |
*zoom: 1;
|
149 |
}
|
150 |
-
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.
|
151 |
#leadin .metabox-holder:after {
|
152 |
content: "";
|
153 |
display: table;
|
@@ -161,7 +184,7 @@
|
|
161 |
color: #999999;
|
162 |
border-top: 1px solid #dedede;
|
163 |
}
|
164 |
-
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.
|
165 |
#leadin #leadin-footer:after {
|
166 |
content: "";
|
167 |
display: table;
|
@@ -218,27 +241,42 @@
|
|
218 |
}
|
219 |
|
220 |
/* line 19, ../sass/_settings_page.sass */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
.steps {
|
222 |
margin: 48px auto 0;
|
223 |
text-align: center;
|
224 |
max-width: 600px;
|
225 |
}
|
226 |
-
/* line
|
227 |
.steps h3, .steps p {
|
228 |
margin: 0;
|
229 |
}
|
230 |
-
/* line
|
231 |
.steps .step-names {
|
232 |
margin: 0;
|
233 |
*zoom: 1;
|
234 |
}
|
235 |
-
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.
|
236 |
.steps .step-names:after {
|
237 |
content: "";
|
238 |
display: table;
|
239 |
clear: both;
|
240 |
}
|
241 |
-
/* line
|
242 |
.steps .step-names .step-name {
|
243 |
color: #cccccc;
|
244 |
display: list-item;
|
@@ -249,69 +287,67 @@
|
|
249 |
font-size: 16px;
|
250 |
list-style: decimal inside none;
|
251 |
}
|
252 |
-
/* line
|
253 |
.steps .step-names .step-name.active {
|
254 |
color: #1f7d71;
|
255 |
background-image: url(../../images/triangle.png);
|
256 |
background-position: bottom center;
|
257 |
background-repeat: no-repeat;
|
258 |
}
|
259 |
-
/* line
|
260 |
.steps .step-names .step-name.completed {
|
261 |
list-style-image: url(../../images/checkmark.png);
|
262 |
}
|
263 |
-
/* line
|
264 |
.steps .step-content {
|
265 |
margin: 0;
|
266 |
}
|
267 |
-
/* line
|
268 |
.steps .step-content .description {
|
269 |
margin: 10px 0 20px;
|
270 |
display: block;
|
271 |
}
|
272 |
-
/* line
|
273 |
.steps .step {
|
274 |
display: none;
|
275 |
padding: 18px;
|
276 |
background-color: #d3eeeb;
|
277 |
border: 2px solid #22aa99;
|
278 |
-
-webkit-border-radius: 5px;
|
279 |
-moz-border-radius: 5px;
|
280 |
-
-
|
281 |
-
-o-border-radius: 5px;
|
282 |
border-radius: 5px;
|
283 |
color: #1f7d71;
|
284 |
}
|
285 |
-
/* line
|
286 |
.steps .step h2 {
|
287 |
color: #1f7d71;
|
288 |
margin-top: 0;
|
289 |
margin-bottom: 18px;
|
290 |
}
|
291 |
-
/* line
|
292 |
.steps .step ol {
|
293 |
text-align: left;
|
294 |
margin-bottom: 18px;
|
295 |
}
|
296 |
-
/* line
|
297 |
.steps .step label {
|
298 |
text-align: right;
|
299 |
}
|
300 |
-
/* line
|
301 |
.steps .step.active {
|
302 |
display: block;
|
303 |
}
|
304 |
-
/* line
|
305 |
.steps .step .form-table th {
|
306 |
display: none;
|
307 |
}
|
308 |
-
/* line
|
309 |
.steps .step .form-table td {
|
310 |
text-align: center;
|
311 |
width: auto;
|
312 |
display: block;
|
313 |
}
|
314 |
-
/* line
|
315 |
.steps .step .form-table input {
|
316 |
width: 100%;
|
317 |
font-size: 16px;
|
@@ -338,7 +374,7 @@
|
|
338 |
*zoom: 1;
|
339 |
padding: 9px 15px 4px 0;
|
340 |
}
|
341 |
-
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.
|
342 |
#leadin .header-wrap:after {
|
343 |
content: "";
|
344 |
display: table;
|
@@ -393,8 +429,8 @@
|
|
393 |
#leadin .contact-history .events {
|
394 |
background-color: white;
|
395 |
border: 1px solid #dedede;
|
396 |
-
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
397 |
-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
|
|
398 |
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
399 |
}
|
400 |
/* line 53, ../sass/_contact_detail_page.sass */
|
@@ -488,10 +524,8 @@
|
|
488 |
background-color: #f9f9f9;
|
489 |
border-color: #cccccc;
|
490 |
text-align: center;
|
491 |
-
-webkit-border-radius: 10px;
|
492 |
-moz-border-radius: 10px;
|
493 |
-
-
|
494 |
-
-o-border-radius: 10px;
|
495 |
border-radius: 10px;
|
496 |
}
|
497 |
/* line 16, ../sass/_powerups_page.sass */
|
2 |
#leadin {
|
3 |
*zoom: 1;
|
4 |
max-width: 1180px;
|
5 |
+
max-width: 73.75rem;
|
6 |
_width: 1180px;
|
7 |
padding-left: 20px;
|
8 |
+
padding-left: 1.25rem;
|
9 |
padding-right: 20px;
|
10 |
+
padding-right: 1.25rem;
|
11 |
margin-left: auto;
|
12 |
margin-right: auto;
|
13 |
+
margin: 0;
|
14 |
padding: 0;
|
15 |
}
|
16 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
17 |
#leadin:after {
|
18 |
content: "";
|
19 |
display: table;
|
22 |
@media (min-width: 782px) {
|
23 |
/* line 12, ../sass/_grid.sass */
|
24 |
#leadin {
|
25 |
+
*zoom: 1;
|
26 |
max-width: 1180px;
|
27 |
+
max-width: 73.75rem;
|
28 |
+
padding-left: 20px;
|
29 |
+
padding-left: 1.25rem;
|
30 |
+
padding-right: 20px;
|
31 |
+
padding-right: 1.25rem;
|
32 |
+
margin-left: auto;
|
33 |
+
margin-right: auto;
|
34 |
+
}
|
35 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
36 |
+
#leadin:after {
|
37 |
+
content: "";
|
38 |
+
display: table;
|
39 |
+
clear: both;
|
40 |
}
|
41 |
}
|
42 |
/* line 17, ../sass/_grid.sass */
|
43 |
#leadin * {
|
44 |
box-sizing: border-box;
|
45 |
}
|
46 |
+
@media (min-width: 782px) {
|
47 |
+
/* line 12, ../sass/_grid.sass */
|
48 |
+
#leadin {
|
49 |
+
margin: 0;
|
50 |
+
}
|
51 |
+
}
|
52 |
|
53 |
/* line 6, ../sass/_tables.sass */
|
54 |
#leadin .top_table_controls {
|
57 |
margin-bottom: 16px;
|
58 |
*zoom: 1;
|
59 |
}
|
60 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
61 |
#leadin .top_table_controls:after {
|
62 |
content: "";
|
63 |
display: table;
|
170 |
#leadin .metabox-holder {
|
171 |
*zoom: 1;
|
172 |
}
|
173 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
174 |
#leadin .metabox-holder:after {
|
175 |
content: "";
|
176 |
display: table;
|
184 |
color: #999999;
|
185 |
border-top: 1px solid #dedede;
|
186 |
}
|
187 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
188 |
#leadin #leadin-footer:after {
|
189 |
content: "";
|
190 |
display: table;
|
241 |
}
|
242 |
|
243 |
/* line 19, ../sass/_settings_page.sass */
|
244 |
+
.power-up-settings-icon {
|
245 |
+
padding-right: 10px;
|
246 |
+
float: left;
|
247 |
+
max-height: 20px;
|
248 |
+
margin-top: -1px;
|
249 |
+
}
|
250 |
+
|
251 |
+
/* line 25, ../sass/_settings_page.sass */
|
252 |
+
.dashicons {
|
253 |
+
margin-right: 10px;
|
254 |
+
float: left;
|
255 |
+
margin-top: -1px;
|
256 |
+
}
|
257 |
+
|
258 |
+
/* line 30, ../sass/_settings_page.sass */
|
259 |
.steps {
|
260 |
margin: 48px auto 0;
|
261 |
text-align: center;
|
262 |
max-width: 600px;
|
263 |
}
|
264 |
+
/* line 35, ../sass/_settings_page.sass */
|
265 |
.steps h3, .steps p {
|
266 |
margin: 0;
|
267 |
}
|
268 |
+
/* line 38, ../sass/_settings_page.sass */
|
269 |
.steps .step-names {
|
270 |
margin: 0;
|
271 |
*zoom: 1;
|
272 |
}
|
273 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
274 |
.steps .step-names:after {
|
275 |
content: "";
|
276 |
display: table;
|
277 |
clear: both;
|
278 |
}
|
279 |
+
/* line 42, ../sass/_settings_page.sass */
|
280 |
.steps .step-names .step-name {
|
281 |
color: #cccccc;
|
282 |
display: list-item;
|
287 |
font-size: 16px;
|
288 |
list-style: decimal inside none;
|
289 |
}
|
290 |
+
/* line 52, ../sass/_settings_page.sass */
|
291 |
.steps .step-names .step-name.active {
|
292 |
color: #1f7d71;
|
293 |
background-image: url(../../images/triangle.png);
|
294 |
background-position: bottom center;
|
295 |
background-repeat: no-repeat;
|
296 |
}
|
297 |
+
/* line 58, ../sass/_settings_page.sass */
|
298 |
.steps .step-names .step-name.completed {
|
299 |
list-style-image: url(../../images/checkmark.png);
|
300 |
}
|
301 |
+
/* line 61, ../sass/_settings_page.sass */
|
302 |
.steps .step-content {
|
303 |
margin: 0;
|
304 |
}
|
305 |
+
/* line 64, ../sass/_settings_page.sass */
|
306 |
.steps .step-content .description {
|
307 |
margin: 10px 0 20px;
|
308 |
display: block;
|
309 |
}
|
310 |
+
/* line 68, ../sass/_settings_page.sass */
|
311 |
.steps .step {
|
312 |
display: none;
|
313 |
padding: 18px;
|
314 |
background-color: #d3eeeb;
|
315 |
border: 2px solid #22aa99;
|
|
|
316 |
-moz-border-radius: 5px;
|
317 |
+
-webkit-border-radius: 5px;
|
|
|
318 |
border-radius: 5px;
|
319 |
color: #1f7d71;
|
320 |
}
|
321 |
+
/* line 76, ../sass/_settings_page.sass */
|
322 |
.steps .step h2 {
|
323 |
color: #1f7d71;
|
324 |
margin-top: 0;
|
325 |
margin-bottom: 18px;
|
326 |
}
|
327 |
+
/* line 82, ../sass/_settings_page.sass */
|
328 |
.steps .step ol {
|
329 |
text-align: left;
|
330 |
margin-bottom: 18px;
|
331 |
}
|
332 |
+
/* line 86, ../sass/_settings_page.sass */
|
333 |
.steps .step label {
|
334 |
text-align: right;
|
335 |
}
|
336 |
+
/* line 89, ../sass/_settings_page.sass */
|
337 |
.steps .step.active {
|
338 |
display: block;
|
339 |
}
|
340 |
+
/* line 93, ../sass/_settings_page.sass */
|
341 |
.steps .step .form-table th {
|
342 |
display: none;
|
343 |
}
|
344 |
+
/* line 96, ../sass/_settings_page.sass */
|
345 |
.steps .step .form-table td {
|
346 |
text-align: center;
|
347 |
width: auto;
|
348 |
display: block;
|
349 |
}
|
350 |
+
/* line 101, ../sass/_settings_page.sass */
|
351 |
.steps .step .form-table input {
|
352 |
width: 100%;
|
353 |
font-size: 16px;
|
374 |
*zoom: 1;
|
375 |
padding: 9px 15px 4px 0;
|
376 |
}
|
377 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
378 |
#leadin .header-wrap:after {
|
379 |
content: "";
|
380 |
display: table;
|
429 |
#leadin .contact-history .events {
|
430 |
background-color: white;
|
431 |
border: 1px solid #dedede;
|
|
|
432 |
-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
433 |
+
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
434 |
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
435 |
}
|
436 |
/* line 53, ../sass/_contact_detail_page.sass */
|
524 |
background-color: #f9f9f9;
|
525 |
border-color: #cccccc;
|
526 |
text-align: center;
|
|
|
527 |
-moz-border-radius: 10px;
|
528 |
+
-webkit-border-radius: 10px;
|
|
|
529 |
border-radius: 10px;
|
530 |
}
|
531 |
/* line 16, ../sass/_powerups_page.sass */
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_appearance.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_background-clip.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_background-origin.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_background-size.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_border-radius.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_box-shadow.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_box-sizing.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_box.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_columns.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_filter.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_font-face.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_hyphenation.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_images.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_inline-block.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_opacity.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_regions.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_shared.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_text-shadow.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_transform.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/a2b7e568cca225148f3e4dc8c9c0bdfe1174b763/_transition.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/aa1b4daeb1aa66522abf94710543639284144823/_clearfix.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/aa1b4daeb1aa66522abf94710543639284144823/_hacks.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/ba1a1c8b7407a74496e0f1bb0af5e060acd9c6b4/_css3.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/ba1a1c8b7407a74496e0f1bb0af5e060acd9c6b4/_support.scssc
DELETED
Binary file
|
admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_contact_detail_page.sassc
DELETED
Binary file
|
admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_contacts_list_page.sassc
DELETED
Binary file
|
admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_settings_page.sassc
DELETED
Binary file
|
admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_tables.sassc
DELETED
Binary file
|
admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/_variables.sassc
DELETED
Binary file
|
admin/sass/.sass-cache/f44f973eb6f81b0c357f9f23e88bc1c2233de3b4/leadin-admin.sassc
DELETED
Binary file
|
admin/sass/_grid.sass
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
@import "
|
2 |
|
3 |
// Settings
|
4 |
|
@@ -11,12 +11,15 @@ $grid-padding: 20px
|
|
11 |
|
12 |
#leadin
|
13 |
@include container($total-columns, $break)
|
14 |
-
margin
|
15 |
padding: 0
|
16 |
|
17 |
*
|
18 |
box-sizing: border-box
|
19 |
|
|
|
|
|
|
|
20 |
// Layout
|
21 |
|
22 |
@include at-breakpoint($break)
|
1 |
+
@import "susyone"
|
2 |
|
3 |
// Settings
|
4 |
|
11 |
|
12 |
#leadin
|
13 |
@include container($total-columns, $break)
|
14 |
+
margin: 0
|
15 |
padding: 0
|
16 |
|
17 |
*
|
18 |
box-sizing: border-box
|
19 |
|
20 |
+
@include at-breakpoint($break)
|
21 |
+
margin: 0
|
22 |
+
|
23 |
// Layout
|
24 |
|
25 |
@include at-breakpoint($break)
|
admin/sass/_settings_page.sass
CHANGED
@@ -16,6 +16,17 @@
|
|
16 |
.leadin-contact-avatar
|
17 |
margin-right: 10px
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
.steps
|
20 |
margin: $base-vertical-unit*8 auto 0
|
21 |
text-align: center
|
16 |
.leadin-contact-avatar
|
17 |
margin-right: 10px
|
18 |
|
19 |
+
.power-up-settings-icon
|
20 |
+
padding-right: 10px
|
21 |
+
float: left
|
22 |
+
max-height: 20px
|
23 |
+
margin-top: -1px
|
24 |
+
|
25 |
+
.dashicons
|
26 |
+
margin-right: 10px
|
27 |
+
float: left
|
28 |
+
margin-top: -1px
|
29 |
+
|
30 |
.steps
|
31 |
margin: $base-vertical-unit*8 auto 0
|
32 |
text-align: center
|
images/power-up-icon-mailchimp-list-sync.png
ADDED
Binary file
|
images/power-up-icon-mailchimp-list-sync@2x.png
ADDED
Binary file
|
images/power-up-icon-mailchimp-list-sync_small.png
ADDED
Binary file
|
images/power-up-icon-mailchimp-list-sync_small@2x.png
ADDED
Binary file
|
inc/class-emailer.php
CHANGED
@@ -113,8 +113,7 @@ class LI_Emailer {
|
|
113 |
}
|
114 |
else if ( $history->submission->form_type == "subscribe" )
|
115 |
{
|
116 |
-
$
|
117 |
-
$subject = $first_name . " loved " . $history->submission->form_page_title . " and subscribed to your mailing list";
|
118 |
leadin_track_plugin_activity("New subscriber");
|
119 |
$this->send_subscriber_confirmation_email($history);
|
120 |
}
|
@@ -290,7 +289,7 @@ class LI_Emailer {
|
|
290 |
// If source isn't set, set it to direct
|
291 |
if ( $session_source )
|
292 |
{
|
293 |
-
$session_source_text
|
294 |
}
|
295 |
else
|
296 |
{
|
@@ -410,7 +409,7 @@ class LI_Emailer {
|
|
410 |
|
411 |
// Build Powered by LeadIn row
|
412 |
$body .= "<table class='row section' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;display: block;margin-top: 20px;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 0 0px 0 0;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='padding: 10px 20px;' align='left' valign='top'><table style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;overflow: hidden;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;display: block;width: auto !important;font-size: 16px;padding: 10px 20px;' align='center' valign='top'>";
|
413 |
-
$body .="<div style='font-size: 11px; color: #888; padding: 0 0 5px 0;'>Powered by</div><a href='http://leadin.com/
|
414 |
$body .= "</td></tr></table></td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;padding: 0;border: 0;' align='left' valign='top'></td></tr></table></td></tr></table>";
|
415 |
|
416 |
// @EMAIL - end form section
|
113 |
}
|
114 |
else if ( $history->submission->form_type == "subscribe" )
|
115 |
{
|
116 |
+
$subject = "New subscriber from " . $history->submission->form_page_title;
|
|
|
117 |
leadin_track_plugin_activity("New subscriber");
|
118 |
$this->send_subscriber_confirmation_email($history);
|
119 |
}
|
289 |
// If source isn't set, set it to direct
|
290 |
if ( $session_source )
|
291 |
{
|
292 |
+
$session_source_text = "<a href='" . $session_source . "' style='color: #2ba6cb; text-decoration: none !important;'>" . $session_source . "</a>";
|
293 |
}
|
294 |
else
|
295 |
{
|
409 |
|
410 |
// Build Powered by LeadIn row
|
411 |
$body .= "<table class='row section' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;display: block;margin-top: 20px;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 0 0px 0 0;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='padding: 10px 20px;' align='left' valign='top'><table style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;overflow: hidden;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;display: block;width: auto !important;font-size: 16px;padding: 10px 20px;' align='center' valign='top'>";
|
412 |
+
$body .="<div style='font-size: 11px; color: #888; padding: 0 0 5px 0;'>Powered by</div><a href='http://leadin.com/wordpress-subscribe-widget/?utm_campaign=subscribe_widget&utm_medium=email&utm_source=" . $site_url . "'><img alt='LeadIn' height='20px' width='99px' src='http://leadin.com/wp-content/themes/LeadIn-WP-Theme/library/images/logos/Leadin_logo@2x.png' alt='leadin.com'/></a>";
|
413 |
$body .= "</td></tr></table></td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;padding: 0;border: 0;' align='left' valign='top'></td></tr></table></td></tr></table>";
|
414 |
|
415 |
// @EMAIL - end form section
|
inc/leadin-ajax-functions.php
CHANGED
@@ -236,6 +236,18 @@ function leadin_insert_form_submission ()
|
|
236 |
$q = $wpdb->prepare("UPDATE li_leads SET lead_email = %s, lead_status = %s, merged_hashkeys = %s WHERE hashkey = %s", $email, $contact_status, $existing_contact_hashkeys, $hashkey);
|
237 |
$rows_updated = $wpdb->query($q);
|
238 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
239 |
// Send the contact email
|
240 |
$li_emailer = new LI_Emailer();
|
241 |
$li_emailer->send_new_lead_email($hashkey);
|
236 |
$q = $wpdb->prepare("UPDATE li_leads SET lead_email = %s, lead_status = %s, merged_hashkeys = %s WHERE hashkey = %s", $email, $contact_status, $existing_contact_hashkeys, $hashkey);
|
237 |
$rows_updated = $wpdb->query($q);
|
238 |
|
239 |
+
// Hit ESP APIs if power-up activated
|
240 |
+
if ( $contact_status == 'subscribe' )
|
241 |
+
{
|
242 |
+
$active_power_ups = array_unique(unserialize(get_option('leadin_active_power_ups')));
|
243 |
+
|
244 |
+
if ( in_array('mailchimp_list_sync', $active_power_ups) )
|
245 |
+
{
|
246 |
+
global $leadin_mailchimp_list_sync_wp;
|
247 |
+
$leadin_mailchimp_list_sync_wp->push_mailchimp_subscriber_to_list($email);
|
248 |
+
}
|
249 |
+
}
|
250 |
+
|
251 |
// Send the contact email
|
252 |
$li_emailer = new LI_Emailer();
|
253 |
$li_emailer->send_new_lead_email($hashkey);
|
leadin.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: LeadIn
|
4 |
Plugin URI: http://leadin.com
|
5 |
Description: LeadIn is an easy-to-use marketing automation and lead tracking plugin for WordPress that helps you better understand your web site visitors.
|
6 |
-
Version: 0.
|
7 |
Author: Andy Cook, Nelson Joyce
|
8 |
Author URI: http://leadin.com
|
9 |
License: GPL2
|
@@ -26,7 +26,7 @@ if ( !defined('LEADIN_DB_VERSION') )
|
|
26 |
define('LEADIN_DB_VERSION', '0.6.2');
|
27 |
|
28 |
if ( !defined('LEADIN_PLUGIN_VERSION') )
|
29 |
-
define('LEADIN_PLUGIN_VERSION', '0.
|
30 |
|
31 |
if ( !defined('MIXPANEL_PROJECT_TOKEN') )
|
32 |
define('MIXPANEL_PROJECT_TOKEN', 'a9615503ec58a6bce2c646a58390eac1');
|
@@ -42,6 +42,7 @@ require_once(LEADIN_PLUGIN_DIR . '/inc/leadin-ajax-functions.php');
|
|
42 |
require_once(LEADIN_PLUGIN_DIR . '/inc/leadin-functions.php');
|
43 |
require_once(LEADIN_PLUGIN_DIR . '/power-ups/subscribe-widget.php');
|
44 |
require_once(LEADIN_PLUGIN_DIR . '/power-ups/contacts.php');
|
|
|
45 |
require_once(LEADIN_PLUGIN_DIR . '/lib/mixpanel/Mixpanel.php');
|
46 |
|
47 |
//=============================================
|
@@ -272,8 +273,7 @@ class WPLeadIn {
|
|
272 |
}
|
273 |
|
274 |
/**
|
275 |
-
* List available
|
276 |
-
* Make sure to tuck away module "library" files in a sub-directory.
|
277 |
*/
|
278 |
public static function get_available_power_ups( $min_version = false, $max_version = false ) {
|
279 |
static $power_ups = null;
|
@@ -297,6 +297,7 @@ class WPLeadIn {
|
|
297 |
$power_up->link_uri = $headers['uri'];
|
298 |
$power_up->description = $headers['description'];
|
299 |
$power_up->icon = $headers['icon'];
|
|
|
300 |
$power_up->permanent = $headers['permanent'];
|
301 |
$power_up->auto_activate = $headers['auto_activate'];
|
302 |
$power_up->activated = $headers['activated'];
|
@@ -341,6 +342,7 @@ class WPLeadIn {
|
|
341 |
'uri' => 'Power-up URI',
|
342 |
'description' => 'Power-up Description',
|
343 |
'icon' => 'Power-up Icon',
|
|
|
344 |
'introduced' => 'First Introduced',
|
345 |
'auto_activate' => 'Auto Activate',
|
346 |
'permanent' => 'Permanently Enabled',
|
3 |
Plugin Name: LeadIn
|
4 |
Plugin URI: http://leadin.com
|
5 |
Description: LeadIn is an easy-to-use marketing automation and lead tracking plugin for WordPress that helps you better understand your web site visitors.
|
6 |
+
Version: 0.7.1
|
7 |
Author: Andy Cook, Nelson Joyce
|
8 |
Author URI: http://leadin.com
|
9 |
License: GPL2
|
26 |
define('LEADIN_DB_VERSION', '0.6.2');
|
27 |
|
28 |
if ( !defined('LEADIN_PLUGIN_VERSION') )
|
29 |
+
define('LEADIN_PLUGIN_VERSION', '0.7.1');
|
30 |
|
31 |
if ( !defined('MIXPANEL_PROJECT_TOKEN') )
|
32 |
define('MIXPANEL_PROJECT_TOKEN', 'a9615503ec58a6bce2c646a58390eac1');
|
42 |
require_once(LEADIN_PLUGIN_DIR . '/inc/leadin-functions.php');
|
43 |
require_once(LEADIN_PLUGIN_DIR . '/power-ups/subscribe-widget.php');
|
44 |
require_once(LEADIN_PLUGIN_DIR . '/power-ups/contacts.php');
|
45 |
+
require_once(LEADIN_PLUGIN_DIR . '/power-ups/mailchimp-list-sync.php');
|
46 |
require_once(LEADIN_PLUGIN_DIR . '/lib/mixpanel/Mixpanel.php');
|
47 |
|
48 |
//=============================================
|
273 |
}
|
274 |
|
275 |
/**
|
276 |
+
* List available power-ups
|
|
|
277 |
*/
|
278 |
public static function get_available_power_ups( $min_version = false, $max_version = false ) {
|
279 |
static $power_ups = null;
|
297 |
$power_up->link_uri = $headers['uri'];
|
298 |
$power_up->description = $headers['description'];
|
299 |
$power_up->icon = $headers['icon'];
|
300 |
+
$power_up->icon_small = $headers['icon_small'];
|
301 |
$power_up->permanent = $headers['permanent'];
|
302 |
$power_up->auto_activate = $headers['auto_activate'];
|
303 |
$power_up->activated = $headers['activated'];
|
342 |
'uri' => 'Power-up URI',
|
343 |
'description' => 'Power-up Description',
|
344 |
'icon' => 'Power-up Icon',
|
345 |
+
'icon_small' => 'Power-up Icon Small',
|
346 |
'introduced' => 'First Introduced',
|
347 |
'auto_activate' => 'Auto Activate',
|
348 |
'permanent' => 'Permanently Enabled',
|
power-ups/contacts.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* Power-up Name:
|
4 |
* Power-up Class: WPLeadInContacts
|
5 |
* Power-up Menu Text: Contacts
|
6 |
* Power-up Menu Link: contacts
|
@@ -8,6 +8,7 @@
|
|
8 |
* Power-up URI: http://leadin.com/
|
9 |
* Power-up Description: Get an in-depth history of each contact in your database.
|
10 |
* Power-up Icon: powerup-icon-leads
|
|
|
11 |
* First Introduced: 0.4.7
|
12 |
* Power-up Tags: Lead Tracking
|
13 |
* Auto Activate: Yes
|
1 |
<?php
|
2 |
/**
|
3 |
+
* Power-up Name: Visitor Tracking
|
4 |
* Power-up Class: WPLeadInContacts
|
5 |
* Power-up Menu Text: Contacts
|
6 |
* Power-up Menu Link: contacts
|
8 |
* Power-up URI: http://leadin.com/
|
9 |
* Power-up Description: Get an in-depth history of each contact in your database.
|
10 |
* Power-up Icon: powerup-icon-leads
|
11 |
+
* Power-up Icon Small: powerup-icon-leads
|
12 |
* First Introduced: 0.4.7
|
13 |
* Power-up Tags: Lead Tracking
|
14 |
* Auto Activate: Yes
|
power-ups/mailchimp-list-sync.php
ADDED
@@ -0,0 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Power-up Name: MailChimp List Sync
|
4 |
+
* Power-up Class: WPMailChimpListSync
|
5 |
+
* Power-up Menu Text:
|
6 |
+
* Power-up Slug: mailchimp_list_sync
|
7 |
+
* Power-up Menu Link: settings
|
8 |
+
* Power-up URI: http://leadin.com/mailchimp-list-sync
|
9 |
+
* Power-up Description: Sync your subscribers to a MailChimp email list.
|
10 |
+
* Power-up Icon: power-up-icon-mailchimp-list-sync
|
11 |
+
* Power-up Icon Small: power-up-icon-mailchimp-list-sync_small
|
12 |
+
* First Introduced: 0.7.0
|
13 |
+
* Power-up Tags: Newsletter, Email
|
14 |
+
* Auto Activate: No
|
15 |
+
*/
|
16 |
+
|
17 |
+
//=============================================
|
18 |
+
// Define Constants
|
19 |
+
//=============================================
|
20 |
+
|
21 |
+
if ( !defined('LEADIN_MAILCHIMP_LIST_SYNC_PATH') )
|
22 |
+
define('LEADIN_MAILCHIMP_LIST_SYNC_PATH', LEADIN_PATH . '/power-ups/mailchimp-list-sync');
|
23 |
+
|
24 |
+
if ( !defined('LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR') )
|
25 |
+
define('LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR', LEADIN_PLUGIN_DIR . '/power-ups/mailchimp-list-sync');
|
26 |
+
|
27 |
+
if ( !defined('LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_SLUG') )
|
28 |
+
define('LEADIN_MAILCHIMP_LIST_SYNC_SLUG', basename(dirname(__FILE__)));
|
29 |
+
|
30 |
+
//=============================================
|
31 |
+
// Include Needed Files
|
32 |
+
//=============================================
|
33 |
+
require_once(LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR . '/admin/mailchimp-list-sync-admin.php');
|
34 |
+
require_once(LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR . '/inc/MailChimp-API.php');
|
35 |
+
|
36 |
+
//=============================================
|
37 |
+
// WPLeadIn Class
|
38 |
+
//=============================================
|
39 |
+
class WPMailChimpListSync extends WPLeadIn {
|
40 |
+
|
41 |
+
var $admin;
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Class constructor
|
45 |
+
*/
|
46 |
+
function __construct ( $activated )
|
47 |
+
{
|
48 |
+
//=============================================
|
49 |
+
// Hooks & Filters
|
50 |
+
//=============================================
|
51 |
+
|
52 |
+
if ( ! $activated )
|
53 |
+
return false;
|
54 |
+
|
55 |
+
global $leadin_mailchimp_list_sync_wp;
|
56 |
+
$leadin_mailchimp_list_sync_wp = $this;
|
57 |
+
|
58 |
+
}
|
59 |
+
|
60 |
+
public function admin_init ( )
|
61 |
+
{
|
62 |
+
$admin_class = get_class($this) . 'Admin';
|
63 |
+
$this->admin = new $admin_class($this->icon_small);
|
64 |
+
}
|
65 |
+
|
66 |
+
function power_up_setup_callback ( )
|
67 |
+
{
|
68 |
+
$this->admin->power_up_setup_callback();
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Activate the power-up
|
73 |
+
*/
|
74 |
+
function add_leadin_subscribe_defaults ()
|
75 |
+
{
|
76 |
+
$lis_options = get_option('leadin_subscribe_options');
|
77 |
+
|
78 |
+
if ( ($lis_options['li_susbscibe_installed'] != 1) || (!is_array($lis_options)) )
|
79 |
+
{
|
80 |
+
$opt = array(
|
81 |
+
'li_susbscibe_installed' => '1',
|
82 |
+
'li_subscribe_heading' => 'Sign up for my newsletter to get new posts by email'
|
83 |
+
);
|
84 |
+
|
85 |
+
update_option('leadin_subscribe_options', $opt);
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
function push_mailchimp_subscriber_to_list ( $email = '', $first_name = '', $last_name = '', $phone = '' )
|
90 |
+
{
|
91 |
+
$options = get_option('leadin_mls_options');
|
92 |
+
|
93 |
+
if ( isset($options['li_mls_api_key']) && $options['li_mls_api_key'] && isset($options['li_mls_subscribers_to_list']) && $options['li_mls_subscribers_to_list'] )
|
94 |
+
{
|
95 |
+
$MailChimp = new MailChimp($options['li_mls_api_key']);
|
96 |
+
|
97 |
+
$subscribe = $MailChimp->call("lists/subscribe", array(
|
98 |
+
"id" => $options['li_mls_subscribers_to_list'],
|
99 |
+
"email" => array( 'email' => $email),
|
100 |
+
"send_welcome" => FALSE,
|
101 |
+
"email_type" => 'html',
|
102 |
+
"update_existing" => TRUE,
|
103 |
+
'replace_interests' => FALSE,
|
104 |
+
'double_optin' => FALSE,
|
105 |
+
"merge_vars" => array(
|
106 |
+
'EMAIL' => $email,
|
107 |
+
'FNAME' => $first_name,
|
108 |
+
'LNAME' => $last_name,
|
109 |
+
'PHONE' => $phone
|
110 |
+
)
|
111 |
+
));
|
112 |
+
}
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
//=============================================
|
117 |
+
// Subscribe Widget Init
|
118 |
+
//=============================================
|
119 |
+
|
120 |
+
global $leadin_mailchimp_list_sync_wp;
|
121 |
+
|
122 |
+
?>
|
power-ups/mailchimp-list-sync/admin/mailchimp-list-sync-admin.php
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
//=============================================
|
3 |
+
// WPLeadInAdmin Class
|
4 |
+
//=============================================
|
5 |
+
class WPMailChimpListSyncAdmin extends WPLeadInAdmin {
|
6 |
+
|
7 |
+
var $power_up_settings_section = 'leadin_mls_options_section';
|
8 |
+
var $power_up_icon;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Class constructor
|
12 |
+
*/
|
13 |
+
function __construct ( $small_icon )
|
14 |
+
{
|
15 |
+
//=============================================
|
16 |
+
// Hooks & Filters
|
17 |
+
//=============================================
|
18 |
+
|
19 |
+
if ( is_admin() )
|
20 |
+
{
|
21 |
+
$this->power_up_icon = '<img src="' . LEADIN_PATH . '/images/' . $small_icon . '.png" class="power-up-settings-icon"/>';
|
22 |
+
add_action('admin_init', array($this, 'leadin_mls_build_settings_page'));
|
23 |
+
}
|
24 |
+
}
|
25 |
+
|
26 |
+
//=============================================
|
27 |
+
// Settings Page
|
28 |
+
//=============================================
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Creates settings options
|
32 |
+
*/
|
33 |
+
function leadin_mls_build_settings_page ()
|
34 |
+
{
|
35 |
+
$options = get_option('leadin_mls_options');
|
36 |
+
|
37 |
+
register_setting('leadin_settings_options', 'leadin_mls_options', array($this, 'sanitize'));
|
38 |
+
add_settings_section($this->power_up_settings_section, $this->power_up_icon . "MailChimp", '', LEADIN_ADMIN_PATH);
|
39 |
+
add_settings_field('li_mls_api_key', 'API key', array($this, 'li_mls_api_key_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
40 |
+
|
41 |
+
if ( isset($options['li_mls_api_key']) && $options['li_mls_api_key'] )
|
42 |
+
add_settings_field('li_mls_subscribers_to_list', 'Add subscribers to list', array($this, 'li_mls_subscribers_to_list_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Sanitize each setting field as needed
|
47 |
+
*
|
48 |
+
* @param array $input Contains all settings fields as array keys
|
49 |
+
*/
|
50 |
+
public function sanitize ( $input )
|
51 |
+
{
|
52 |
+
$new_input = array();
|
53 |
+
|
54 |
+
if( isset( $input['li_mls_api_key'] ) )
|
55 |
+
$new_input['li_mls_api_key'] = sanitize_text_field( $input['li_mls_api_key'] );
|
56 |
+
|
57 |
+
if( isset( $input['li_mls_subscribers_to_list'] ) )
|
58 |
+
$new_input['li_mls_subscribers_to_list'] = sanitize_text_field( $input['li_mls_subscribers_to_list'] );
|
59 |
+
|
60 |
+
return $new_input;
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Prints email input for settings page
|
65 |
+
*/
|
66 |
+
function li_mls_api_key_callback ()
|
67 |
+
{
|
68 |
+
$options = get_option('leadin_mls_options');
|
69 |
+
$li_mls_api_key = ( $options['li_mls_api_key'] ? $options['li_mls_api_key'] : '' ); // Get header from options, or show default
|
70 |
+
|
71 |
+
printf(
|
72 |
+
'<input id="li_mls_api_key" type="text" id="title" name="leadin_mls_options[li_mls_api_key]" value="%s" size="50"/>',
|
73 |
+
$li_mls_api_key
|
74 |
+
);
|
75 |
+
|
76 |
+
echo '<p><a href="http://admin.mailchimp.com/account/api/" target="_blank">Get an API key from MailChimp.com</a></p>';
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Prints email input for settings page
|
81 |
+
*/
|
82 |
+
function li_mls_subscribers_to_list_callback ()
|
83 |
+
{
|
84 |
+
$options = get_option('leadin_mls_options');
|
85 |
+
$li_mls_subscribers_to_list = ( isset($options['li_mls_subscribers_to_list']) ? $options['li_mls_subscribers_to_list'] : '' ); // Get header from options, or show default
|
86 |
+
|
87 |
+
$lists = $this->li_mls_get_mailchimp_lists($options['li_mls_api_key']);
|
88 |
+
|
89 |
+
echo '<select id="li_mls_subscribers_to_list" name="leadin_mls_options[li_mls_subscribers_to_list]" ' . ( ! count($lists['data']) ? 'disabled' : '' ) . '>';
|
90 |
+
|
91 |
+
if ( count($lists['data']) )
|
92 |
+
{
|
93 |
+
foreach ( $lists['data'] as $list )
|
94 |
+
{
|
95 |
+
$list_set = FALSE;
|
96 |
+
if ( $list['id'] == $li_mls_subscribers_to_list && !$list_set )
|
97 |
+
$list_set = TRUE;
|
98 |
+
|
99 |
+
echo '<option ' . ( $list['id'] == $li_mls_subscribers_to_list ? 'selected' : '' ) . ' value="' . $list['id'] . '">' . $list['name'] . '</option>';
|
100 |
+
|
101 |
+
if ( !$list_set )
|
102 |
+
echo '<option selected value="">No list set...</option>';
|
103 |
+
}
|
104 |
+
}
|
105 |
+
else
|
106 |
+
{
|
107 |
+
echo '<option value="No lists...">No lists...</option>';
|
108 |
+
}
|
109 |
+
|
110 |
+
echo '</select>';
|
111 |
+
|
112 |
+
echo '<p><a href="http://admin.mailchimp.com/lists/new-list/" target="_blank">Create a new list on MailChimp.com</a></p>';
|
113 |
+
}
|
114 |
+
|
115 |
+
function li_mls_get_mailchimp_lists ( $api_key )
|
116 |
+
{
|
117 |
+
$MailChimp = new MailChimp($api_key);
|
118 |
+
|
119 |
+
$lists = $MailChimp->call("lists/list", array(
|
120 |
+
"start" => 0, // optional, control paging of lists, start results at this list #, defaults to 1st page of data (page 0)
|
121 |
+
"limit" => 25, // optional, control paging of lists, number of lists to return with each call, defaults to 25 (max=100)
|
122 |
+
"sort_field" => "created", // optional, "created" (the created date, default) or "web" (the display order in the web app). Invalid values will fall back on "created" - case insensitive.
|
123 |
+
"sort_dir" => "DESC" // optional, "DESC" for descending (default), "ASC" for Ascending. Invalid values will fall back on "created" - case insensitive. Note: to get the exact display order as the web app you'd use "web" and "ASC"
|
124 |
+
));
|
125 |
+
|
126 |
+
return $lists;
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
?>
|
power-ups/mailchimp-list-sync/inc/MailChimp-API.php
ADDED
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Super-simple, minimum abstraction MailChimp API v2 wrapper
|
6 |
+
*
|
7 |
+
* Uses curl if available, falls back to file_get_contents and HTTP stream.
|
8 |
+
* This probably has more comments than code.
|
9 |
+
*
|
10 |
+
* Contributors:
|
11 |
+
* Michael Minor <me@pixelbacon.com>
|
12 |
+
* Lorna Jane Mitchell, github.com/lornajane
|
13 |
+
*
|
14 |
+
* @author Drew McLellan <drew.mclellan@gmail.com>
|
15 |
+
* @version 1.1.1
|
16 |
+
*/
|
17 |
+
class MailChimp
|
18 |
+
{
|
19 |
+
private $api_key;
|
20 |
+
private $api_endpoint = 'https://<dc>.api.mailchimp.com/2.0';
|
21 |
+
private $verify_ssl = false;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Create a new instance
|
25 |
+
* @param string $api_key Your MailChimp API key
|
26 |
+
*/
|
27 |
+
function __construct($api_key)
|
28 |
+
{
|
29 |
+
$this->api_key = $api_key;
|
30 |
+
list(, $datacentre) = explode('-', $this->api_key);
|
31 |
+
$this->api_endpoint = str_replace('<dc>', $datacentre, $this->api_endpoint);
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Call an API method. Every request needs the API key, so that is added automatically -- you don't need to pass it in.
|
36 |
+
* @param string $method The API method to call, e.g. 'lists/list'
|
37 |
+
* @param array $args An array of arguments to pass to the method. Will be json-encoded for you.
|
38 |
+
* @return array Associative array of json decoded API response.
|
39 |
+
*/
|
40 |
+
public function call($method, $args=array())
|
41 |
+
{
|
42 |
+
return $this->makeRequest($method, $args);
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Performs the underlying HTTP request. Not very exciting
|
47 |
+
* @param string $method The API method to be called
|
48 |
+
* @param array $args Assoc array of parameters to be passed
|
49 |
+
* @return array Assoc array of decoded result
|
50 |
+
*/
|
51 |
+
private function makeRequest($method, $args=array())
|
52 |
+
{
|
53 |
+
$args['apikey'] = $this->api_key;
|
54 |
+
|
55 |
+
$url = $this->api_endpoint.'/'.$method.'.json';
|
56 |
+
|
57 |
+
if (function_exists('curl_init') && function_exists('curl_setopt')){
|
58 |
+
$ch = curl_init();
|
59 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
60 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
|
61 |
+
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
|
62 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
63 |
+
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
64 |
+
curl_setopt($ch, CURLOPT_POST, true);
|
65 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->verify_ssl);
|
66 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($args));
|
67 |
+
$result = curl_exec($ch);
|
68 |
+
curl_close($ch);
|
69 |
+
} else {
|
70 |
+
$json_data = json_encode($args);
|
71 |
+
$result = file_get_contents($url, null, stream_context_create(array(
|
72 |
+
'http' => array(
|
73 |
+
'protocol_version' => 1.1,
|
74 |
+
'user_agent' => 'PHP-MCAPI/2.0',
|
75 |
+
'method' => 'POST',
|
76 |
+
'header' => "Content-type: application/json\r\n".
|
77 |
+
"Connection: close\r\n" .
|
78 |
+
"Content-length: " . strlen($json_data) . "\r\n",
|
79 |
+
'content' => $json_data,
|
80 |
+
),
|
81 |
+
)));
|
82 |
+
}
|
83 |
+
|
84 |
+
return $result ? json_decode($result, true) : false;
|
85 |
+
}
|
86 |
+
}
|
power-ups/subscribe-widget.php
CHANGED
@@ -8,6 +8,7 @@
|
|
8 |
* Power-up URI: http://leadin.com/pop-subscribe-form-plugin-wordpress
|
9 |
* Power-up Description: Convert more email subscribers with our pop-up.
|
10 |
* Power-up Icon: powerup-icon-subscribe
|
|
|
11 |
* First Introduced: 0.4.7
|
12 |
* Power-up Tags: Lead Generation
|
13 |
* Auto Activate: Yes
|
@@ -52,13 +53,13 @@ class WPLeadInSubscribe extends WPLeadIn {
|
|
52 |
|
53 |
add_filter('init', array($this, 'add_leadin_subscribe_frontend_scripts_and_styles'));
|
54 |
|
55 |
-
add_action('get_footer', array(&$this, '
|
56 |
}
|
57 |
|
58 |
public function admin_init ( )
|
59 |
{
|
60 |
$admin_class = get_class($this) . 'Admin';
|
61 |
-
$this->admin = new $admin_class();
|
62 |
}
|
63 |
|
64 |
function power_up_setup_callback ( )
|
@@ -77,7 +78,10 @@ class WPLeadInSubscribe extends WPLeadIn {
|
|
77 |
{
|
78 |
$opt = array(
|
79 |
'li_susbscibe_installed' => '1',
|
80 |
-
'
|
|
|
|
|
|
|
81 |
);
|
82 |
|
83 |
update_option('leadin_subscribe_options', $opt);
|
@@ -85,15 +89,16 @@ class WPLeadInSubscribe extends WPLeadIn {
|
|
85 |
}
|
86 |
|
87 |
/**
|
88 |
-
* Adds a hidden input at the end of the content containing the ouput of the heading options
|
89 |
*
|
90 |
* @return
|
91 |
*/
|
92 |
-
function
|
93 |
{
|
94 |
$lis_options = get_option('leadin_subscribe_options');
|
95 |
|
96 |
// Heading for the subscribe plugin
|
|
|
97 |
echo '<input id="leadin-subscribe-heading" value="' . ( isset($lis_options['li_subscribe_heading']) ? $lis_options['li_subscribe_heading'] : 'Sign up for my newsletter to get new posts by email' ) . '" type="hidden"/>';
|
98 |
echo '<input id="leadin-subscribe-btn-label" value="' . ( isset($lis_options['li_subscribe_btn_label']) ? $lis_options['li_subscribe_btn_label'] : 'SUBSCRIBE' ) . '" type="hidden"/>';
|
99 |
|
@@ -122,55 +127,13 @@ class WPLeadInSubscribe extends WPLeadIn {
|
|
122 |
wp_enqueue_script('vex');
|
123 |
wp_enqueue_script('vex-dialog');
|
124 |
|
125 |
-
wp_register_style('leadin-subscribe-css', LEADIN_SUBSCRIBE_WIDGET_PATH . '/frontend/css/leadin-subscribe.css');
|
126 |
wp_register_style('leadin-subscribe-vex-css', LEADIN_SUBSCRIBE_WIDGET_PATH . '/frontend/css/vex.css');
|
127 |
|
128 |
wp_enqueue_style('leadin-subscribe-vex-css');
|
129 |
-
wp_enqueue_style('leadin-subscribe-css');
|
130 |
-
|
131 |
|
132 |
//wp_localize_script('leadin', 'li_ajax', array('ajax_url' => admin_url('admin-ajax.php')));
|
133 |
}
|
134 |
}
|
135 |
-
|
136 |
-
function notify_new_post($post_id) {
|
137 |
-
if( ( $_POST['post_status'] == 'publish' ) && ( $_POST['original_post_status'] != 'publish' ) ) {
|
138 |
-
$headers = "From: LeadIn <team@leadin.com>\r\n";
|
139 |
-
$headers.= "Reply-To: LeadIn <team@leadin.com>\r\n";
|
140 |
-
$headers.= "X-Mailer: PHP/" . phpversion()."\r\n";
|
141 |
-
$headers.= "MIME-Version: 1.0\r\n";
|
142 |
-
$headers.= "Content-type: text/html; charset=utf-8\r\n";
|
143 |
-
|
144 |
-
$post = get_post($post_id);
|
145 |
-
$author = get_userdata($post->post_author);
|
146 |
-
$author_email = $author->user_email;
|
147 |
-
$email_subject = "Your post has been published.";
|
148 |
-
|
149 |
-
ob_start(); ?>
|
150 |
-
|
151 |
-
<html>
|
152 |
-
<head>
|
153 |
-
<title>New post at <?php bloginfo( 'name' ) ?></title>
|
154 |
-
</head>
|
155 |
-
<body>
|
156 |
-
<p>
|
157 |
-
Hi <?php echo $author->user_firstname ?>,
|
158 |
-
</p>
|
159 |
-
<p>
|
160 |
-
Your post <a href="<?php echo get_permalink($post->ID) ?>"><?php the_title_attribute() ?></a> has been published.
|
161 |
-
</p>
|
162 |
-
</body>
|
163 |
-
</html>
|
164 |
-
|
165 |
-
<?php
|
166 |
-
|
167 |
-
$message = ob_get_contents();
|
168 |
-
|
169 |
-
ob_end_clean();
|
170 |
-
|
171 |
-
wp_mail( 'andy@leadin.com', $email_subject, $message );
|
172 |
-
}
|
173 |
-
}
|
174 |
}
|
175 |
|
176 |
//=============================================
|
@@ -178,6 +141,5 @@ class WPLeadInSubscribe extends WPLeadIn {
|
|
178 |
//=============================================
|
179 |
|
180 |
global $leadin_subscribe_wp;
|
181 |
-
//$leadin_subscribe_wp = new WPLeadInSubscribe();
|
182 |
|
183 |
?>
|
8 |
* Power-up URI: http://leadin.com/pop-subscribe-form-plugin-wordpress
|
9 |
* Power-up Description: Convert more email subscribers with our pop-up.
|
10 |
* Power-up Icon: powerup-icon-subscribe
|
11 |
+
* Power-up Icon Small: powerup-icon-subscribe
|
12 |
* First Introduced: 0.4.7
|
13 |
* Power-up Tags: Lead Generation
|
14 |
* Auto Activate: Yes
|
53 |
|
54 |
add_filter('init', array($this, 'add_leadin_subscribe_frontend_scripts_and_styles'));
|
55 |
|
56 |
+
add_action('get_footer', array(&$this, 'append_leadin_subscribe_settings'));
|
57 |
}
|
58 |
|
59 |
public function admin_init ( )
|
60 |
{
|
61 |
$admin_class = get_class($this) . 'Admin';
|
62 |
+
$this->admin = new $admin_class($this->icon);
|
63 |
}
|
64 |
|
65 |
function power_up_setup_callback ( )
|
78 |
{
|
79 |
$opt = array(
|
80 |
'li_susbscibe_installed' => '1',
|
81 |
+
'li_subscribe_vex_class' => 'vex-theme-bottom-right-corner',
|
82 |
+
'li_subscribe_heading' => 'Sign up for my newsletter to get new posts by email',
|
83 |
+
'li_subscribe_btn_label' => 'SUBSCRIBE'
|
84 |
+
|
85 |
);
|
86 |
|
87 |
update_option('leadin_subscribe_options', $opt);
|
89 |
}
|
90 |
|
91 |
/**
|
92 |
+
* Adds a hidden input at the end of the content containing the ouput of the location, heading, and button text options
|
93 |
*
|
94 |
* @return
|
95 |
*/
|
96 |
+
function append_leadin_subscribe_settings ()
|
97 |
{
|
98 |
$lis_options = get_option('leadin_subscribe_options');
|
99 |
|
100 |
// Heading for the subscribe plugin
|
101 |
+
echo '<input id="leadin-subscribe-vex-class" value="' . ( isset($lis_options['li_subscribe_vex_class']) ? $lis_options['li_subscribe_vex_class'] : 'vex-theme-bottom-right-corner' ) . '" type="hidden"/>';
|
102 |
echo '<input id="leadin-subscribe-heading" value="' . ( isset($lis_options['li_subscribe_heading']) ? $lis_options['li_subscribe_heading'] : 'Sign up for my newsletter to get new posts by email' ) . '" type="hidden"/>';
|
103 |
echo '<input id="leadin-subscribe-btn-label" value="' . ( isset($lis_options['li_subscribe_btn_label']) ? $lis_options['li_subscribe_btn_label'] : 'SUBSCRIBE' ) . '" type="hidden"/>';
|
104 |
|
127 |
wp_enqueue_script('vex');
|
128 |
wp_enqueue_script('vex-dialog');
|
129 |
|
|
|
130 |
wp_register_style('leadin-subscribe-vex-css', LEADIN_SUBSCRIBE_WIDGET_PATH . '/frontend/css/vex.css');
|
131 |
|
132 |
wp_enqueue_style('leadin-subscribe-vex-css');
|
|
|
|
|
133 |
|
134 |
//wp_localize_script('leadin', 'li_ajax', array('ajax_url' => admin_url('admin-ajax.php')));
|
135 |
}
|
136 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
}
|
138 |
|
139 |
//=============================================
|
141 |
//=============================================
|
142 |
|
143 |
global $leadin_subscribe_wp;
|
|
|
144 |
|
145 |
?>
|
power-ups/subscribe-widget/admin/subscribe-widget-admin.php
CHANGED
@@ -11,21 +11,21 @@
|
|
11 |
class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
12 |
|
13 |
var $power_up_settings_section = 'leadin_subscribe_options_section';
|
|
|
14 |
|
15 |
/**
|
16 |
* Class constructor
|
17 |
*/
|
18 |
-
function __construct ()
|
19 |
{
|
20 |
//=============================================
|
21 |
// Hooks & Filters
|
22 |
//=============================================
|
23 |
-
|
24 |
if ( is_admin() )
|
25 |
{
|
|
|
26 |
add_action('admin_init', array($this, 'leadin_subscribe_build_settings_page'));
|
27 |
-
add_action('admin_print_scripts', array($this, 'add_leadin_subscribe_admin_scripts'));
|
28 |
-
add_action('admin_print_styles', array($this, 'add_leadin_subscribe_admin_styles'));
|
29 |
}
|
30 |
}
|
31 |
|
@@ -39,9 +39,11 @@ class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
|
39 |
function leadin_subscribe_build_settings_page ()
|
40 |
{
|
41 |
register_setting('leadin_settings_options', 'leadin_subscribe_options', array($this, 'sanitize'));
|
42 |
-
|
43 |
-
|
44 |
-
add_settings_field('
|
|
|
|
|
45 |
}
|
46 |
|
47 |
/**
|
@@ -53,6 +55,9 @@ class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
|
53 |
{
|
54 |
$new_input = array();
|
55 |
|
|
|
|
|
|
|
56 |
if( isset( $input['li_subscribe_heading'] ) )
|
57 |
$new_input['li_subscribe_heading'] = sanitize_text_field( $input['li_subscribe_heading'] );
|
58 |
|
@@ -63,7 +68,23 @@ class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
|
63 |
}
|
64 |
|
65 |
/**
|
66 |
-
* Prints
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
*/
|
68 |
function li_subscribe_heading_callback ()
|
69 |
{
|
@@ -77,12 +98,12 @@ class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
|
77 |
}
|
78 |
|
79 |
/**
|
80 |
-
* Prints
|
81 |
*/
|
82 |
function li_subscribe_btn_label_callback ()
|
83 |
{
|
84 |
$options = get_option('leadin_subscribe_options');
|
85 |
-
$li_subscribe_btn_label = ( $options['li_subscribe_btn_label'] ? $options['li_subscribe_btn_label'] : 'SUBSCRIBE' ); // Get
|
86 |
|
87 |
printf(
|
88 |
'<input id="li_subscribe_btn_label" type="text" id="title" name="leadin_subscribe_options[li_subscribe_btn_label]" value="%s" size="50"/>',
|
@@ -90,38 +111,6 @@ class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
|
90 |
);
|
91 |
|
92 |
}
|
93 |
-
|
94 |
-
//=============================================
|
95 |
-
// Admin Styles & Scripts
|
96 |
-
//=============================================
|
97 |
-
|
98 |
-
/**
|
99 |
-
* Adds admin javascript
|
100 |
-
*/
|
101 |
-
function add_leadin_subscribe_admin_scripts ()
|
102 |
-
{
|
103 |
-
global $pagenow;
|
104 |
-
|
105 |
-
if ( $pagenow == 'admin.php' && isset($_GET['page']) && strstr($_GET['page'], "leadin_settings") )
|
106 |
-
{
|
107 |
-
wp_register_script('leadin-subscribe-admin-js', LEADIN_SUBSCRIBE_WIDGET_PATH . '/admin/js/leadin-subscribe-admin.js', array ( 'jquery' ), FALSE, TRUE);
|
108 |
-
wp_enqueue_script('leadin-subscribe-admin-js');
|
109 |
-
}
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* Adds admin javascript
|
114 |
-
*/
|
115 |
-
function add_leadin_subscribe_admin_styles ()
|
116 |
-
{
|
117 |
-
global $pagenow;
|
118 |
-
|
119 |
-
if ( $pagenow == 'admin.php' && isset($_GET['page']) && strstr($_GET['page'], "leadin_settings") )
|
120 |
-
{
|
121 |
-
wp_register_style('leadin-subscribe-admin-css', LEADIN_SUBSCRIBE_WIDGET_PATH . '/admin/css/leadin-subscribe-admin.css');
|
122 |
-
wp_enqueue_style('leadin-subscribe-admin-css');
|
123 |
-
}
|
124 |
-
}
|
125 |
}
|
126 |
|
127 |
?>
|
11 |
class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
12 |
|
13 |
var $power_up_settings_section = 'leadin_subscribe_options_section';
|
14 |
+
var $power_up_icon;
|
15 |
|
16 |
/**
|
17 |
* Class constructor
|
18 |
*/
|
19 |
+
function __construct ( $power_up_icon )
|
20 |
{
|
21 |
//=============================================
|
22 |
// Hooks & Filters
|
23 |
//=============================================
|
24 |
+
|
25 |
if ( is_admin() )
|
26 |
{
|
27 |
+
$this->power_up_icon = '<span class="dashicons dashicons-email-alt"></span>';
|
28 |
add_action('admin_init', array($this, 'leadin_subscribe_build_settings_page'));
|
|
|
|
|
29 |
}
|
30 |
}
|
31 |
|
39 |
function leadin_subscribe_build_settings_page ()
|
40 |
{
|
41 |
register_setting('leadin_settings_options', 'leadin_subscribe_options', array($this, 'sanitize'));
|
42 |
+
|
43 |
+
add_settings_section($this->power_up_settings_section, $this->power_up_icon . 'Subscribe Pop-up', '', LEADIN_ADMIN_PATH);
|
44 |
+
add_settings_field('li_subscribe_vex_class', 'Pop-up Location', array($this, 'li_subscribe_vex_class_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
45 |
+
add_settings_field('li_subscribe_heading', 'Pop-up header text', array($this, 'li_subscribe_heading_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
46 |
+
add_settings_field('li_subscribe_btn_label', 'Button text', array($this, 'li_subscribe_btn_label_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
47 |
}
|
48 |
|
49 |
/**
|
55 |
{
|
56 |
$new_input = array();
|
57 |
|
58 |
+
if( isset( $input['li_subscribe_vex_class'] ) )
|
59 |
+
$new_input['li_subscribe_vex_class'] = sanitize_text_field( $input['li_subscribe_vex_class'] );
|
60 |
+
|
61 |
if( isset( $input['li_subscribe_heading'] ) )
|
62 |
$new_input['li_subscribe_heading'] = sanitize_text_field( $input['li_subscribe_heading'] );
|
63 |
|
68 |
}
|
69 |
|
70 |
/**
|
71 |
+
* Prints subscribe location input for settings page
|
72 |
+
*/
|
73 |
+
function li_subscribe_vex_class_callback ()
|
74 |
+
{
|
75 |
+
$options = get_option('leadin_subscribe_options');
|
76 |
+
$li_subscribe_vex_class = ( $options['li_subscribe_vex_class'] ? $options['li_subscribe_vex_class'] : 'vex-theme-bottom-right-corner' ); // Get class from options, or show default
|
77 |
+
|
78 |
+
echo '<select id="li_subscribe_vex_class" name="leadin_subscribe_options[li_subscribe_vex_class]">';
|
79 |
+
echo '<option value="vex-theme-bottom-right-corner"' . ( $li_subscribe_vex_class == 'vex-theme-bottom-right-corner' ? ' selected' : '' ) . '>Bottom right</option>';
|
80 |
+
echo '<option value="vex-theme-bottom-left-corner"' . ( $li_subscribe_vex_class == 'vex-theme-bottom-left-corner' ? ' selected' : '' ) . '>Bottom Left</option>';
|
81 |
+
echo '<option value="vex-theme-top"' . ( $li_subscribe_vex_class == 'vex-theme-top' ? ' selected' : '' ) . '>Top</option>';
|
82 |
+
echo '<option value="vex-theme-default"' . ( $li_subscribe_vex_class == 'vex-theme-default' ? ' selected' : '' ) . '>Pop-over content</option>';
|
83 |
+
echo '</select>';
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Prints subscribe heading input for settings page
|
88 |
*/
|
89 |
function li_subscribe_heading_callback ()
|
90 |
{
|
98 |
}
|
99 |
|
100 |
/**
|
101 |
+
* Prints subscribe heading text input for settings page
|
102 |
*/
|
103 |
function li_subscribe_btn_label_callback ()
|
104 |
{
|
105 |
$options = get_option('leadin_subscribe_options');
|
106 |
+
$li_subscribe_btn_label = ( $options['li_subscribe_btn_label'] ? $options['li_subscribe_btn_label'] : 'SUBSCRIBE' ); // Get button text from options, or show default
|
107 |
|
108 |
printf(
|
109 |
'<input id="li_subscribe_btn_label" type="text" id="title" name="leadin_subscribe_options[li_subscribe_btn_label]" value="%s" size="50"/>',
|
111 |
);
|
112 |
|
113 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
}
|
115 |
|
116 |
?>
|
power-ups/subscribe-widget/frontend/css/vex.css
CHANGED
@@ -1,337 +1,530 @@
|
|
1 |
-
@keyframes vex-
|
2 |
-
/* line
|
3 |
0% {
|
4 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
5 |
}
|
6 |
|
7 |
-
/* line
|
8 |
100% {
|
9 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
11 |
}
|
12 |
|
13 |
-
@-webkit-keyframes vex-
|
14 |
-
/* line
|
15 |
0% {
|
16 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
17 |
}
|
18 |
|
19 |
-
/* line
|
20 |
100% {
|
21 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
22 |
}
|
23 |
}
|
24 |
|
25 |
-
@-moz-keyframes vex-
|
26 |
-
/* line
|
27 |
0% {
|
28 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
29 |
}
|
30 |
|
31 |
-
/* line
|
32 |
100% {
|
33 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
34 |
}
|
35 |
}
|
36 |
|
37 |
-
@-ms-keyframes vex-
|
38 |
-
/* line
|
39 |
0% {
|
40 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
41 |
}
|
42 |
|
43 |
-
/* line
|
44 |
100% {
|
45 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
46 |
}
|
47 |
}
|
48 |
|
49 |
-
@-o-keyframes vex-
|
50 |
-
/* line
|
51 |
0% {
|
52 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
53 |
}
|
54 |
|
55 |
-
/* line
|
56 |
100% {
|
57 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
58 |
}
|
59 |
}
|
60 |
|
61 |
-
@keyframes vex-
|
62 |
-
/* line
|
63 |
0% {
|
64 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
65 |
}
|
66 |
|
67 |
-
/* line
|
68 |
100% {
|
69 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
70 |
}
|
71 |
}
|
72 |
|
73 |
-
@-webkit-keyframes vex-
|
74 |
-
/* line
|
75 |
0% {
|
76 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
77 |
}
|
78 |
|
79 |
-
/* line
|
80 |
100% {
|
81 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
82 |
}
|
83 |
}
|
84 |
|
85 |
-
@-moz-keyframes vex-
|
86 |
-
/* line
|
87 |
0% {
|
88 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
89 |
}
|
90 |
|
91 |
-
/* line
|
92 |
100% {
|
93 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
94 |
}
|
95 |
}
|
96 |
|
97 |
-
@-ms-keyframes vex-
|
98 |
-
/* line
|
99 |
0% {
|
100 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
101 |
}
|
102 |
|
103 |
-
/* line
|
104 |
100% {
|
105 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
106 |
}
|
107 |
}
|
108 |
|
109 |
-
@-o-keyframes vex-
|
110 |
-
/* line
|
111 |
0% {
|
112 |
opacity: 1;
|
|
|
|
|
|
|
|
|
|
|
113 |
}
|
114 |
|
115 |
-
/* line
|
116 |
100% {
|
117 |
opacity: 0;
|
|
|
|
|
|
|
|
|
|
|
118 |
}
|
119 |
}
|
120 |
|
121 |
-
@keyframes vex-
|
122 |
-
/* line
|
123 |
0% {
|
124 |
-
|
125 |
-
-
|
126 |
-
-
|
127 |
-
-ms-transform: rotate(0deg);
|
128 |
-
-o-transform: rotate(0deg);
|
129 |
}
|
130 |
|
131 |
-
/* line
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
100% {
|
133 |
-
|
134 |
-
-
|
135 |
-
-
|
136 |
-
-ms-transform: rotate(359deg);
|
137 |
-
-o-transform: rotate(359deg);
|
138 |
}
|
139 |
}
|
140 |
|
141 |
-
@-webkit-keyframes vex-
|
142 |
-
/* line
|
143 |
0% {
|
144 |
-
|
145 |
-
-
|
146 |
-
-
|
147 |
-
-ms-transform: rotate(0deg);
|
148 |
-
-o-transform: rotate(0deg);
|
149 |
}
|
150 |
|
151 |
-
/* line
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
100% {
|
153 |
-
|
154 |
-
-
|
155 |
-
-
|
156 |
-
-ms-transform: rotate(359deg);
|
157 |
-
-o-transform: rotate(359deg);
|
158 |
}
|
159 |
}
|
160 |
|
161 |
-
@-moz-keyframes vex-
|
162 |
-
/* line
|
163 |
0% {
|
164 |
-
|
165 |
-
-
|
166 |
-
-
|
167 |
-
-ms-transform: rotate(0deg);
|
168 |
-
-o-transform: rotate(0deg);
|
169 |
}
|
170 |
|
171 |
-
/* line
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
172 |
100% {
|
173 |
-
|
174 |
-
-
|
175 |
-
-
|
176 |
-
-ms-transform: rotate(359deg);
|
177 |
-
-o-transform: rotate(359deg);
|
178 |
}
|
179 |
}
|
180 |
|
181 |
-
@-ms-keyframes vex-
|
182 |
-
/* line
|
183 |
0% {
|
184 |
-
|
185 |
-
-
|
186 |
-
-
|
187 |
-
-ms-transform: rotate(0deg);
|
188 |
-
-o-transform: rotate(0deg);
|
189 |
}
|
190 |
|
191 |
-
/* line
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
192 |
100% {
|
193 |
-
|
194 |
-
-
|
195 |
-
-
|
196 |
-
-ms-transform: rotate(359deg);
|
197 |
-
-o-transform: rotate(359deg);
|
198 |
}
|
199 |
}
|
200 |
|
201 |
-
@-o-keyframes vex-
|
202 |
-
/* line
|
203 |
0% {
|
204 |
-
|
205 |
-
-
|
206 |
-
-
|
207 |
-
-ms-transform: rotate(0deg);
|
208 |
-
-o-transform: rotate(0deg);
|
209 |
}
|
210 |
|
211 |
-
/* line
|
212 |
-
|
213 |
-
|
214 |
-
-
|
215 |
-
-
|
216 |
-
-ms-transform: rotate(359deg);
|
217 |
-
-o-transform: rotate(359deg);
|
218 |
}
|
219 |
-
}
|
220 |
|
221 |
-
/* line
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
|
|
226 |
}
|
227 |
|
228 |
-
/* line
|
229 |
-
.vex {
|
230 |
-
|
231 |
-
|
232 |
-
-webkit-overflow-scrolling: touch;
|
233 |
-
z-index: 1111;
|
234 |
-
top: 0;
|
235 |
-
right: 0;
|
236 |
-
bottom: 0;
|
237 |
-
left: 0;
|
238 |
}
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
-ms-
|
|
|
|
|
245 |
}
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
animation: vex-
|
250 |
-
-
|
251 |
-
-
|
252 |
-
-
|
253 |
-
-o-animation: vex-fadein 0.5s;
|
254 |
-webkit-backface-visibility: hidden;
|
255 |
-
|
256 |
-
|
257 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
258 |
right: 0;
|
259 |
-
|
260 |
-
left: 0;
|
261 |
}
|
262 |
-
/* line
|
263 |
-
.vex.vex-
|
264 |
-
|
265 |
-
-
|
266 |
-
-
|
267 |
-
-
|
268 |
-
-
|
269 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
}
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
-
|
279 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
280 |
background: white;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
281 |
}
|
282 |
-
/* line
|
283 |
-
.vex.vex-
|
284 |
-
|
285 |
-
-
|
286 |
-
-
|
287 |
-
|
288 |
-
-o-animation: vex-fadeout 0.5s;
|
289 |
-
-webkit-backface-visibility: hidden;
|
290 |
}
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
font-family: Arial, sans-serif;
|
295 |
-
content: "\00D7";
|
296 |
}
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
|
|
301 |
}
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
-
|
306 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
307 |
}
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
-
|
|
|
|
|
|
|
316 |
-webkit-backface-visibility: hidden;
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
330 |
}
|
331 |
|
332 |
-
/* line
|
333 |
-
|
334 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
335 |
}
|
336 |
|
337 |
@keyframes vex-slideup {
|
@@ -759,19 +952,22 @@ body.vex-open {
|
|
759 |
}
|
760 |
}
|
761 |
|
762 |
-
/* line 13, ../sass/
|
763 |
-
.vex.vex-theme-bottom-right-corner
|
|
|
764 |
top: auto;
|
765 |
bottom: 0;
|
766 |
right: 0;
|
767 |
overflow: visible;
|
768 |
}
|
769 |
-
/* line
|
770 |
-
.vex.vex-theme-bottom-right-corner .vex-overlay
|
|
|
771 |
display: none;
|
772 |
}
|
773 |
-
/* line
|
774 |
-
.vex.vex-theme-bottom-right-corner.vex-closing .vex-content
|
|
|
775 |
animation: vex-slidedown 0.5s;
|
776 |
-webkit-animation: vex-slidedown 0.5s;
|
777 |
-moz-animation: vex-slidedown 0.5s;
|
@@ -779,8 +975,9 @@ body.vex-open {
|
|
779 |
-o-animation: vex-slidedown 0.5s;
|
780 |
-webkit-backface-visibility: hidden;
|
781 |
}
|
782 |
-
/* line
|
783 |
-
.vex.vex-theme-bottom-right-corner .vex-content
|
|
|
784 |
animation: vex-slideup 0.5s;
|
785 |
-webkit-animation: vex-slideup 0.5s;
|
786 |
-moz-animation: vex-slideup 0.5s;
|
@@ -788,13 +985,9 @@ body.vex-open {
|
|
788 |
-o-animation: vex-slideup 0.5s;
|
789 |
-webkit-backface-visibility: hidden;
|
790 |
}
|
791 |
-
/* line
|
792 |
-
.vex.vex-theme-bottom-right-corner .vex-content
|
793 |
-
|
794 |
-
-moz-border-radius: 5px 0 0 0;
|
795 |
-
-ms-border-radius: 5px 0 0 0;
|
796 |
-
-o-border-radius: 5px 0 0 0;
|
797 |
-
border-radius: 5px 0 0 0;
|
798 |
font-family: "Helvetica Neue", sans-serif;
|
799 |
background: #f0f0f0;
|
800 |
color: #444444;
|
@@ -805,15 +998,23 @@ body.vex-open {
|
|
805 |
line-height: 1.5em;
|
806 |
position: fixed;
|
807 |
bottom: 0;
|
808 |
-
right: 0;
|
809 |
-
left: auto;
|
810 |
}
|
811 |
-
/* line
|
812 |
-
.vex.vex-theme-bottom-right-corner .vex-content h1, .vex.vex-theme-bottom-right-corner .vex-content h2, .vex.vex-theme-bottom-right-corner .vex-content h3, .vex.vex-theme-bottom-right-corner .vex-content h4, .vex.vex-theme-bottom-right-corner .vex-content h5, .vex.vex-theme-bottom-right-corner .vex-content h6, .vex.vex-theme-bottom-right-corner .vex-content p, .vex.vex-theme-bottom-right-corner .vex-content ul, .vex.vex-theme-bottom-right-corner .vex-content li
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
813 |
color: inherit;
|
814 |
}
|
815 |
-
/* line
|
816 |
-
.vex.vex-theme-bottom-right-corner .vex-close
|
|
|
817 |
-webkit-border-radius: 5px;
|
818 |
-moz-border-radius: 5px;
|
819 |
-ms-border-radius: 5px;
|
@@ -824,8 +1025,9 @@ body.vex-open {
|
|
824 |
right: 0;
|
825 |
cursor: pointer;
|
826 |
}
|
827 |
-
/* line
|
828 |
-
.vex.vex-theme-bottom-right-corner .vex-close:before
|
|
|
829 |
-webkit-border-radius: 3px;
|
830 |
-moz-border-radius: 3px;
|
831 |
-ms-border-radius: 3px;
|
@@ -844,21 +1046,39 @@ body.vex-open {
|
|
844 |
color: #bbbbbb;
|
845 |
background: transparent;
|
846 |
}
|
847 |
-
/* line
|
848 |
-
.vex.vex-theme-bottom-right-corner .vex-close:hover:before, .vex.vex-theme-bottom-right-corner .vex-close:active:before
|
|
|
|
|
849 |
color: #777777;
|
850 |
background: #e0e0e0;
|
851 |
}
|
852 |
-
/* line
|
853 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-message
|
|
|
854 |
margin-bottom: 0.5em;
|
855 |
}
|
856 |
-
/* line
|
857 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input
|
|
|
858 |
margin-bottom: 1em;
|
859 |
}
|
860 |
-
/* line
|
861 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="week"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
862 |
-webkit-border-radius: 3px;
|
863 |
-moz-border-radius: 3px;
|
864 |
-ms-border-radius: 3px;
|
@@ -874,77 +1094,63 @@ body.vex-open {
|
|
874 |
min-height: 2.5em;
|
875 |
margin: 0 0 0.25em;
|
876 |
}
|
877 |
-
/* line
|
878 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="week"]:focus
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
879 |
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
|
880 |
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
|
881 |
box-shadow: inset 0 0 0 2px #8dbdf1;
|
882 |
outline: none;
|
883 |
}
|
884 |
-
/* line
|
885 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-buttons
|
|
|
886 |
*zoom: 1;
|
887 |
}
|
888 |
-
/* line 38,
|
889 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-buttons:after
|
|
|
890 |
content: "";
|
891 |
display: table;
|
892 |
clear: both;
|
893 |
}
|
894 |
-
|
895 |
-
|
896 |
-
|
897 |
-
-
|
898 |
-
-
|
899 |
-
-
|
900 |
-
border-radius:
|
901 |
-
border: 0;
|
902 |
-
|
903 |
-
|
904 |
-
font-family: inherit;
|
905 |
-
text-transform: uppercase;
|
906 |
-
letter-spacing: 0.1em;
|
907 |
-
font-size: 0.8em;
|
908 |
-
line-height: 1em;
|
909 |
-
padding: 0.75em 2em;
|
910 |
-
}
|
911 |
-
/* line 111, ../sass/vex-theme-bottom-right-corner.sass */
|
912 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-button.vex-last {
|
913 |
-
margin-left: 0;
|
914 |
-
}
|
915 |
-
/* line 114, ../sass/vex-theme-bottom-right-corner.sass */
|
916 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-button:focus {
|
917 |
-
animation: vex-pulse 1.1s infinite;
|
918 |
-
-webkit-animation: vex-pulse 1.1s infinite;
|
919 |
-
-moz-animation: vex-pulse 1.1s infinite;
|
920 |
-
-ms-animation: vex-pulse 1.1s infinite;
|
921 |
-
-o-animation: vex-pulse 1.1s infinite;
|
922 |
-
-webkit-backface-visibility: hidden;
|
923 |
-
outline: none;
|
924 |
-
}
|
925 |
-
@media (max-width: 568px) {
|
926 |
-
/* line 114, ../sass/vex-theme-bottom-right-corner.sass */
|
927 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-button:focus {
|
928 |
-
animation: none;
|
929 |
-
-webkit-animation: none;
|
930 |
-
-moz-animation: none;
|
931 |
-
-ms-animation: none;
|
932 |
-
-o-animation: none;
|
933 |
-
-webkit-backface-visibility: hidden;
|
934 |
-
}
|
935 |
-
}
|
936 |
-
/* line 123, ../sass/vex-theme-bottom-right-corner.sass */
|
937 |
-
.vex.vex-theme-bottom-right-corner .vex-dialog-button.vex-dialog-button-primary {
|
938 |
-
background: #3288e6;
|
939 |
-
color: white;
|
940 |
}
|
941 |
-
|
942 |
-
|
943 |
-
|
944 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
945 |
}
|
946 |
|
947 |
-
/* line
|
948 |
.vex-loading-spinner.vex-theme-bottom-right-corner {
|
949 |
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
950 |
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
@@ -961,16 +1167,1064 @@ body.vex-open {
|
|
961 |
bottom: auto;
|
962 |
}
|
963 |
|
964 |
-
|
965 |
-
|
966 |
-
|
967 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
968 |
|
969 |
-
.
|
970 |
-
|
971 |
-
|
972 |
-
-
|
973 |
-
-
|
974 |
-
-
|
975 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
976 |
}
|
1 |
+
@keyframes vex-flyin {
|
2 |
+
/* line 25, ../sass/_keyframes.sass */
|
3 |
0% {
|
4 |
opacity: 0;
|
5 |
+
transform: translateY(-40px);
|
6 |
+
-webkit-transform: translateY(-40px);
|
7 |
+
-moz-transform: translateY(-40px);
|
8 |
+
-ms-transform: translateY(-40px);
|
9 |
+
-o-transform: translateY(-40px);
|
10 |
}
|
11 |
|
12 |
+
/* line 28, ../sass/_keyframes.sass */
|
13 |
100% {
|
14 |
opacity: 1;
|
15 |
+
transform: translateY(0);
|
16 |
+
-webkit-transform: translateY(0);
|
17 |
+
-moz-transform: translateY(0);
|
18 |
+
-ms-transform: translateY(0);
|
19 |
+
-o-transform: translateY(0);
|
20 |
}
|
21 |
}
|
22 |
|
23 |
+
@-webkit-keyframes vex-flyin {
|
24 |
+
/* line 25, ../sass/_keyframes.sass */
|
25 |
0% {
|
26 |
opacity: 0;
|
27 |
+
transform: translateY(-40px);
|
28 |
+
-webkit-transform: translateY(-40px);
|
29 |
+
-moz-transform: translateY(-40px);
|
30 |
+
-ms-transform: translateY(-40px);
|
31 |
+
-o-transform: translateY(-40px);
|
32 |
}
|
33 |
|
34 |
+
/* line 28, ../sass/_keyframes.sass */
|
35 |
100% {
|
36 |
opacity: 1;
|
37 |
+
transform: translateY(0);
|
38 |
+
-webkit-transform: translateY(0);
|
39 |
+
-moz-transform: translateY(0);
|
40 |
+
-ms-transform: translateY(0);
|
41 |
+
-o-transform: translateY(0);
|
42 |
}
|
43 |
}
|
44 |
|
45 |
+
@-moz-keyframes vex-flyin {
|
46 |
+
/* line 25, ../sass/_keyframes.sass */
|
47 |
0% {
|
48 |
opacity: 0;
|
49 |
+
transform: translateY(-40px);
|
50 |
+
-webkit-transform: translateY(-40px);
|
51 |
+
-moz-transform: translateY(-40px);
|
52 |
+
-ms-transform: translateY(-40px);
|
53 |
+
-o-transform: translateY(-40px);
|
54 |
}
|
55 |
|
56 |
+
/* line 28, ../sass/_keyframes.sass */
|
57 |
100% {
|
58 |
opacity: 1;
|
59 |
+
transform: translateY(0);
|
60 |
+
-webkit-transform: translateY(0);
|
61 |
+
-moz-transform: translateY(0);
|
62 |
+
-ms-transform: translateY(0);
|
63 |
+
-o-transform: translateY(0);
|
64 |
}
|
65 |
}
|
66 |
|
67 |
+
@-ms-keyframes vex-flyin {
|
68 |
+
/* line 25, ../sass/_keyframes.sass */
|
69 |
0% {
|
70 |
opacity: 0;
|
71 |
+
transform: translateY(-40px);
|
72 |
+
-webkit-transform: translateY(-40px);
|
73 |
+
-moz-transform: translateY(-40px);
|
74 |
+
-ms-transform: translateY(-40px);
|
75 |
+
-o-transform: translateY(-40px);
|
76 |
}
|
77 |
|
78 |
+
/* line 28, ../sass/_keyframes.sass */
|
79 |
100% {
|
80 |
opacity: 1;
|
81 |
+
transform: translateY(0);
|
82 |
+
-webkit-transform: translateY(0);
|
83 |
+
-moz-transform: translateY(0);
|
84 |
+
-ms-transform: translateY(0);
|
85 |
+
-o-transform: translateY(0);
|
86 |
}
|
87 |
}
|
88 |
|
89 |
+
@-o-keyframes vex-flyin {
|
90 |
+
/* line 25, ../sass/_keyframes.sass */
|
91 |
0% {
|
92 |
opacity: 0;
|
93 |
+
transform: translateY(-40px);
|
94 |
+
-webkit-transform: translateY(-40px);
|
95 |
+
-moz-transform: translateY(-40px);
|
96 |
+
-ms-transform: translateY(-40px);
|
97 |
+
-o-transform: translateY(-40px);
|
98 |
}
|
99 |
|
100 |
+
/* line 28, ../sass/_keyframes.sass */
|
101 |
100% {
|
102 |
opacity: 1;
|
103 |
+
transform: translateY(0);
|
104 |
+
-webkit-transform: translateY(0);
|
105 |
+
-moz-transform: translateY(0);
|
106 |
+
-ms-transform: translateY(0);
|
107 |
+
-o-transform: translateY(0);
|
108 |
}
|
109 |
}
|
110 |
|
111 |
+
@keyframes vex-flyout {
|
112 |
+
/* line 34, ../sass/_keyframes.sass */
|
113 |
0% {
|
114 |
opacity: 1;
|
115 |
+
transform: translateY(0);
|
116 |
+
-webkit-transform: translateY(0);
|
117 |
+
-moz-transform: translateY(0);
|
118 |
+
-ms-transform: translateY(0);
|
119 |
+
-o-transform: translateY(0);
|
120 |
}
|
121 |
|
122 |
+
/* line 37, ../sass/_keyframes.sass */
|
123 |
100% {
|
124 |
opacity: 0;
|
125 |
+
transform: translateY(-40px);
|
126 |
+
-webkit-transform: translateY(-40px);
|
127 |
+
-moz-transform: translateY(-40px);
|
128 |
+
-ms-transform: translateY(-40px);
|
129 |
+
-o-transform: translateY(-40px);
|
130 |
}
|
131 |
}
|
132 |
|
133 |
+
@-webkit-keyframes vex-flyout {
|
134 |
+
/* line 34, ../sass/_keyframes.sass */
|
135 |
0% {
|
136 |
opacity: 1;
|
137 |
+
transform: translateY(0);
|
138 |
+
-webkit-transform: translateY(0);
|
139 |
+
-moz-transform: translateY(0);
|
140 |
+
-ms-transform: translateY(0);
|
141 |
+
-o-transform: translateY(0);
|
142 |
}
|
143 |
|
144 |
+
/* line 37, ../sass/_keyframes.sass */
|
145 |
100% {
|
146 |
opacity: 0;
|
147 |
+
transform: translateY(-40px);
|
148 |
+
-webkit-transform: translateY(-40px);
|
149 |
+
-moz-transform: translateY(-40px);
|
150 |
+
-ms-transform: translateY(-40px);
|
151 |
+
-o-transform: translateY(-40px);
|
152 |
}
|
153 |
}
|
154 |
|
155 |
+
@-moz-keyframes vex-flyout {
|
156 |
+
/* line 34, ../sass/_keyframes.sass */
|
157 |
0% {
|
158 |
opacity: 1;
|
159 |
+
transform: translateY(0);
|
160 |
+
-webkit-transform: translateY(0);
|
161 |
+
-moz-transform: translateY(0);
|
162 |
+
-ms-transform: translateY(0);
|
163 |
+
-o-transform: translateY(0);
|
164 |
}
|
165 |
|
166 |
+
/* line 37, ../sass/_keyframes.sass */
|
167 |
100% {
|
168 |
opacity: 0;
|
169 |
+
transform: translateY(-40px);
|
170 |
+
-webkit-transform: translateY(-40px);
|
171 |
+
-moz-transform: translateY(-40px);
|
172 |
+
-ms-transform: translateY(-40px);
|
173 |
+
-o-transform: translateY(-40px);
|
174 |
}
|
175 |
}
|
176 |
|
177 |
+
@-ms-keyframes vex-flyout {
|
178 |
+
/* line 34, ../sass/_keyframes.sass */
|
179 |
0% {
|
180 |
opacity: 1;
|
181 |
+
transform: translateY(0);
|
182 |
+
-webkit-transform: translateY(0);
|
183 |
+
-moz-transform: translateY(0);
|
184 |
+
-ms-transform: translateY(0);
|
185 |
+
-o-transform: translateY(0);
|
186 |
}
|
187 |
|
188 |
+
/* line 37, ../sass/_keyframes.sass */
|
189 |
100% {
|
190 |
opacity: 0;
|
191 |
+
transform: translateY(-40px);
|
192 |
+
-webkit-transform: translateY(-40px);
|
193 |
+
-moz-transform: translateY(-40px);
|
194 |
+
-ms-transform: translateY(-40px);
|
195 |
+
-o-transform: translateY(-40px);
|
196 |
}
|
197 |
}
|
198 |
|
199 |
+
@-o-keyframes vex-flyout {
|
200 |
+
/* line 34, ../sass/_keyframes.sass */
|
201 |
0% {
|
202 |
opacity: 1;
|
203 |
+
transform: translateY(0);
|
204 |
+
-webkit-transform: translateY(0);
|
205 |
+
-moz-transform: translateY(0);
|
206 |
+
-ms-transform: translateY(0);
|
207 |
+
-o-transform: translateY(0);
|
208 |
}
|
209 |
|
210 |
+
/* line 37, ../sass/_keyframes.sass */
|
211 |
100% {
|
212 |
opacity: 0;
|
213 |
+
transform: translateY(-40px);
|
214 |
+
-webkit-transform: translateY(-40px);
|
215 |
+
-moz-transform: translateY(-40px);
|
216 |
+
-ms-transform: translateY(-40px);
|
217 |
+
-o-transform: translateY(-40px);
|
218 |
}
|
219 |
}
|
220 |
|
221 |
+
@keyframes vex-pulse {
|
222 |
+
/* line 136, ../sass/_keyframes.sass */
|
223 |
0% {
|
224 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
225 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
226 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
227 |
}
|
228 |
|
229 |
+
/* line 138, ../sass/_keyframes.sass */
|
230 |
+
70% {
|
231 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
232 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
233 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
234 |
+
}
|
235 |
+
|
236 |
+
/* line 140, ../sass/_keyframes.sass */
|
237 |
100% {
|
238 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
239 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
240 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
241 |
}
|
242 |
}
|
243 |
|
244 |
+
@-webkit-keyframes vex-pulse {
|
245 |
+
/* line 136, ../sass/_keyframes.sass */
|
246 |
0% {
|
247 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
248 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
249 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
250 |
}
|
251 |
|
252 |
+
/* line 138, ../sass/_keyframes.sass */
|
253 |
+
70% {
|
254 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
255 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
256 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
257 |
+
}
|
258 |
+
|
259 |
+
/* line 140, ../sass/_keyframes.sass */
|
260 |
100% {
|
261 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
262 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
263 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
264 |
}
|
265 |
}
|
266 |
|
267 |
+
@-moz-keyframes vex-pulse {
|
268 |
+
/* line 136, ../sass/_keyframes.sass */
|
269 |
0% {
|
270 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
271 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
272 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
273 |
}
|
274 |
|
275 |
+
/* line 138, ../sass/_keyframes.sass */
|
276 |
+
70% {
|
277 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
278 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
279 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
280 |
+
}
|
281 |
+
|
282 |
+
/* line 140, ../sass/_keyframes.sass */
|
283 |
100% {
|
284 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
285 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
286 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
287 |
}
|
288 |
}
|
289 |
|
290 |
+
@-ms-keyframes vex-pulse {
|
291 |
+
/* line 136, ../sass/_keyframes.sass */
|
292 |
0% {
|
293 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
294 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
295 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
296 |
}
|
297 |
|
298 |
+
/* line 138, ../sass/_keyframes.sass */
|
299 |
+
70% {
|
300 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
301 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
302 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
303 |
+
}
|
304 |
+
|
305 |
+
/* line 140, ../sass/_keyframes.sass */
|
306 |
100% {
|
307 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
308 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
309 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
310 |
}
|
311 |
}
|
312 |
|
313 |
+
@-o-keyframes vex-pulse {
|
314 |
+
/* line 136, ../sass/_keyframes.sass */
|
315 |
0% {
|
316 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
317 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
318 |
+
box-shadow: inset 0 0 0 300px transparent;
|
|
|
|
|
319 |
}
|
320 |
|
321 |
+
/* line 138, ../sass/_keyframes.sass */
|
322 |
+
70% {
|
323 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
324 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
325 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
|
|
|
|
326 |
}
|
|
|
327 |
|
328 |
+
/* line 140, ../sass/_keyframes.sass */
|
329 |
+
100% {
|
330 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
331 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
332 |
+
box-shadow: inset 0 0 0 300px transparent;
|
333 |
+
}
|
334 |
}
|
335 |
|
336 |
+
/* line 13, ../sass/_vex-theme-default.sass */
|
337 |
+
.vex.vex-theme-default {
|
338 |
+
padding-top: 160px;
|
339 |
+
padding-bottom: 160px;
|
|
|
|
|
|
|
|
|
|
|
|
|
340 |
}
|
341 |
+
/* line 17, ../sass/_vex-theme-default.sass */
|
342 |
+
.vex.vex-theme-default.vex-closing .vex-content {
|
343 |
+
animation: vex-flyout 0.5s;
|
344 |
+
-webkit-animation: vex-flyout 0.5s;
|
345 |
+
-moz-animation: vex-flyout 0.5s;
|
346 |
+
-ms-animation: vex-flyout 0.5s;
|
347 |
+
-o-animation: vex-flyout 0.5s;
|
348 |
+
-webkit-backface-visibility: hidden;
|
349 |
}
|
350 |
+
/* line 20, ../sass/_vex-theme-default.sass */
|
351 |
+
.vex.vex-theme-default .vex-content {
|
352 |
+
animation: vex-flyin 0.5s;
|
353 |
+
-webkit-animation: vex-flyin 0.5s;
|
354 |
+
-moz-animation: vex-flyin 0.5s;
|
355 |
+
-ms-animation: vex-flyin 0.5s;
|
356 |
+
-o-animation: vex-flyin 0.5s;
|
|
|
357 |
-webkit-backface-visibility: hidden;
|
358 |
+
}
|
359 |
+
/* line 23, ../sass/_vex-theme-default.sass */
|
360 |
+
.vex.vex-theme-default .vex-content {
|
361 |
+
-webkit-border-radius: 5px;
|
362 |
+
-moz-border-radius: 5px;
|
363 |
+
-ms-border-radius: 5px;
|
364 |
+
-o-border-radius: 5px;
|
365 |
+
border-radius: 5px;
|
366 |
+
font-family: "Helvetica Neue", sans-serif;
|
367 |
+
background: #f0f0f0;
|
368 |
+
color: #444444;
|
369 |
+
padding: 1em;
|
370 |
+
position: relative;
|
371 |
+
margin: 0 auto;
|
372 |
+
max-width: 100%;
|
373 |
+
width: 450px;
|
374 |
+
font-size: 1.1em;
|
375 |
+
line-height: 1.5em;
|
376 |
+
}
|
377 |
+
/* line 36, ../sass/_vex-theme-default.sass */
|
378 |
+
.vex.vex-theme-default .vex-content h1, .vex.vex-theme-default .vex-content h2, .vex.vex-theme-default .vex-content h3, .vex.vex-theme-default .vex-content h4, .vex.vex-theme-default .vex-content h5, .vex.vex-theme-default .vex-content h6, .vex.vex-theme-default .vex-content p, .vex.vex-theme-default .vex-content ul, .vex.vex-theme-default .vex-content li {
|
379 |
+
color: inherit;
|
380 |
+
}
|
381 |
+
/* line 39, ../sass/_vex-theme-default.sass */
|
382 |
+
.vex.vex-theme-default .vex-close {
|
383 |
+
-webkit-border-radius: 5px;
|
384 |
+
-moz-border-radius: 5px;
|
385 |
+
-ms-border-radius: 5px;
|
386 |
+
-o-border-radius: 5px;
|
387 |
+
border-radius: 5px;
|
388 |
+
position: absolute;
|
389 |
+
top: 0;
|
390 |
right: 0;
|
391 |
+
cursor: pointer;
|
|
|
392 |
}
|
393 |
+
/* line 46, ../sass/_vex-theme-default.sass */
|
394 |
+
.vex.vex-theme-default .vex-close:before {
|
395 |
+
-webkit-border-radius: 3px;
|
396 |
+
-moz-border-radius: 3px;
|
397 |
+
-ms-border-radius: 3px;
|
398 |
+
-o-border-radius: 3px;
|
399 |
+
border-radius: 3px;
|
400 |
+
position: absolute;
|
401 |
+
content: "\00D7";
|
402 |
+
font-size: 26px;
|
403 |
+
font-weight: normal;
|
404 |
+
line-height: 31px;
|
405 |
+
height: 30px;
|
406 |
+
width: 30px;
|
407 |
+
text-align: center;
|
408 |
+
top: 3px;
|
409 |
+
right: 3px;
|
410 |
+
color: #bbbbbb;
|
411 |
+
background: transparent;
|
412 |
}
|
413 |
+
/* line 61, ../sass/_vex-theme-default.sass */
|
414 |
+
.vex.vex-theme-default .vex-close:hover:before, .vex.vex-theme-default .vex-close:active:before {
|
415 |
+
color: #777777;
|
416 |
+
background: #e0e0e0;
|
417 |
+
}
|
418 |
+
/* line 67, ../sass/_vex-theme-default.sass */
|
419 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-message {
|
420 |
+
margin-bottom: 0.5em;
|
421 |
+
}
|
422 |
+
/* line 70, ../sass/_vex-theme-default.sass */
|
423 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input {
|
424 |
+
margin-bottom: 1em;
|
425 |
+
}
|
426 |
+
/* line 73, ../sass/_vex-theme-default.sass */
|
427 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"] {
|
428 |
+
-webkit-border-radius: 3px;
|
429 |
+
-moz-border-radius: 3px;
|
430 |
+
-ms-border-radius: 3px;
|
431 |
+
-o-border-radius: 3px;
|
432 |
+
border-radius: 3px;
|
433 |
background: white;
|
434 |
+
width: 100%;
|
435 |
+
padding: 0.25em 0.67em;
|
436 |
+
border: 0;
|
437 |
+
font-family: inherit;
|
438 |
+
font-weight: inherit;
|
439 |
+
font-size: inherit;
|
440 |
+
min-height: 2.5em;
|
441 |
+
margin: 0 0 0.25em;
|
442 |
}
|
443 |
+
/* line 85, ../sass/_vex-theme-default.sass */
|
444 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
|
445 |
+
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
|
446 |
+
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
|
447 |
+
box-shadow: inset 0 0 0 2px #8dbdf1;
|
448 |
+
outline: none;
|
|
|
|
|
449 |
}
|
450 |
+
/* line 89, ../sass/_vex-theme-default.sass */
|
451 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-buttons {
|
452 |
+
*zoom: 1;
|
|
|
|
|
453 |
}
|
454 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
455 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-buttons:after {
|
456 |
+
content: "";
|
457 |
+
display: table;
|
458 |
+
clear: both;
|
459 |
}
|
460 |
+
/* line 92, ../sass/_vex-theme-default.sass */
|
461 |
+
.vex.vex-theme-default .vex-dialog-button {
|
462 |
+
-webkit-border-radius: 3px;
|
463 |
+
-moz-border-radius: 3px;
|
464 |
+
-ms-border-radius: 3px;
|
465 |
+
-o-border-radius: 3px;
|
466 |
+
border-radius: 3px;
|
467 |
+
border: 0;
|
468 |
+
float: right;
|
469 |
+
margin: 0 0 0 0.5em;
|
470 |
+
font-family: inherit;
|
471 |
+
text-transform: uppercase;
|
472 |
+
letter-spacing: 0.1em;
|
473 |
+
font-size: 0.8em;
|
474 |
+
line-height: 1em;
|
475 |
+
padding: 0.75em 2em;
|
476 |
}
|
477 |
+
/* line 104, ../sass/_vex-theme-default.sass */
|
478 |
+
.vex.vex-theme-default .vex-dialog-button.vex-last {
|
479 |
+
margin-left: 0;
|
480 |
+
}
|
481 |
+
/* line 107, ../sass/_vex-theme-default.sass */
|
482 |
+
.vex.vex-theme-default .vex-dialog-button:focus {
|
483 |
+
animation: vex-pulse 1.1s infinite;
|
484 |
+
-webkit-animation: vex-pulse 1.1s infinite;
|
485 |
+
-moz-animation: vex-pulse 1.1s infinite;
|
486 |
+
-ms-animation: vex-pulse 1.1s infinite;
|
487 |
+
-o-animation: vex-pulse 1.1s infinite;
|
488 |
-webkit-backface-visibility: hidden;
|
489 |
+
outline: none;
|
490 |
+
}
|
491 |
+
@media (max-width: 568px) {
|
492 |
+
/* line 107, ../sass/_vex-theme-default.sass */
|
493 |
+
.vex.vex-theme-default .vex-dialog-button:focus {
|
494 |
+
animation: none;
|
495 |
+
-webkit-animation: none;
|
496 |
+
-moz-animation: none;
|
497 |
+
-ms-animation: none;
|
498 |
+
-o-animation: none;
|
499 |
+
-webkit-backface-visibility: hidden;
|
500 |
+
}
|
501 |
+
}
|
502 |
+
/* line 116, ../sass/_vex-theme-default.sass */
|
503 |
+
.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-primary {
|
504 |
+
background: #3288e6;
|
505 |
+
color: white;
|
506 |
+
}
|
507 |
+
/* line 120, ../sass/_vex-theme-default.sass */
|
508 |
+
.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-secondary {
|
509 |
+
background: #e0e0e0;
|
510 |
+
color: #777777;
|
511 |
}
|
512 |
|
513 |
+
/* line 124, ../sass/_vex-theme-default.sass */
|
514 |
+
.vex-loading-spinner.vex-theme-default {
|
515 |
+
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
516 |
+
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
517 |
+
box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
518 |
+
-webkit-border-radius: 100%;
|
519 |
+
-moz-border-radius: 100%;
|
520 |
+
-ms-border-radius: 100%;
|
521 |
+
-o-border-radius: 100%;
|
522 |
+
border-radius: 100%;
|
523 |
+
background: #f0f0f0;
|
524 |
+
border: 0.2em solid transparent;
|
525 |
+
border-top-color: #bbbbbb;
|
526 |
+
top: -1.1em;
|
527 |
+
bottom: auto;
|
528 |
}
|
529 |
|
530 |
@keyframes vex-slideup {
|
952 |
}
|
953 |
}
|
954 |
|
955 |
+
/* line 13, ../sass/_vex-theme-bottom-right-corner.sass */
|
956 |
+
.vex.vex-theme-bottom-right-corner,
|
957 |
+
.vex.vex-theme-bottom-left-corner {
|
958 |
top: auto;
|
959 |
bottom: 0;
|
960 |
right: 0;
|
961 |
overflow: visible;
|
962 |
}
|
963 |
+
/* line 20, ../sass/_vex-theme-bottom-right-corner.sass */
|
964 |
+
.vex.vex-theme-bottom-right-corner .vex-overlay,
|
965 |
+
.vex.vex-theme-bottom-left-corner .vex-overlay {
|
966 |
display: none;
|
967 |
}
|
968 |
+
/* line 23, ../sass/_vex-theme-bottom-right-corner.sass */
|
969 |
+
.vex.vex-theme-bottom-right-corner.vex-closing .vex-content,
|
970 |
+
.vex.vex-theme-bottom-left-corner.vex-closing .vex-content {
|
971 |
animation: vex-slidedown 0.5s;
|
972 |
-webkit-animation: vex-slidedown 0.5s;
|
973 |
-moz-animation: vex-slidedown 0.5s;
|
975 |
-o-animation: vex-slidedown 0.5s;
|
976 |
-webkit-backface-visibility: hidden;
|
977 |
}
|
978 |
+
/* line 26, ../sass/_vex-theme-bottom-right-corner.sass */
|
979 |
+
.vex.vex-theme-bottom-right-corner .vex-content,
|
980 |
+
.vex.vex-theme-bottom-left-corner .vex-content {
|
981 |
animation: vex-slideup 0.5s;
|
982 |
-webkit-animation: vex-slideup 0.5s;
|
983 |
-moz-animation: vex-slideup 0.5s;
|
985 |
-o-animation: vex-slideup 0.5s;
|
986 |
-webkit-backface-visibility: hidden;
|
987 |
}
|
988 |
+
/* line 29, ../sass/_vex-theme-bottom-right-corner.sass */
|
989 |
+
.vex.vex-theme-bottom-right-corner .vex-content,
|
990 |
+
.vex.vex-theme-bottom-left-corner .vex-content {
|
|
|
|
|
|
|
|
|
991 |
font-family: "Helvetica Neue", sans-serif;
|
992 |
background: #f0f0f0;
|
993 |
color: #444444;
|
998 |
line-height: 1.5em;
|
999 |
position: fixed;
|
1000 |
bottom: 0;
|
|
|
|
|
1001 |
}
|
1002 |
+
/* line 41, ../sass/_vex-theme-bottom-right-corner.sass */
|
1003 |
+
.vex.vex-theme-bottom-right-corner .vex-content h1, .vex.vex-theme-bottom-right-corner .vex-content h2, .vex.vex-theme-bottom-right-corner .vex-content h3, .vex.vex-theme-bottom-right-corner .vex-content h4, .vex.vex-theme-bottom-right-corner .vex-content h5, .vex.vex-theme-bottom-right-corner .vex-content h6, .vex.vex-theme-bottom-right-corner .vex-content p, .vex.vex-theme-bottom-right-corner .vex-content ul, .vex.vex-theme-bottom-right-corner .vex-content li,
|
1004 |
+
.vex.vex-theme-bottom-left-corner .vex-content h1,
|
1005 |
+
.vex.vex-theme-bottom-left-corner .vex-content h2,
|
1006 |
+
.vex.vex-theme-bottom-left-corner .vex-content h3,
|
1007 |
+
.vex.vex-theme-bottom-left-corner .vex-content h4,
|
1008 |
+
.vex.vex-theme-bottom-left-corner .vex-content h5,
|
1009 |
+
.vex.vex-theme-bottom-left-corner .vex-content h6,
|
1010 |
+
.vex.vex-theme-bottom-left-corner .vex-content p,
|
1011 |
+
.vex.vex-theme-bottom-left-corner .vex-content ul,
|
1012 |
+
.vex.vex-theme-bottom-left-corner .vex-content li {
|
1013 |
color: inherit;
|
1014 |
}
|
1015 |
+
/* line 44, ../sass/_vex-theme-bottom-right-corner.sass */
|
1016 |
+
.vex.vex-theme-bottom-right-corner .vex-close,
|
1017 |
+
.vex.vex-theme-bottom-left-corner .vex-close {
|
1018 |
-webkit-border-radius: 5px;
|
1019 |
-moz-border-radius: 5px;
|
1020 |
-ms-border-radius: 5px;
|
1025 |
right: 0;
|
1026 |
cursor: pointer;
|
1027 |
}
|
1028 |
+
/* line 51, ../sass/_vex-theme-bottom-right-corner.sass */
|
1029 |
+
.vex.vex-theme-bottom-right-corner .vex-close:before,
|
1030 |
+
.vex.vex-theme-bottom-left-corner .vex-close:before {
|
1031 |
-webkit-border-radius: 3px;
|
1032 |
-moz-border-radius: 3px;
|
1033 |
-ms-border-radius: 3px;
|
1046 |
color: #bbbbbb;
|
1047 |
background: transparent;
|
1048 |
}
|
1049 |
+
/* line 66, ../sass/_vex-theme-bottom-right-corner.sass */
|
1050 |
+
.vex.vex-theme-bottom-right-corner .vex-close:hover:before, .vex.vex-theme-bottom-right-corner .vex-close:active:before,
|
1051 |
+
.vex.vex-theme-bottom-left-corner .vex-close:hover:before,
|
1052 |
+
.vex.vex-theme-bottom-left-corner .vex-close:active:before {
|
1053 |
color: #777777;
|
1054 |
background: #e0e0e0;
|
1055 |
}
|
1056 |
+
/* line 72, ../sass/_vex-theme-bottom-right-corner.sass */
|
1057 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-message,
|
1058 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-message {
|
1059 |
margin-bottom: 0.5em;
|
1060 |
}
|
1061 |
+
/* line 75, ../sass/_vex-theme-bottom-right-corner.sass */
|
1062 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input,
|
1063 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input {
|
1064 |
margin-bottom: 1em;
|
1065 |
}
|
1066 |
+
/* line 78, ../sass/_vex-theme-bottom-right-corner.sass */
|
1067 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="week"],
|
1068 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input textarea,
|
1069 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="date"],
|
1070 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime"],
|
1071 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"],
|
1072 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="email"],
|
1073 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="month"],
|
1074 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="number"],
|
1075 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="password"],
|
1076 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="search"],
|
1077 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="tel"],
|
1078 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="text"],
|
1079 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="time"],
|
1080 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="url"],
|
1081 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="week"] {
|
1082 |
-webkit-border-radius: 3px;
|
1083 |
-moz-border-radius: 3px;
|
1084 |
-ms-border-radius: 3px;
|
1094 |
min-height: 2.5em;
|
1095 |
margin: 0 0 0.25em;
|
1096 |
}
|
1097 |
+
/* line 90, ../sass/_vex-theme-bottom-right-corner.sass */
|
1098 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="week"]:focus,
|
1099 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input textarea:focus,
|
1100 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="date"]:focus,
|
1101 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus,
|
1102 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus,
|
1103 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="email"]:focus,
|
1104 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="month"]:focus,
|
1105 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="number"]:focus,
|
1106 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="password"]:focus,
|
1107 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="search"]:focus,
|
1108 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="tel"]:focus,
|
1109 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="text"]:focus,
|
1110 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="time"]:focus,
|
1111 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="url"]:focus,
|
1112 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
|
1113 |
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1114 |
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1115 |
box-shadow: inset 0 0 0 2px #8dbdf1;
|
1116 |
outline: none;
|
1117 |
}
|
1118 |
+
/* line 94, ../sass/_vex-theme-bottom-right-corner.sass */
|
1119 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-buttons,
|
1120 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-buttons {
|
1121 |
*zoom: 1;
|
1122 |
}
|
1123 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
1124 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-buttons:after,
|
1125 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-buttons:after {
|
1126 |
content: "";
|
1127 |
display: table;
|
1128 |
clear: both;
|
1129 |
}
|
1130 |
+
|
1131 |
+
/* line 99, ../sass/_vex-theme-bottom-right-corner.sass */
|
1132 |
+
.vex.vex-theme-bottom-right-corner .vex-content {
|
1133 |
+
-webkit-border-radius: 5px 0 0 0;
|
1134 |
+
-moz-border-radius: 5px 0 0 0;
|
1135 |
+
-ms-border-radius: 5px 0 0 0;
|
1136 |
+
-o-border-radius: 5px 0 0 0;
|
1137 |
+
border-radius: 5px 0 0 0;
|
1138 |
+
right: 0;
|
1139 |
+
left: auto;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1140 |
}
|
1141 |
+
|
1142 |
+
/* line 106, ../sass/_vex-theme-bottom-right-corner.sass */
|
1143 |
+
.vex.vex-theme-bottom-left-corner .vex-content {
|
1144 |
+
-webkit-border-radius: 0 5px 0 0;
|
1145 |
+
-moz-border-radius: 0 5px 0 0;
|
1146 |
+
-ms-border-radius: 0 5px 0 0;
|
1147 |
+
-o-border-radius: 0 5px 0 0;
|
1148 |
+
border-radius: 0 5px 0 0;
|
1149 |
+
left: 0;
|
1150 |
+
right: auto;
|
1151 |
}
|
1152 |
|
1153 |
+
/* line 111, ../sass/_vex-theme-bottom-right-corner.sass */
|
1154 |
.vex-loading-spinner.vex-theme-bottom-right-corner {
|
1155 |
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1156 |
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1167 |
bottom: auto;
|
1168 |
}
|
1169 |
|
1170 |
+
@keyframes vex-dropin {
|
1171 |
+
/* line 51, ../sass/_keyframes.sass */
|
1172 |
+
0% {
|
1173 |
+
transform: translateY(0);
|
1174 |
+
-webkit-transform: translateY(0);
|
1175 |
+
-moz-transform: translateY(0);
|
1176 |
+
-ms-transform: translateY(0);
|
1177 |
+
-o-transform: translateY(0);
|
1178 |
+
opacity: 0;
|
1179 |
+
}
|
1180 |
|
1181 |
+
/* line 54, ../sass/_keyframes.sass */
|
1182 |
+
1% {
|
1183 |
+
transform: translateY(-800px);
|
1184 |
+
-webkit-transform: translateY(-800px);
|
1185 |
+
-moz-transform: translateY(-800px);
|
1186 |
+
-ms-transform: translateY(-800px);
|
1187 |
+
-o-transform: translateY(-800px);
|
1188 |
+
opacity: 0;
|
1189 |
+
}
|
1190 |
+
|
1191 |
+
/* line 59, ../sass/_keyframes.sass */
|
1192 |
+
2% {
|
1193 |
+
transform: translateY(-800px);
|
1194 |
+
-webkit-transform: translateY(-800px);
|
1195 |
+
-moz-transform: translateY(-800px);
|
1196 |
+
-ms-transform: translateY(-800px);
|
1197 |
+
-o-transform: translateY(-800px);
|
1198 |
+
opacity: 1;
|
1199 |
+
}
|
1200 |
+
|
1201 |
+
/* line 62, ../sass/_keyframes.sass */
|
1202 |
+
100% {
|
1203 |
+
transform: translateY(0);
|
1204 |
+
-webkit-transform: translateY(0);
|
1205 |
+
-moz-transform: translateY(0);
|
1206 |
+
-ms-transform: translateY(0);
|
1207 |
+
-o-transform: translateY(0);
|
1208 |
+
opacity: 1;
|
1209 |
+
}
|
1210 |
+
}
|
1211 |
+
|
1212 |
+
@-webkit-keyframes vex-dropin {
|
1213 |
+
/* line 51, ../sass/_keyframes.sass */
|
1214 |
+
0% {
|
1215 |
+
transform: translateY(0);
|
1216 |
+
-webkit-transform: translateY(0);
|
1217 |
+
-moz-transform: translateY(0);
|
1218 |
+
-ms-transform: translateY(0);
|
1219 |
+
-o-transform: translateY(0);
|
1220 |
+
opacity: 0;
|
1221 |
+
}
|
1222 |
+
|
1223 |
+
/* line 54, ../sass/_keyframes.sass */
|
1224 |
+
1% {
|
1225 |
+
transform: translateY(-800px);
|
1226 |
+
-webkit-transform: translateY(-800px);
|
1227 |
+
-moz-transform: translateY(-800px);
|
1228 |
+
-ms-transform: translateY(-800px);
|
1229 |
+
-o-transform: translateY(-800px);
|
1230 |
+
opacity: 0;
|
1231 |
+
}
|
1232 |
+
|
1233 |
+
/* line 59, ../sass/_keyframes.sass */
|
1234 |
+
2% {
|
1235 |
+
transform: translateY(-800px);
|
1236 |
+
-webkit-transform: translateY(-800px);
|
1237 |
+
-moz-transform: translateY(-800px);
|
1238 |
+
-ms-transform: translateY(-800px);
|
1239 |
+
-o-transform: translateY(-800px);
|
1240 |
+
opacity: 1;
|
1241 |
+
}
|
1242 |
+
|
1243 |
+
/* line 62, ../sass/_keyframes.sass */
|
1244 |
+
100% {
|
1245 |
+
transform: translateY(0);
|
1246 |
+
-webkit-transform: translateY(0);
|
1247 |
+
-moz-transform: translateY(0);
|
1248 |
+
-ms-transform: translateY(0);
|
1249 |
+
-o-transform: translateY(0);
|
1250 |
+
opacity: 1;
|
1251 |
+
}
|
1252 |
+
}
|
1253 |
+
|
1254 |
+
@-moz-keyframes vex-dropin {
|
1255 |
+
/* line 51, ../sass/_keyframes.sass */
|
1256 |
+
0% {
|
1257 |
+
transform: translateY(0);
|
1258 |
+
-webkit-transform: translateY(0);
|
1259 |
+
-moz-transform: translateY(0);
|
1260 |
+
-ms-transform: translateY(0);
|
1261 |
+
-o-transform: translateY(0);
|
1262 |
+
opacity: 0;
|
1263 |
+
}
|
1264 |
+
|
1265 |
+
/* line 54, ../sass/_keyframes.sass */
|
1266 |
+
1% {
|
1267 |
+
transform: translateY(-800px);
|
1268 |
+
-webkit-transform: translateY(-800px);
|
1269 |
+
-moz-transform: translateY(-800px);
|
1270 |
+
-ms-transform: translateY(-800px);
|
1271 |
+
-o-transform: translateY(-800px);
|
1272 |
+
opacity: 0;
|
1273 |
+
}
|
1274 |
+
|
1275 |
+
/* line 59, ../sass/_keyframes.sass */
|
1276 |
+
2% {
|
1277 |
+
transform: translateY(-800px);
|
1278 |
+
-webkit-transform: translateY(-800px);
|
1279 |
+
-moz-transform: translateY(-800px);
|
1280 |
+
-ms-transform: translateY(-800px);
|
1281 |
+
-o-transform: translateY(-800px);
|
1282 |
+
opacity: 1;
|
1283 |
+
}
|
1284 |
+
|
1285 |
+
/* line 62, ../sass/_keyframes.sass */
|
1286 |
+
100% {
|
1287 |
+
transform: translateY(0);
|
1288 |
+
-webkit-transform: translateY(0);
|
1289 |
+
-moz-transform: translateY(0);
|
1290 |
+
-ms-transform: translateY(0);
|
1291 |
+
-o-transform: translateY(0);
|
1292 |
+
opacity: 1;
|
1293 |
+
}
|
1294 |
+
}
|
1295 |
+
|
1296 |
+
@-ms-keyframes vex-dropin {
|
1297 |
+
/* line 51, ../sass/_keyframes.sass */
|
1298 |
+
0% {
|
1299 |
+
transform: translateY(0);
|
1300 |
+
-webkit-transform: translateY(0);
|
1301 |
+
-moz-transform: translateY(0);
|
1302 |
+
-ms-transform: translateY(0);
|
1303 |
+
-o-transform: translateY(0);
|
1304 |
+
opacity: 0;
|
1305 |
+
}
|
1306 |
+
|
1307 |
+
/* line 54, ../sass/_keyframes.sass */
|
1308 |
+
1% {
|
1309 |
+
transform: translateY(-800px);
|
1310 |
+
-webkit-transform: translateY(-800px);
|
1311 |
+
-moz-transform: translateY(-800px);
|
1312 |
+
-ms-transform: translateY(-800px);
|
1313 |
+
-o-transform: translateY(-800px);
|
1314 |
+
opacity: 0;
|
1315 |
+
}
|
1316 |
+
|
1317 |
+
/* line 59, ../sass/_keyframes.sass */
|
1318 |
+
2% {
|
1319 |
+
transform: translateY(-800px);
|
1320 |
+
-webkit-transform: translateY(-800px);
|
1321 |
+
-moz-transform: translateY(-800px);
|
1322 |
+
-ms-transform: translateY(-800px);
|
1323 |
+
-o-transform: translateY(-800px);
|
1324 |
+
opacity: 1;
|
1325 |
+
}
|
1326 |
+
|
1327 |
+
/* line 62, ../sass/_keyframes.sass */
|
1328 |
+
100% {
|
1329 |
+
transform: translateY(0);
|
1330 |
+
-webkit-transform: translateY(0);
|
1331 |
+
-moz-transform: translateY(0);
|
1332 |
+
-ms-transform: translateY(0);
|
1333 |
+
-o-transform: translateY(0);
|
1334 |
+
opacity: 1;
|
1335 |
+
}
|
1336 |
+
}
|
1337 |
+
|
1338 |
+
@-o-keyframes vex-dropin {
|
1339 |
+
/* line 51, ../sass/_keyframes.sass */
|
1340 |
+
0% {
|
1341 |
+
transform: translateY(0);
|
1342 |
+
-webkit-transform: translateY(0);
|
1343 |
+
-moz-transform: translateY(0);
|
1344 |
+
-ms-transform: translateY(0);
|
1345 |
+
-o-transform: translateY(0);
|
1346 |
+
opacity: 0;
|
1347 |
+
}
|
1348 |
+
|
1349 |
+
/* line 54, ../sass/_keyframes.sass */
|
1350 |
+
1% {
|
1351 |
+
transform: translateY(-800px);
|
1352 |
+
-webkit-transform: translateY(-800px);
|
1353 |
+
-moz-transform: translateY(-800px);
|
1354 |
+
-ms-transform: translateY(-800px);
|
1355 |
+
-o-transform: translateY(-800px);
|
1356 |
+
opacity: 0;
|
1357 |
+
}
|
1358 |
+
|
1359 |
+
/* line 59, ../sass/_keyframes.sass */
|
1360 |
+
2% {
|
1361 |
+
transform: translateY(-800px);
|
1362 |
+
-webkit-transform: translateY(-800px);
|
1363 |
+
-moz-transform: translateY(-800px);
|
1364 |
+
-ms-transform: translateY(-800px);
|
1365 |
+
-o-transform: translateY(-800px);
|
1366 |
+
opacity: 1;
|
1367 |
+
}
|
1368 |
+
|
1369 |
+
/* line 62, ../sass/_keyframes.sass */
|
1370 |
+
100% {
|
1371 |
+
transform: translateY(0);
|
1372 |
+
-webkit-transform: translateY(0);
|
1373 |
+
-moz-transform: translateY(0);
|
1374 |
+
-ms-transform: translateY(0);
|
1375 |
+
-o-transform: translateY(0);
|
1376 |
+
opacity: 1;
|
1377 |
+
}
|
1378 |
+
}
|
1379 |
+
|
1380 |
+
@keyframes vex-dropout {
|
1381 |
+
/* line 68, ../sass/_keyframes.sass */
|
1382 |
+
0% {
|
1383 |
+
transform: translateY(0);
|
1384 |
+
-webkit-transform: translateY(0);
|
1385 |
+
-moz-transform: translateY(0);
|
1386 |
+
-ms-transform: translateY(0);
|
1387 |
+
-o-transform: translateY(0);
|
1388 |
+
}
|
1389 |
+
|
1390 |
+
/* line 70, ../sass/_keyframes.sass */
|
1391 |
+
100% {
|
1392 |
+
transform: translateY(-800px);
|
1393 |
+
-webkit-transform: translateY(-800px);
|
1394 |
+
-moz-transform: translateY(-800px);
|
1395 |
+
-ms-transform: translateY(-800px);
|
1396 |
+
-o-transform: translateY(-800px);
|
1397 |
+
}
|
1398 |
+
}
|
1399 |
+
|
1400 |
+
@-webkit-keyframes vex-dropout {
|
1401 |
+
/* line 68, ../sass/_keyframes.sass */
|
1402 |
+
0% {
|
1403 |
+
transform: translateY(0);
|
1404 |
+
-webkit-transform: translateY(0);
|
1405 |
+
-moz-transform: translateY(0);
|
1406 |
+
-ms-transform: translateY(0);
|
1407 |
+
-o-transform: translateY(0);
|
1408 |
+
}
|
1409 |
+
|
1410 |
+
/* line 70, ../sass/_keyframes.sass */
|
1411 |
+
100% {
|
1412 |
+
transform: translateY(-800px);
|
1413 |
+
-webkit-transform: translateY(-800px);
|
1414 |
+
-moz-transform: translateY(-800px);
|
1415 |
+
-ms-transform: translateY(-800px);
|
1416 |
+
-o-transform: translateY(-800px);
|
1417 |
+
}
|
1418 |
+
}
|
1419 |
+
|
1420 |
+
@-moz-keyframes vex-dropout {
|
1421 |
+
/* line 68, ../sass/_keyframes.sass */
|
1422 |
+
0% {
|
1423 |
+
transform: translateY(0);
|
1424 |
+
-webkit-transform: translateY(0);
|
1425 |
+
-moz-transform: translateY(0);
|
1426 |
+
-ms-transform: translateY(0);
|
1427 |
+
-o-transform: translateY(0);
|
1428 |
+
}
|
1429 |
+
|
1430 |
+
/* line 70, ../sass/_keyframes.sass */
|
1431 |
+
100% {
|
1432 |
+
transform: translateY(-800px);
|
1433 |
+
-webkit-transform: translateY(-800px);
|
1434 |
+
-moz-transform: translateY(-800px);
|
1435 |
+
-ms-transform: translateY(-800px);
|
1436 |
+
-o-transform: translateY(-800px);
|
1437 |
+
}
|
1438 |
+
}
|
1439 |
+
|
1440 |
+
@-ms-keyframes vex-dropout {
|
1441 |
+
/* line 68, ../sass/_keyframes.sass */
|
1442 |
+
0% {
|
1443 |
+
transform: translateY(0);
|
1444 |
+
-webkit-transform: translateY(0);
|
1445 |
+
-moz-transform: translateY(0);
|
1446 |
+
-ms-transform: translateY(0);
|
1447 |
+
-o-transform: translateY(0);
|
1448 |
+
}
|
1449 |
+
|
1450 |
+
/* line 70, ../sass/_keyframes.sass */
|
1451 |
+
100% {
|
1452 |
+
transform: translateY(-800px);
|
1453 |
+
-webkit-transform: translateY(-800px);
|
1454 |
+
-moz-transform: translateY(-800px);
|
1455 |
+
-ms-transform: translateY(-800px);
|
1456 |
+
-o-transform: translateY(-800px);
|
1457 |
+
}
|
1458 |
+
}
|
1459 |
+
|
1460 |
+
@-o-keyframes vex-dropout {
|
1461 |
+
/* line 68, ../sass/_keyframes.sass */
|
1462 |
+
0% {
|
1463 |
+
transform: translateY(0);
|
1464 |
+
-webkit-transform: translateY(0);
|
1465 |
+
-moz-transform: translateY(0);
|
1466 |
+
-ms-transform: translateY(0);
|
1467 |
+
-o-transform: translateY(0);
|
1468 |
+
}
|
1469 |
+
|
1470 |
+
/* line 70, ../sass/_keyframes.sass */
|
1471 |
+
100% {
|
1472 |
+
transform: translateY(-800px);
|
1473 |
+
-webkit-transform: translateY(-800px);
|
1474 |
+
-moz-transform: translateY(-800px);
|
1475 |
+
-ms-transform: translateY(-800px);
|
1476 |
+
-o-transform: translateY(-800px);
|
1477 |
+
}
|
1478 |
+
}
|
1479 |
+
|
1480 |
+
@keyframes vex-pulse {
|
1481 |
+
/* line 136, ../sass/_keyframes.sass */
|
1482 |
+
0% {
|
1483 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1484 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1485 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1486 |
+
}
|
1487 |
+
|
1488 |
+
/* line 138, ../sass/_keyframes.sass */
|
1489 |
+
70% {
|
1490 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1491 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1492 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1493 |
+
}
|
1494 |
+
|
1495 |
+
/* line 140, ../sass/_keyframes.sass */
|
1496 |
+
100% {
|
1497 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1498 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1499 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1500 |
+
}
|
1501 |
+
}
|
1502 |
+
|
1503 |
+
@-webkit-keyframes vex-pulse {
|
1504 |
+
/* line 136, ../sass/_keyframes.sass */
|
1505 |
+
0% {
|
1506 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1507 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1508 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1509 |
+
}
|
1510 |
+
|
1511 |
+
/* line 138, ../sass/_keyframes.sass */
|
1512 |
+
70% {
|
1513 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1514 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1515 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1516 |
+
}
|
1517 |
+
|
1518 |
+
/* line 140, ../sass/_keyframes.sass */
|
1519 |
+
100% {
|
1520 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1521 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1522 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1523 |
+
}
|
1524 |
+
}
|
1525 |
+
|
1526 |
+
@-moz-keyframes vex-pulse {
|
1527 |
+
/* line 136, ../sass/_keyframes.sass */
|
1528 |
+
0% {
|
1529 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1530 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1531 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1532 |
+
}
|
1533 |
+
|
1534 |
+
/* line 138, ../sass/_keyframes.sass */
|
1535 |
+
70% {
|
1536 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1537 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1538 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1539 |
+
}
|
1540 |
+
|
1541 |
+
/* line 140, ../sass/_keyframes.sass */
|
1542 |
+
100% {
|
1543 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1544 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1545 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1546 |
+
}
|
1547 |
+
}
|
1548 |
+
|
1549 |
+
@-ms-keyframes vex-pulse {
|
1550 |
+
/* line 136, ../sass/_keyframes.sass */
|
1551 |
+
0% {
|
1552 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1553 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1554 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1555 |
+
}
|
1556 |
+
|
1557 |
+
/* line 138, ../sass/_keyframes.sass */
|
1558 |
+
70% {
|
1559 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1560 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1561 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1562 |
+
}
|
1563 |
+
|
1564 |
+
/* line 140, ../sass/_keyframes.sass */
|
1565 |
+
100% {
|
1566 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1567 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1568 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1569 |
+
}
|
1570 |
+
}
|
1571 |
+
|
1572 |
+
@-o-keyframes vex-pulse {
|
1573 |
+
/* line 136, ../sass/_keyframes.sass */
|
1574 |
+
0% {
|
1575 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1576 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1577 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1578 |
+
}
|
1579 |
+
|
1580 |
+
/* line 138, ../sass/_keyframes.sass */
|
1581 |
+
70% {
|
1582 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1583 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1584 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1585 |
+
}
|
1586 |
+
|
1587 |
+
/* line 140, ../sass/_keyframes.sass */
|
1588 |
+
100% {
|
1589 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1590 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1591 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1592 |
+
}
|
1593 |
+
}
|
1594 |
+
|
1595 |
+
/* line 13, ../sass/_vex-theme-top.sass */
|
1596 |
+
.vex.vex-theme-top {
|
1597 |
+
bottom: inherit;
|
1598 |
+
}
|
1599 |
+
/* line 16, ../sass/_vex-theme-top.sass */
|
1600 |
+
.vex.vex-theme-top .vex-overlay {
|
1601 |
+
display: none;
|
1602 |
+
}
|
1603 |
+
/* line 19, ../sass/_vex-theme-top.sass */
|
1604 |
+
.vex.vex-theme-top.vex-closing .vex-content {
|
1605 |
+
animation: vex-dropout 0.5s;
|
1606 |
+
-webkit-animation: vex-dropout 0.5s;
|
1607 |
+
-moz-animation: vex-dropout 0.5s;
|
1608 |
+
-ms-animation: vex-dropout 0.5s;
|
1609 |
+
-o-animation: vex-dropout 0.5s;
|
1610 |
+
-webkit-backface-visibility: hidden;
|
1611 |
+
}
|
1612 |
+
/* line 22, ../sass/_vex-theme-top.sass */
|
1613 |
+
.vex.vex-theme-top .vex-content {
|
1614 |
+
animation: vex-dropin 0.5s;
|
1615 |
+
-webkit-animation: vex-dropin 0.5s;
|
1616 |
+
-moz-animation: vex-dropin 0.5s;
|
1617 |
+
-ms-animation: vex-dropin 0.5s;
|
1618 |
+
-o-animation: vex-dropin 0.5s;
|
1619 |
+
-webkit-backface-visibility: hidden;
|
1620 |
+
*zoom: 1;
|
1621 |
+
font-family: "Helvetica Neue", sans-serif;
|
1622 |
+
background: #f0f0f0;
|
1623 |
+
color: #444444;
|
1624 |
+
padding: 0.5em 0.5em 0.25em;
|
1625 |
+
position: relative;
|
1626 |
+
margin: 0 auto;
|
1627 |
+
max-width: 100%;
|
1628 |
+
font-size: 1.1em;
|
1629 |
+
line-height: 1.5em;
|
1630 |
+
}
|
1631 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
1632 |
+
.vex.vex-theme-top .vex-content:after {
|
1633 |
+
content: "";
|
1634 |
+
display: table;
|
1635 |
+
clear: both;
|
1636 |
+
}
|
1637 |
+
/* line 35, ../sass/_vex-theme-top.sass */
|
1638 |
+
.vex.vex-theme-top .vex-content h1, .vex.vex-theme-top .vex-content h2, .vex.vex-theme-top .vex-content h3, .vex.vex-theme-top .vex-content h4, .vex.vex-theme-top .vex-content h5, .vex.vex-theme-top .vex-content h6, .vex.vex-theme-top .vex-content p, .vex.vex-theme-top .vex-content ul, .vex.vex-theme-top .vex-content li {
|
1639 |
+
color: inherit;
|
1640 |
+
}
|
1641 |
+
/* line 38, ../sass/_vex-theme-top.sass */
|
1642 |
+
.vex.vex-theme-top .vex-close {
|
1643 |
+
-webkit-border-radius: 5px;
|
1644 |
+
-moz-border-radius: 5px;
|
1645 |
+
-ms-border-radius: 5px;
|
1646 |
+
-o-border-radius: 5px;
|
1647 |
+
border-radius: 5px;
|
1648 |
+
position: absolute;
|
1649 |
+
top: 0;
|
1650 |
+
right: 0;
|
1651 |
+
cursor: pointer;
|
1652 |
+
}
|
1653 |
+
/* line 45, ../sass/_vex-theme-top.sass */
|
1654 |
+
.vex.vex-theme-top .vex-close:before {
|
1655 |
+
-webkit-border-radius: 3px;
|
1656 |
+
-moz-border-radius: 3px;
|
1657 |
+
-ms-border-radius: 3px;
|
1658 |
+
-o-border-radius: 3px;
|
1659 |
+
border-radius: 3px;
|
1660 |
+
position: absolute;
|
1661 |
+
content: "\00D7";
|
1662 |
+
font-size: 26px;
|
1663 |
+
font-weight: normal;
|
1664 |
+
line-height: 31px;
|
1665 |
+
height: 30px;
|
1666 |
+
width: 30px;
|
1667 |
+
text-align: center;
|
1668 |
+
top: 3px;
|
1669 |
+
right: 3px;
|
1670 |
+
color: #bbbbbb;
|
1671 |
+
background: transparent;
|
1672 |
+
}
|
1673 |
+
/* line 60, ../sass/_vex-theme-top.sass */
|
1674 |
+
.vex.vex-theme-top .vex-close:hover:before, .vex.vex-theme-top .vex-close:active:before {
|
1675 |
+
color: #777777;
|
1676 |
+
background: #e0e0e0;
|
1677 |
+
}
|
1678 |
+
/* line 64, ../sass/_vex-theme-top.sass */
|
1679 |
+
.vex.vex-theme-top .vex-dialog-form {
|
1680 |
+
text-align: center;
|
1681 |
+
margin: 0 90px;
|
1682 |
+
}
|
1683 |
+
@media only screen and (max-width: 760px) {
|
1684 |
+
/* line 64, ../sass/_vex-theme-top.sass */
|
1685 |
+
.vex.vex-theme-top .vex-dialog-form {
|
1686 |
+
margin: 0 auto;
|
1687 |
+
}
|
1688 |
+
}
|
1689 |
+
/* line 71, ../sass/_vex-theme-top.sass */
|
1690 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-message, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input, .vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons {
|
1691 |
+
display: inline-block;
|
1692 |
+
}
|
1693 |
+
/* line 74, ../sass/_vex-theme-top.sass */
|
1694 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-input {
|
1695 |
+
min-width: 200px;
|
1696 |
+
margin: 0 1em;
|
1697 |
+
}
|
1698 |
+
/* line 78, ../sass/_vex-theme-top.sass */
|
1699 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="week"] {
|
1700 |
+
-webkit-border-radius: 3px;
|
1701 |
+
-moz-border-radius: 3px;
|
1702 |
+
-ms-border-radius: 3px;
|
1703 |
+
-o-border-radius: 3px;
|
1704 |
+
border-radius: 3px;
|
1705 |
+
background: white;
|
1706 |
+
width: 100%;
|
1707 |
+
padding: 0.25em 0.67em;
|
1708 |
+
border: 0;
|
1709 |
+
font-family: inherit;
|
1710 |
+
font-weight: inherit;
|
1711 |
+
font-size: inherit;
|
1712 |
+
min-height: 2.5em;
|
1713 |
+
margin: 0 0 0 0;
|
1714 |
+
}
|
1715 |
+
/* line 90, ../sass/_vex-theme-top.sass */
|
1716 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
|
1717 |
+
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1718 |
+
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1719 |
+
box-shadow: inset 0 0 0 2px #8dbdf1;
|
1720 |
+
outline: none;
|
1721 |
+
}
|
1722 |
+
/* line 94, ../sass/_vex-theme-top.sass */
|
1723 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons {
|
1724 |
+
*zoom: 1;
|
1725 |
+
}
|
1726 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
1727 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons:after {
|
1728 |
+
content: "";
|
1729 |
+
display: table;
|
1730 |
+
clear: both;
|
1731 |
+
}
|
1732 |
+
/* line 97, ../sass/_vex-theme-top.sass */
|
1733 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons input {
|
1734 |
+
float: none;
|
1735 |
+
}
|
1736 |
+
/* line 100, ../sass/_vex-theme-top.sass */
|
1737 |
+
.vex.vex-theme-top .leadin-subscribe-powered-by {
|
1738 |
+
position: absolute;
|
1739 |
+
bottom: 0.5em;
|
1740 |
+
right: 0.5em;
|
1741 |
+
}
|
1742 |
+
/* line 105, ../sass/_vex-theme-top.sass */
|
1743 |
+
.vex.vex-theme-top .vex-dialog-button {
|
1744 |
+
-webkit-border-radius: 3px;
|
1745 |
+
-moz-border-radius: 3px;
|
1746 |
+
-ms-border-radius: 3px;
|
1747 |
+
-o-border-radius: 3px;
|
1748 |
+
border-radius: 3px;
|
1749 |
+
border: 0;
|
1750 |
+
float: right;
|
1751 |
+
margin: 0 0 0 0.5em;
|
1752 |
+
font-family: inherit;
|
1753 |
+
text-transform: uppercase;
|
1754 |
+
letter-spacing: 0.1em;
|
1755 |
+
font-size: 0.8em;
|
1756 |
+
line-height: 1em;
|
1757 |
+
padding: 0.75em 2em;
|
1758 |
+
}
|
1759 |
+
/* line 117, ../sass/_vex-theme-top.sass */
|
1760 |
+
.vex.vex-theme-top .vex-dialog-button.vex-last {
|
1761 |
+
margin-left: 0;
|
1762 |
+
}
|
1763 |
+
/* line 120, ../sass/_vex-theme-top.sass */
|
1764 |
+
.vex.vex-theme-top .vex-dialog-button:focus {
|
1765 |
+
animation: vex-pulse 1.1s infinite;
|
1766 |
+
-webkit-animation: vex-pulse 1.1s infinite;
|
1767 |
+
-moz-animation: vex-pulse 1.1s infinite;
|
1768 |
+
-ms-animation: vex-pulse 1.1s infinite;
|
1769 |
+
-o-animation: vex-pulse 1.1s infinite;
|
1770 |
+
-webkit-backface-visibility: hidden;
|
1771 |
+
outline: none;
|
1772 |
+
}
|
1773 |
+
@media (max-width: 568px) {
|
1774 |
+
/* line 120, ../sass/_vex-theme-top.sass */
|
1775 |
+
.vex.vex-theme-top .vex-dialog-button:focus {
|
1776 |
+
animation: none;
|
1777 |
+
-webkit-animation: none;
|
1778 |
+
-moz-animation: none;
|
1779 |
+
-ms-animation: none;
|
1780 |
+
-o-animation: none;
|
1781 |
+
-webkit-backface-visibility: hidden;
|
1782 |
+
}
|
1783 |
+
}
|
1784 |
+
/* line 129, ../sass/_vex-theme-top.sass */
|
1785 |
+
.vex.vex-theme-top .vex-dialog-button.vex-dialog-button-primary {
|
1786 |
+
background: #3288e6;
|
1787 |
+
color: white;
|
1788 |
+
}
|
1789 |
+
/* line 133, ../sass/_vex-theme-top.sass */
|
1790 |
+
.vex.vex-theme-top .vex-dialog-button.vex-dialog-button-secondary {
|
1791 |
+
background: #e0e0e0;
|
1792 |
+
color: #777777;
|
1793 |
+
}
|
1794 |
+
|
1795 |
+
/* line 137, ../sass/_vex-theme-top.sass */
|
1796 |
+
.vex-loading-spinner.vex-theme-top {
|
1797 |
+
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1798 |
+
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1799 |
+
box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1800 |
+
-webkit-border-radius: 100%;
|
1801 |
+
-moz-border-radius: 100%;
|
1802 |
+
-ms-border-radius: 100%;
|
1803 |
+
-o-border-radius: 100%;
|
1804 |
+
border-radius: 100%;
|
1805 |
+
background: #f0f0f0;
|
1806 |
+
border: 0.2em solid transparent;
|
1807 |
+
border-top-color: #bbbbbb;
|
1808 |
+
top: -1.1em;
|
1809 |
+
bottom: auto;
|
1810 |
+
}
|
1811 |
+
|
1812 |
+
@keyframes vex-fadein {
|
1813 |
+
/* line 9, ../sass/_keyframes.sass */
|
1814 |
+
0% {
|
1815 |
+
opacity: 0;
|
1816 |
+
}
|
1817 |
+
|
1818 |
+
/* line 11, ../sass/_keyframes.sass */
|
1819 |
+
100% {
|
1820 |
+
opacity: 1;
|
1821 |
+
}
|
1822 |
+
}
|
1823 |
+
|
1824 |
+
@-webkit-keyframes vex-fadein {
|
1825 |
+
/* line 9, ../sass/_keyframes.sass */
|
1826 |
+
0% {
|
1827 |
+
opacity: 0;
|
1828 |
+
}
|
1829 |
+
|
1830 |
+
/* line 11, ../sass/_keyframes.sass */
|
1831 |
+
100% {
|
1832 |
+
opacity: 1;
|
1833 |
+
}
|
1834 |
+
}
|
1835 |
+
|
1836 |
+
@-moz-keyframes vex-fadein {
|
1837 |
+
/* line 9, ../sass/_keyframes.sass */
|
1838 |
+
0% {
|
1839 |
+
opacity: 0;
|
1840 |
+
}
|
1841 |
+
|
1842 |
+
/* line 11, ../sass/_keyframes.sass */
|
1843 |
+
100% {
|
1844 |
+
opacity: 1;
|
1845 |
+
}
|
1846 |
+
}
|
1847 |
+
|
1848 |
+
@-ms-keyframes vex-fadein {
|
1849 |
+
/* line 9, ../sass/_keyframes.sass */
|
1850 |
+
0% {
|
1851 |
+
opacity: 0;
|
1852 |
+
}
|
1853 |
+
|
1854 |
+
/* line 11, ../sass/_keyframes.sass */
|
1855 |
+
100% {
|
1856 |
+
opacity: 1;
|
1857 |
+
}
|
1858 |
+
}
|
1859 |
+
|
1860 |
+
@-o-keyframes vex-fadein {
|
1861 |
+
/* line 9, ../sass/_keyframes.sass */
|
1862 |
+
0% {
|
1863 |
+
opacity: 0;
|
1864 |
+
}
|
1865 |
+
|
1866 |
+
/* line 11, ../sass/_keyframes.sass */
|
1867 |
+
100% {
|
1868 |
+
opacity: 1;
|
1869 |
+
}
|
1870 |
+
}
|
1871 |
+
|
1872 |
+
@keyframes vex-fadeout {
|
1873 |
+
/* line 16, ../sass/_keyframes.sass */
|
1874 |
+
0% {
|
1875 |
+
opacity: 1;
|
1876 |
+
}
|
1877 |
+
|
1878 |
+
/* line 18, ../sass/_keyframes.sass */
|
1879 |
+
100% {
|
1880 |
+
opacity: 0;
|
1881 |
+
}
|
1882 |
+
}
|
1883 |
+
|
1884 |
+
@-webkit-keyframes vex-fadeout {
|
1885 |
+
/* line 16, ../sass/_keyframes.sass */
|
1886 |
+
0% {
|
1887 |
+
opacity: 1;
|
1888 |
+
}
|
1889 |
+
|
1890 |
+
/* line 18, ../sass/_keyframes.sass */
|
1891 |
+
100% {
|
1892 |
+
opacity: 0;
|
1893 |
+
}
|
1894 |
+
}
|
1895 |
+
|
1896 |
+
@-moz-keyframes vex-fadeout {
|
1897 |
+
/* line 16, ../sass/_keyframes.sass */
|
1898 |
+
0% {
|
1899 |
+
opacity: 1;
|
1900 |
+
}
|
1901 |
+
|
1902 |
+
/* line 18, ../sass/_keyframes.sass */
|
1903 |
+
100% {
|
1904 |
+
opacity: 0;
|
1905 |
+
}
|
1906 |
+
}
|
1907 |
+
|
1908 |
+
@-ms-keyframes vex-fadeout {
|
1909 |
+
/* line 16, ../sass/_keyframes.sass */
|
1910 |
+
0% {
|
1911 |
+
opacity: 1;
|
1912 |
+
}
|
1913 |
+
|
1914 |
+
/* line 18, ../sass/_keyframes.sass */
|
1915 |
+
100% {
|
1916 |
+
opacity: 0;
|
1917 |
+
}
|
1918 |
+
}
|
1919 |
+
|
1920 |
+
@-o-keyframes vex-fadeout {
|
1921 |
+
/* line 16, ../sass/_keyframes.sass */
|
1922 |
+
0% {
|
1923 |
+
opacity: 1;
|
1924 |
+
}
|
1925 |
+
|
1926 |
+
/* line 18, ../sass/_keyframes.sass */
|
1927 |
+
100% {
|
1928 |
+
opacity: 0;
|
1929 |
+
}
|
1930 |
+
}
|
1931 |
+
|
1932 |
+
@keyframes vex-rotation {
|
1933 |
+
/* line 127, ../sass/_keyframes.sass */
|
1934 |
+
0% {
|
1935 |
+
transform: rotate(0deg);
|
1936 |
+
-webkit-transform: rotate(0deg);
|
1937 |
+
-moz-transform: rotate(0deg);
|
1938 |
+
-ms-transform: rotate(0deg);
|
1939 |
+
-o-transform: rotate(0deg);
|
1940 |
+
}
|
1941 |
+
|
1942 |
+
/* line 129, ../sass/_keyframes.sass */
|
1943 |
+
100% {
|
1944 |
+
transform: rotate(359deg);
|
1945 |
+
-webkit-transform: rotate(359deg);
|
1946 |
+
-moz-transform: rotate(359deg);
|
1947 |
+
-ms-transform: rotate(359deg);
|
1948 |
+
-o-transform: rotate(359deg);
|
1949 |
+
}
|
1950 |
+
}
|
1951 |
+
|
1952 |
+
@-webkit-keyframes vex-rotation {
|
1953 |
+
/* line 127, ../sass/_keyframes.sass */
|
1954 |
+
0% {
|
1955 |
+
transform: rotate(0deg);
|
1956 |
+
-webkit-transform: rotate(0deg);
|
1957 |
+
-moz-transform: rotate(0deg);
|
1958 |
+
-ms-transform: rotate(0deg);
|
1959 |
+
-o-transform: rotate(0deg);
|
1960 |
+
}
|
1961 |
+
|
1962 |
+
/* line 129, ../sass/_keyframes.sass */
|
1963 |
+
100% {
|
1964 |
+
transform: rotate(359deg);
|
1965 |
+
-webkit-transform: rotate(359deg);
|
1966 |
+
-moz-transform: rotate(359deg);
|
1967 |
+
-ms-transform: rotate(359deg);
|
1968 |
+
-o-transform: rotate(359deg);
|
1969 |
+
}
|
1970 |
+
}
|
1971 |
+
|
1972 |
+
@-moz-keyframes vex-rotation {
|
1973 |
+
/* line 127, ../sass/_keyframes.sass */
|
1974 |
+
0% {
|
1975 |
+
transform: rotate(0deg);
|
1976 |
+
-webkit-transform: rotate(0deg);
|
1977 |
+
-moz-transform: rotate(0deg);
|
1978 |
+
-ms-transform: rotate(0deg);
|
1979 |
+
-o-transform: rotate(0deg);
|
1980 |
+
}
|
1981 |
+
|
1982 |
+
/* line 129, ../sass/_keyframes.sass */
|
1983 |
+
100% {
|
1984 |
+
transform: rotate(359deg);
|
1985 |
+
-webkit-transform: rotate(359deg);
|
1986 |
+
-moz-transform: rotate(359deg);
|
1987 |
+
-ms-transform: rotate(359deg);
|
1988 |
+
-o-transform: rotate(359deg);
|
1989 |
+
}
|
1990 |
+
}
|
1991 |
+
|
1992 |
+
@-ms-keyframes vex-rotation {
|
1993 |
+
/* line 127, ../sass/_keyframes.sass */
|
1994 |
+
0% {
|
1995 |
+
transform: rotate(0deg);
|
1996 |
+
-webkit-transform: rotate(0deg);
|
1997 |
+
-moz-transform: rotate(0deg);
|
1998 |
+
-ms-transform: rotate(0deg);
|
1999 |
+
-o-transform: rotate(0deg);
|
2000 |
+
}
|
2001 |
+
|
2002 |
+
/* line 129, ../sass/_keyframes.sass */
|
2003 |
+
100% {
|
2004 |
+
transform: rotate(359deg);
|
2005 |
+
-webkit-transform: rotate(359deg);
|
2006 |
+
-moz-transform: rotate(359deg);
|
2007 |
+
-ms-transform: rotate(359deg);
|
2008 |
+
-o-transform: rotate(359deg);
|
2009 |
+
}
|
2010 |
+
}
|
2011 |
+
|
2012 |
+
@-o-keyframes vex-rotation {
|
2013 |
+
/* line 127, ../sass/_keyframes.sass */
|
2014 |
+
0% {
|
2015 |
+
transform: rotate(0deg);
|
2016 |
+
-webkit-transform: rotate(0deg);
|
2017 |
+
-moz-transform: rotate(0deg);
|
2018 |
+
-ms-transform: rotate(0deg);
|
2019 |
+
-o-transform: rotate(0deg);
|
2020 |
+
}
|
2021 |
+
|
2022 |
+
/* line 129, ../sass/_keyframes.sass */
|
2023 |
+
100% {
|
2024 |
+
transform: rotate(359deg);
|
2025 |
+
-webkit-transform: rotate(359deg);
|
2026 |
+
-moz-transform: rotate(359deg);
|
2027 |
+
-ms-transform: rotate(359deg);
|
2028 |
+
-o-transform: rotate(359deg);
|
2029 |
+
}
|
2030 |
+
}
|
2031 |
+
|
2032 |
+
/* line 16, ../sass/vex.sass */
|
2033 |
+
.vex, .vex *, .vex *:before, .vex *:after {
|
2034 |
+
-webkit-box-sizing: border-box;
|
2035 |
+
-moz-box-sizing: border-box;
|
2036 |
+
box-sizing: border-box;
|
2037 |
+
}
|
2038 |
+
|
2039 |
+
/* line 19, ../sass/vex.sass */
|
2040 |
+
.vex {
|
2041 |
+
position: fixed;
|
2042 |
+
overflow: visible;
|
2043 |
+
-webkit-overflow-scrolling: touch;
|
2044 |
+
z-index: 1111;
|
2045 |
+
top: 0;
|
2046 |
+
right: 0;
|
2047 |
+
bottom: 0;
|
2048 |
+
left: 0;
|
2049 |
+
}
|
2050 |
+
|
2051 |
+
/* line 30, ../sass/vex.sass */
|
2052 |
+
.vex-overlay {
|
2053 |
+
background: black;
|
2054 |
+
filter: alpha(opacity=40);
|
2055 |
+
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)";
|
2056 |
+
}
|
2057 |
+
|
2058 |
+
/* line 35, ../sass/vex.sass */
|
2059 |
+
.vex-overlay {
|
2060 |
+
animation: vex-fadein 0.5s;
|
2061 |
+
-webkit-animation: vex-fadein 0.5s;
|
2062 |
+
-moz-animation: vex-fadein 0.5s;
|
2063 |
+
-ms-animation: vex-fadein 0.5s;
|
2064 |
+
-o-animation: vex-fadein 0.5s;
|
2065 |
+
-webkit-backface-visibility: hidden;
|
2066 |
+
position: fixed;
|
2067 |
+
background: rgba(0, 0, 0, 0.4);
|
2068 |
+
top: 0;
|
2069 |
+
right: 0;
|
2070 |
+
bottom: 0;
|
2071 |
+
left: 0;
|
2072 |
+
}
|
2073 |
+
/* line 44, ../sass/vex.sass */
|
2074 |
+
.vex.vex-closing .vex-overlay {
|
2075 |
+
animation: vex-fadeout 0.5s;
|
2076 |
+
-webkit-animation: vex-fadeout 0.5s;
|
2077 |
+
-moz-animation: vex-fadeout 0.5s;
|
2078 |
+
-ms-animation: vex-fadeout 0.5s;
|
2079 |
+
-o-animation: vex-fadeout 0.5s;
|
2080 |
+
-webkit-backface-visibility: hidden;
|
2081 |
+
}
|
2082 |
+
|
2083 |
+
/* line 47, ../sass/vex.sass */
|
2084 |
+
.vex-content {
|
2085 |
+
*zoom: 1;
|
2086 |
+
animation: vex-fadein 0.5s;
|
2087 |
+
-webkit-animation: vex-fadein 0.5s;
|
2088 |
+
-moz-animation: vex-fadein 0.5s;
|
2089 |
+
-ms-animation: vex-fadein 0.5s;
|
2090 |
+
-o-animation: vex-fadein 0.5s;
|
2091 |
+
-webkit-backface-visibility: hidden;
|
2092 |
+
-webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
2093 |
+
-moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
2094 |
+
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
2095 |
+
background: white;
|
2096 |
+
}
|
2097 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
2098 |
+
.vex-content:after {
|
2099 |
+
content: "";
|
2100 |
+
display: table;
|
2101 |
+
clear: both;
|
2102 |
+
}
|
2103 |
+
/* line 53, ../sass/vex.sass */
|
2104 |
+
.vex.vex-closing .vex-content {
|
2105 |
+
animation: vex-fadeout 0.5s;
|
2106 |
+
-webkit-animation: vex-fadeout 0.5s;
|
2107 |
+
-moz-animation: vex-fadeout 0.5s;
|
2108 |
+
-ms-animation: vex-fadeout 0.5s;
|
2109 |
+
-o-animation: vex-fadeout 0.5s;
|
2110 |
+
-webkit-backface-visibility: hidden;
|
2111 |
+
}
|
2112 |
+
/* line 56, ../sass/vex.sass */
|
2113 |
+
.vex-content .powered-by {
|
2114 |
+
display: block;
|
2115 |
+
font-size: 11px;
|
2116 |
+
color: #888888;
|
2117 |
+
padding: 10px 0 0 0;
|
2118 |
+
}
|
2119 |
+
/* line 62, ../sass/vex.sass */
|
2120 |
+
.vex-content .vex-dialog-message, .vex-content .vex-dialog-input, .vex-content .vex-dialog-buttons {
|
2121 |
+
*zoom: 1;
|
2122 |
+
font-size: 16px;
|
2123 |
+
}
|
2124 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
2125 |
+
.vex-content .vex-dialog-message:after, .vex-content .vex-dialog-input:after, .vex-content .vex-dialog-buttons:after {
|
2126 |
+
content: "";
|
2127 |
+
display: table;
|
2128 |
+
clear: both;
|
2129 |
+
}
|
2130 |
+
/* line 66, ../sass/vex.sass */
|
2131 |
+
.vex-content .leadin-subscribe-powered-by {
|
2132 |
+
float: right;
|
2133 |
+
font-size: 12px;
|
2134 |
+
font-weight: bold;
|
2135 |
+
color: #3288e6;
|
2136 |
+
}
|
2137 |
+
|
2138 |
+
/* line 72, ../sass/vex.sass */
|
2139 |
+
.vex-close:before {
|
2140 |
+
font-family: Arial, sans-serif;
|
2141 |
+
content: "\00D7";
|
2142 |
+
}
|
2143 |
+
|
2144 |
+
/* line 76, ../sass/vex.sass */
|
2145 |
+
.vex-dialog-form {
|
2146 |
+
margin: 0;
|
2147 |
+
}
|
2148 |
+
/* line 79, ../sass/vex.sass */
|
2149 |
+
.vex-dialog-form .vex-dialog-message {
|
2150 |
+
font-weight: bold;
|
2151 |
+
}
|
2152 |
+
|
2153 |
+
/* line 82, ../sass/vex.sass */
|
2154 |
+
.vex-dialog-button {
|
2155 |
+
-webkit-appearance: none;
|
2156 |
+
cursor: pointer;
|
2157 |
+
-webkit-border-radius: 3px;
|
2158 |
+
-moz-border-radius: 3px;
|
2159 |
+
-ms-border-radius: 3px;
|
2160 |
+
-o-border-radius: 3px;
|
2161 |
+
border-radius: 3px;
|
2162 |
+
float: right;
|
2163 |
+
margin: 0 0 0 0.5em;
|
2164 |
+
font-family: inherit;
|
2165 |
+
text-transform: uppercase;
|
2166 |
+
letter-spacing: 0.1em;
|
2167 |
+
font-size: 0.8em;
|
2168 |
+
line-height: 1em;
|
2169 |
+
padding: 0.75em 2em;
|
2170 |
+
}
|
2171 |
+
/* line 95, ../sass/vex.sass */
|
2172 |
+
.vex-dialog-button.vex-last {
|
2173 |
+
margin-left: 0;
|
2174 |
+
}
|
2175 |
+
/* line 98, ../sass/vex.sass */
|
2176 |
+
.vex-dialog-button:focus, .vex-dialog-button:hover {
|
2177 |
+
outline: none;
|
2178 |
+
}
|
2179 |
+
/* line 101, ../sass/vex.sass */
|
2180 |
+
.vex-dialog-button.vex-dialog-button-primary {
|
2181 |
+
-webkit-box-shadow: none;
|
2182 |
+
-moz-box-shadow: none;
|
2183 |
+
box-shadow: none;
|
2184 |
+
border: 0;
|
2185 |
+
background: #3288e6;
|
2186 |
+
color: white;
|
2187 |
+
}
|
2188 |
+
/* line 107, ../sass/vex.sass */
|
2189 |
+
.vex-dialog-button.vex-dialog-button-primary:hover {
|
2190 |
+
background: #5fa2ec;
|
2191 |
+
}
|
2192 |
+
/* line 110, ../sass/vex.sass */
|
2193 |
+
.vex-dialog-button.vex-dialog-button-secondary {
|
2194 |
+
-webkit-box-shadow: none;
|
2195 |
+
-moz-box-shadow: none;
|
2196 |
+
box-shadow: none;
|
2197 |
+
border: 0;
|
2198 |
+
background: #e0e0e0;
|
2199 |
+
color: #777777;
|
2200 |
+
}
|
2201 |
+
|
2202 |
+
/* line 116, ../sass/vex.sass */
|
2203 |
+
.vex-loading-spinner {
|
2204 |
+
animation: vex-rotation 0.7s linear infinite;
|
2205 |
+
-webkit-animation: vex-rotation 0.7s linear infinite;
|
2206 |
+
-moz-animation: vex-rotation 0.7s linear infinite;
|
2207 |
+
-ms-animation: vex-rotation 0.7s linear infinite;
|
2208 |
+
-o-animation: vex-rotation 0.7s linear infinite;
|
2209 |
+
-webkit-backface-visibility: hidden;
|
2210 |
+
-webkit-box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
|
2211 |
+
-moz-box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
|
2212 |
+
box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
|
2213 |
+
position: fixed;
|
2214 |
+
z-index: 1112;
|
2215 |
+
margin: auto;
|
2216 |
+
top: 0;
|
2217 |
+
right: 0;
|
2218 |
+
bottom: 0;
|
2219 |
+
left: 0;
|
2220 |
+
height: 2em;
|
2221 |
+
width: 2em;
|
2222 |
+
background: white;
|
2223 |
+
}
|
2224 |
+
|
2225 |
+
@media only screen and (max-width: 760px) {
|
2226 |
+
/* line 132, ../sass/vex.sass */
|
2227 |
+
#leadin-subscribe-mobile-check, .leadin-subscribe-powered-by {
|
2228 |
+
display: none;
|
2229 |
+
}
|
2230 |
}
|
power-ups/subscribe-widget/frontend/js/leadin-subscribe.js
CHANGED
@@ -50,20 +50,33 @@ function bind_leadin_subscribe_widget ()
|
|
50 |
|
51 |
subscribe.vex = vex.dialog.open({
|
52 |
showCloseButton: true,
|
53 |
-
className: 'leadin-subscribe
|
54 |
message: $('#leadin-subscribe-heading').val(),
|
55 |
input: '' +
|
56 |
-
'<input id="leadin-subscribe-email" name="email" type="email" placeholder="Email address" required />'
|
57 |
-
'<input id="leadin-subscribe-first-name" name="firstName" type="text" placeholder="First name" required/>' +
|
58 |
-
'<input id="leadin-subscribe-last-name" name="lastName" type="text" placeholder="Last name" required/>',
|
59 |
buttons: [$.extend({}, vex.dialog.buttons.YES, { text: ( $('#leadin-subscribe-btn-label').val() ? $('#leadin-subscribe-btn-label').val() : 'SUBSCRIBE' ) })],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
callback: function(data) {
|
61 |
if (data === false) {
|
62 |
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
63 |
-
return;
|
64 |
}
|
65 |
|
66 |
-
leadin_submit_form($('.leadin-subscribe form'), $, 'subscribe');
|
67 |
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
68 |
}
|
69 |
});
|
50 |
|
51 |
subscribe.vex = vex.dialog.open({
|
52 |
showCloseButton: true,
|
53 |
+
className: 'leadin-subscribe ' + $('#leadin-subscribe-vex-class').val(),
|
54 |
message: $('#leadin-subscribe-heading').val(),
|
55 |
input: '' +
|
56 |
+
'<input id="leadin-subscribe-email" name="email" type="email" placeholder="Email address" required />',
|
|
|
|
|
57 |
buttons: [$.extend({}, vex.dialog.buttons.YES, { text: ( $('#leadin-subscribe-btn-label').val() ? $('#leadin-subscribe-btn-label').val() : 'SUBSCRIBE' ) })],
|
58 |
+
onSubmit: function ( data )
|
59 |
+
{
|
60 |
+
$('.vex-dialog-form').fadeOut(300, function ( e ) {
|
61 |
+
$('.vex-dialog-form').html(
|
62 |
+
'<div class="vex-close"></div>' +
|
63 |
+
'<h3>Thanks for Subscribing</h3>You should receive a confirmation email in your inbox shortly.' +
|
64 |
+
'<div>' +
|
65 |
+
'<span class="powered-by">Powered by LeadIn</span>' +
|
66 |
+
'<a href="http://leadin.com/wordpress-subscribe-widget/?utm_campaign=subscribe_widget&utm_medium=email&utm_source=' + window.location.host + '"><img alt="LeadIn" height="20px" width="99px" src="http://leadin.com/wp-content/themes/LeadIn-WP-Theme/library/images/logos/Leadin_logo@2x.png" alt="leadin.com"/></a>' +
|
67 |
+
'</div>'
|
68 |
+
).css('text-align', 'center').fadeIn(250);
|
69 |
+
});
|
70 |
+
|
71 |
+
leadin_submit_form($('.leadin-subscribe form'), $, 'subscribe');
|
72 |
+
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
73 |
+
return false;
|
74 |
+
},
|
75 |
callback: function(data) {
|
76 |
if (data === false) {
|
77 |
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
|
|
78 |
}
|
79 |
|
|
|
80 |
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
81 |
}
|
82 |
});
|
power-ups/subscribe-widget/frontend/sass/_keyframes.sass
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
|
3 |
+
@import mixins
|
4 |
+
|
5 |
+
// Overlay/content animations
|
6 |
+
|
7 |
+
=keyframes-vex-fadein
|
8 |
+
+vex-keyframes("vex-fadein")
|
9 |
+
0%
|
10 |
+
opacity: 0
|
11 |
+
100%
|
12 |
+
opacity: 1
|
13 |
+
|
14 |
+
=keyframes-vex-fadeout
|
15 |
+
+vex-keyframes("vex-fadeout")
|
16 |
+
0%
|
17 |
+
opacity: 1
|
18 |
+
100%
|
19 |
+
opacity: 0
|
20 |
+
|
21 |
+
// Content animations
|
22 |
+
|
23 |
+
=keyframes-vex-flyin
|
24 |
+
+vex-keyframes("vex-flyin")
|
25 |
+
0%
|
26 |
+
opacity: 0
|
27 |
+
+vex-transform(translateY(-40px))
|
28 |
+
100%
|
29 |
+
opacity: 1
|
30 |
+
+vex-transform(translateY(0))
|
31 |
+
|
32 |
+
=keyframes-vex-flyout
|
33 |
+
+vex-keyframes("vex-flyout")
|
34 |
+
0%
|
35 |
+
opacity: 1
|
36 |
+
+vex-transform(translateY(0))
|
37 |
+
100%
|
38 |
+
opacity: 0
|
39 |
+
+vex-transform(translateY(-40px))
|
40 |
+
|
41 |
+
=keyframes-vex-dropin
|
42 |
+
+vex-keyframes("vex-dropin")
|
43 |
+
// We start at 0 first and, while hidden
|
44 |
+
// move to -800px, where the animation
|
45 |
+
// really begins. This was necessary because
|
46 |
+
// otherwise, when starting the animation
|
47 |
+
// at -800px, the browser scrolls up 800px
|
48 |
+
// to try to display this object positioned
|
49 |
+
// above the page.
|
50 |
+
// https://github.com/HubSpot/vex/issues/21
|
51 |
+
0%
|
52 |
+
+vex-transform(translateY(0))
|
53 |
+
opacity: 0
|
54 |
+
1%
|
55 |
+
+vex-transform(translateY(-800px))
|
56 |
+
opacity: 0
|
57 |
+
|
58 |
+
// Real animation begins here
|
59 |
+
2%
|
60 |
+
+vex-transform(translateY(-800px))
|
61 |
+
opacity: 1
|
62 |
+
100%
|
63 |
+
+vex-transform(translateY(0))
|
64 |
+
opacity: 1
|
65 |
+
|
66 |
+
=keyframes-vex-dropout
|
67 |
+
+vex-keyframes("vex-dropout")
|
68 |
+
0%
|
69 |
+
+vex-transform(translateY(0))
|
70 |
+
100%
|
71 |
+
+vex-transform(translateY(-800px))
|
72 |
+
|
73 |
+
=keyframes-vex-slideup
|
74 |
+
+vex-keyframes("vex-slideup")
|
75 |
+
// We start at 0 first and, while hidden
|
76 |
+
// move to -800px, where the animation
|
77 |
+
// really begins. This was necessary because
|
78 |
+
// otherwise, when starting the animation
|
79 |
+
// at -800px, the browser scrolls up 800px
|
80 |
+
// to try to display this object positioned
|
81 |
+
// above the page.
|
82 |
+
// https://github.com/HubSpot/vex/issues/21
|
83 |
+
0%
|
84 |
+
+vex-transform(translateY(0))
|
85 |
+
opacity: 0
|
86 |
+
1%
|
87 |
+
+vex-transform(translateY(800px))
|
88 |
+
opacity: 0
|
89 |
+
|
90 |
+
// Real animation begins here
|
91 |
+
2%
|
92 |
+
+vex-transform(translateY(800px))
|
93 |
+
opacity: 1
|
94 |
+
100%
|
95 |
+
+vex-transform(translateY(0))
|
96 |
+
opacity: 1
|
97 |
+
|
98 |
+
=keyframes-vex-slidedown
|
99 |
+
+vex-keyframes("vex-slidedown")
|
100 |
+
0%
|
101 |
+
+vex-transform(translateY(0))
|
102 |
+
100%
|
103 |
+
+vex-transform(translateY(800px))
|
104 |
+
|
105 |
+
=keyframes-vex-flipin-horizontal
|
106 |
+
+vex-keyframes("vex-flipin-horizontal")
|
107 |
+
0%
|
108 |
+
opacity: 0
|
109 |
+
+vex-transform(rotateY(-90deg))
|
110 |
+
100%
|
111 |
+
opacity: 1
|
112 |
+
+vex-transform(rotateY(0deg))
|
113 |
+
|
114 |
+
=keyframes-vex-flipout-horizontal
|
115 |
+
+vex-keyframes("vex-flipout-horizontal")
|
116 |
+
0%
|
117 |
+
opacity: 1
|
118 |
+
+vex-transform(rotateY(0deg))
|
119 |
+
100%
|
120 |
+
opacity: 0
|
121 |
+
+vex-transform(rotateY(90deg))
|
122 |
+
|
123 |
+
// Spinner animations
|
124 |
+
|
125 |
+
=keyframes-vex-rotation
|
126 |
+
+vex-keyframes("vex-rotation")
|
127 |
+
0%
|
128 |
+
+vex-transform(rotate(0deg))
|
129 |
+
100%
|
130 |
+
+vex-transform(rotate(359deg))
|
131 |
+
|
132 |
+
// Button animations
|
133 |
+
|
134 |
+
=keyframes-vex-pulse
|
135 |
+
+vex-keyframes("vex-pulse")
|
136 |
+
0%
|
137 |
+
+box-shadow(inset 0 0 0 300px transparent)
|
138 |
+
70%
|
139 |
+
+box-shadow(inset 0 0 0 300px rgba(255, 255, 255, .25))
|
140 |
+
100%
|
141 |
+
+box-shadow(inset 0 0 0 300px transparent)
|
power-ups/subscribe-widget/frontend/sass/_mixins.sass
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=vex-keyframes($name)
|
2 |
+
@keyframes #{$name}
|
3 |
+
@content
|
4 |
+
@-webkit-keyframes #{$name}
|
5 |
+
@content
|
6 |
+
@-moz-keyframes #{$name}
|
7 |
+
@content
|
8 |
+
@-ms-keyframes #{$name}
|
9 |
+
@content
|
10 |
+
@-o-keyframes #{$name}
|
11 |
+
@content
|
12 |
+
|
13 |
+
=vex-animation($animation)
|
14 |
+
animation: $animation
|
15 |
+
-webkit-animation: $animation
|
16 |
+
-moz-animation: $animation
|
17 |
+
-ms-animation: $animation
|
18 |
+
-o-animation: $animation
|
19 |
+
-webkit-backface-visibility: hidden
|
20 |
+
|
21 |
+
=vex-transform($transform)
|
22 |
+
transform: $transform
|
23 |
+
-webkit-transform: $transform
|
24 |
+
-moz-transform: $transform
|
25 |
+
-ms-transform: $transform
|
26 |
+
-o-transform: $transform
|
27 |
+
|
28 |
+
=vex-preserve-3d
|
29 |
+
-webkit-transform-style: preserve-3d
|
30 |
+
-moz-transform-style: preserve-3d
|
31 |
+
transform-style: preserve-3d
|
power-ups/subscribe-widget/frontend/sass/_vex-theme-bottom-right-corner.sass
ADDED
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
@import compass/utilities/general/clearfix
|
3 |
+
|
4 |
+
@import mixins
|
5 |
+
@import keyframes
|
6 |
+
|
7 |
+
+keyframes-vex-slideup
|
8 |
+
+keyframes-vex-slidedown
|
9 |
+
+keyframes-vex-pulse
|
10 |
+
|
11 |
+
$blue: #3288e6
|
12 |
+
|
13 |
+
.vex.vex-theme-bottom-right-corner,
|
14 |
+
.vex.vex-theme-bottom-left-corner
|
15 |
+
top: auto
|
16 |
+
bottom: 0
|
17 |
+
right: 0
|
18 |
+
overflow: visible
|
19 |
+
|
20 |
+
.vex-overlay
|
21 |
+
display: none
|
22 |
+
|
23 |
+
&.vex-closing .vex-content
|
24 |
+
+vex-animation(vex-slidedown .5s)
|
25 |
+
|
26 |
+
.vex-content
|
27 |
+
+vex-animation(vex-slideup .5s)
|
28 |
+
|
29 |
+
.vex-content
|
30 |
+
font-family: "Helvetica Neue", sans-serif
|
31 |
+
background: #f0f0f0
|
32 |
+
color: #444
|
33 |
+
padding: 1em
|
34 |
+
max-width: 100%
|
35 |
+
width: 450px
|
36 |
+
font-size: 1.1em
|
37 |
+
line-height: 1.5em
|
38 |
+
position: fixed
|
39 |
+
bottom: 0
|
40 |
+
|
41 |
+
h1, h2, h3, h4, h5, h6, p, ul, li
|
42 |
+
color: inherit
|
43 |
+
|
44 |
+
.vex-close
|
45 |
+
+border-radius(5px)
|
46 |
+
position: absolute
|
47 |
+
top: 0
|
48 |
+
right: 0
|
49 |
+
cursor: pointer
|
50 |
+
|
51 |
+
&:before
|
52 |
+
+border-radius(3px)
|
53 |
+
position: absolute
|
54 |
+
content: "\00D7"
|
55 |
+
font-size: 26px
|
56 |
+
font-weight: normal
|
57 |
+
line-height: 31px
|
58 |
+
height: 30px
|
59 |
+
width: 30px
|
60 |
+
text-align: center
|
61 |
+
top: 3px
|
62 |
+
right: 3px
|
63 |
+
color: #bbb
|
64 |
+
background: transparent
|
65 |
+
|
66 |
+
&:hover:before, &:active:before
|
67 |
+
color: #777
|
68 |
+
background: #e0e0e0
|
69 |
+
|
70 |
+
.vex-dialog-form
|
71 |
+
|
72 |
+
.vex-dialog-message
|
73 |
+
margin-bottom: .5em
|
74 |
+
|
75 |
+
.vex-dialog-input
|
76 |
+
margin-bottom: 1em
|
77 |
+
|
78 |
+
textarea, input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]
|
79 |
+
+border-radius(3px)
|
80 |
+
background: #fff
|
81 |
+
width: 100%
|
82 |
+
padding: .25em .67em
|
83 |
+
border: 0
|
84 |
+
font-family: inherit
|
85 |
+
font-weight: inherit
|
86 |
+
font-size: inherit
|
87 |
+
min-height: 2.5em
|
88 |
+
margin: 0 0 .25em
|
89 |
+
|
90 |
+
&:focus
|
91 |
+
+box-shadow(inset 0 0 0 2px lighten($blue, 20%))
|
92 |
+
outline: none
|
93 |
+
|
94 |
+
.vex-dialog-buttons
|
95 |
+
+pie-clearfix()
|
96 |
+
|
97 |
+
.vex.vex-theme-bottom-right-corner
|
98 |
+
|
99 |
+
.vex-content
|
100 |
+
+border-radius(5px 0 0 0)
|
101 |
+
right: 0
|
102 |
+
left: auto
|
103 |
+
|
104 |
+
.vex.vex-theme-bottom-left-corner
|
105 |
+
|
106 |
+
.vex-content
|
107 |
+
+border-radius(0 5px 0 0)
|
108 |
+
left: 0
|
109 |
+
right: auto
|
110 |
+
|
111 |
+
.vex-loading-spinner.vex-theme-bottom-right-corner
|
112 |
+
+box-shadow(0 0 0 .5em #f0f0f0, 0 0 1px .5em rgba(0, 0, 0, 0.3))
|
113 |
+
+border-radius(100%)
|
114 |
+
background: #f0f0f0
|
115 |
+
border: .2em solid transparent
|
116 |
+
border-top-color: #bbb
|
117 |
+
top: -1.1em
|
118 |
+
bottom: auto
|
power-ups/subscribe-widget/frontend/sass/_vex-theme-default.sass
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
@import compass/utilities/general/clearfix
|
3 |
+
|
4 |
+
@import mixins
|
5 |
+
@import keyframes
|
6 |
+
|
7 |
+
+keyframes-vex-flyin
|
8 |
+
+keyframes-vex-flyout
|
9 |
+
+keyframes-vex-pulse
|
10 |
+
|
11 |
+
$blue: #3288e6
|
12 |
+
|
13 |
+
.vex.vex-theme-default
|
14 |
+
padding-top: 160px
|
15 |
+
padding-bottom: 160px
|
16 |
+
|
17 |
+
&.vex-closing .vex-content
|
18 |
+
+vex-animation(vex-flyout .5s)
|
19 |
+
|
20 |
+
.vex-content
|
21 |
+
+vex-animation(vex-flyin .5s)
|
22 |
+
|
23 |
+
.vex-content
|
24 |
+
+border-radius(5px)
|
25 |
+
font-family: "Helvetica Neue", sans-serif
|
26 |
+
background: #f0f0f0
|
27 |
+
color: #444
|
28 |
+
padding: 1em
|
29 |
+
position: relative
|
30 |
+
margin: 0 auto
|
31 |
+
max-width: 100%
|
32 |
+
width: 450px
|
33 |
+
font-size: 1.1em
|
34 |
+
line-height: 1.5em
|
35 |
+
|
36 |
+
h1, h2, h3, h4, h5, h6, p, ul, li
|
37 |
+
color: inherit
|
38 |
+
|
39 |
+
.vex-close
|
40 |
+
+border-radius(5px)
|
41 |
+
position: absolute
|
42 |
+
top: 0
|
43 |
+
right: 0
|
44 |
+
cursor: pointer
|
45 |
+
|
46 |
+
&:before
|
47 |
+
+border-radius(3px)
|
48 |
+
position: absolute
|
49 |
+
content: "\00D7"
|
50 |
+
font-size: 26px
|
51 |
+
font-weight: normal
|
52 |
+
line-height: 31px
|
53 |
+
height: 30px
|
54 |
+
width: 30px
|
55 |
+
text-align: center
|
56 |
+
top: 3px
|
57 |
+
right: 3px
|
58 |
+
color: #bbb
|
59 |
+
background: transparent
|
60 |
+
|
61 |
+
&:hover:before, &:active:before
|
62 |
+
color: #777
|
63 |
+
background: #e0e0e0
|
64 |
+
|
65 |
+
.vex-dialog-form
|
66 |
+
|
67 |
+
.vex-dialog-message
|
68 |
+
margin-bottom: .5em
|
69 |
+
|
70 |
+
.vex-dialog-input
|
71 |
+
margin-bottom: 1em
|
72 |
+
|
73 |
+
textarea, input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]
|
74 |
+
+border-radius(3px)
|
75 |
+
background: #fff
|
76 |
+
width: 100%
|
77 |
+
padding: .25em .67em
|
78 |
+
border: 0
|
79 |
+
font-family: inherit
|
80 |
+
font-weight: inherit
|
81 |
+
font-size: inherit
|
82 |
+
min-height: 2.5em
|
83 |
+
margin: 0 0 .25em
|
84 |
+
|
85 |
+
&:focus
|
86 |
+
+box-shadow(inset 0 0 0 2px lighten($blue, 20%))
|
87 |
+
outline: none
|
88 |
+
|
89 |
+
.vex-dialog-buttons
|
90 |
+
+pie-clearfix()
|
91 |
+
|
92 |
+
.vex-dialog-button
|
93 |
+
+border-radius(3px)
|
94 |
+
border: 0
|
95 |
+
float: right
|
96 |
+
margin: 0 0 0 .5em
|
97 |
+
font-family: inherit
|
98 |
+
text-transform: uppercase
|
99 |
+
letter-spacing: .1em
|
100 |
+
font-size: .8em
|
101 |
+
line-height: 1em
|
102 |
+
padding: .75em 2em
|
103 |
+
|
104 |
+
&.vex-last
|
105 |
+
margin-left: 0
|
106 |
+
|
107 |
+
&:focus
|
108 |
+
+vex-animation(vex-pulse 1.1s infinite)
|
109 |
+
outline: none
|
110 |
+
|
111 |
+
// vex-pulse uses -webkit-filter which
|
112 |
+
// doesn't play so nice in mobile webkit
|
113 |
+
@media (max-width: 568px)
|
114 |
+
+vex-animation(none)
|
115 |
+
|
116 |
+
&.vex-dialog-button-primary
|
117 |
+
background: $blue
|
118 |
+
color: #fff
|
119 |
+
|
120 |
+
&.vex-dialog-button-secondary
|
121 |
+
background: #e0e0e0
|
122 |
+
color: #777
|
123 |
+
|
124 |
+
.vex-loading-spinner.vex-theme-default
|
125 |
+
+box-shadow(0 0 0 .5em #f0f0f0, 0 0 1px .5em rgba(0, 0, 0, 0.3))
|
126 |
+
+border-radius(100%)
|
127 |
+
background: #f0f0f0
|
128 |
+
border: .2em solid transparent
|
129 |
+
border-top-color: #bbb
|
130 |
+
top: -1.1em
|
131 |
+
bottom: auto
|
power-ups/subscribe-widget/frontend/sass/_vex-theme-top.sass
ADDED
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
@import compass/utilities/general/clearfix
|
3 |
+
|
4 |
+
@import mixins
|
5 |
+
@import keyframes
|
6 |
+
|
7 |
+
+keyframes-vex-dropin
|
8 |
+
+keyframes-vex-dropout
|
9 |
+
+keyframes-vex-pulse
|
10 |
+
|
11 |
+
$blue: #3288e6
|
12 |
+
|
13 |
+
.vex.vex-theme-top
|
14 |
+
bottom: inherit
|
15 |
+
|
16 |
+
.vex-overlay
|
17 |
+
display: none
|
18 |
+
|
19 |
+
&.vex-closing .vex-content
|
20 |
+
+vex-animation(vex-dropout .5s)
|
21 |
+
|
22 |
+
.vex-content
|
23 |
+
+vex-animation(vex-dropin .5s)
|
24 |
+
+pie-clearfix()
|
25 |
+
font-family: "Helvetica Neue", sans-serif
|
26 |
+
background: #f0f0f0
|
27 |
+
color: #444
|
28 |
+
padding: 0.5em 0.5em 0.25em
|
29 |
+
position: relative
|
30 |
+
margin: 0 auto
|
31 |
+
max-width: 100%
|
32 |
+
font-size: 1.1em
|
33 |
+
line-height: 1.5em
|
34 |
+
|
35 |
+
h1, h2, h3, h4, h5, h6, p, ul, li
|
36 |
+
color: inherit
|
37 |
+
|
38 |
+
.vex-close
|
39 |
+
+border-radius(5px)
|
40 |
+
position: absolute
|
41 |
+
top: 0
|
42 |
+
right: 0
|
43 |
+
cursor: pointer
|
44 |
+
|
45 |
+
&:before
|
46 |
+
+border-radius(3px)
|
47 |
+
position: absolute
|
48 |
+
content: "\00D7"
|
49 |
+
font-size: 26px
|
50 |
+
font-weight: normal
|
51 |
+
line-height: 31px
|
52 |
+
height: 30px
|
53 |
+
width: 30px
|
54 |
+
text-align: center
|
55 |
+
top: 3px
|
56 |
+
right: 3px
|
57 |
+
color: #bbb
|
58 |
+
background: transparent
|
59 |
+
|
60 |
+
&:hover:before, &:active:before
|
61 |
+
color: #777
|
62 |
+
background: #e0e0e0
|
63 |
+
|
64 |
+
.vex-dialog-form
|
65 |
+
text-align: center
|
66 |
+
margin: 0 90px
|
67 |
+
|
68 |
+
@media only screen and (max-width: 760px)
|
69 |
+
margin: 0 auto
|
70 |
+
|
71 |
+
.vex-dialog-message, .vex-dialog-input, .vex-dialog-buttons
|
72 |
+
display: inline-block
|
73 |
+
|
74 |
+
.vex-dialog-input
|
75 |
+
min-width: 200px
|
76 |
+
margin: 0 1em
|
77 |
+
|
78 |
+
textarea, input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]
|
79 |
+
+border-radius(3px)
|
80 |
+
background: #fff
|
81 |
+
width: 100%
|
82 |
+
padding: .25em .67em
|
83 |
+
border: 0
|
84 |
+
font-family: inherit
|
85 |
+
font-weight: inherit
|
86 |
+
font-size: inherit
|
87 |
+
min-height: 2.5em
|
88 |
+
margin: 0 0 0 0
|
89 |
+
|
90 |
+
&:focus
|
91 |
+
+box-shadow(inset 0 0 0 2px lighten($blue, 20%))
|
92 |
+
outline: none
|
93 |
+
|
94 |
+
.vex-dialog-buttons
|
95 |
+
+pie-clearfix()
|
96 |
+
|
97 |
+
input
|
98 |
+
float: none
|
99 |
+
|
100 |
+
.leadin-subscribe-powered-by
|
101 |
+
position: absolute
|
102 |
+
bottom: 0.5em
|
103 |
+
right: 0.5em
|
104 |
+
|
105 |
+
.vex-dialog-button
|
106 |
+
+border-radius(3px)
|
107 |
+
border: 0
|
108 |
+
float: right
|
109 |
+
margin: 0 0 0 .5em
|
110 |
+
font-family: inherit
|
111 |
+
text-transform: uppercase
|
112 |
+
letter-spacing: .1em
|
113 |
+
font-size: .8em
|
114 |
+
line-height: 1em
|
115 |
+
padding: .75em 2em
|
116 |
+
|
117 |
+
&.vex-last
|
118 |
+
margin-left: 0
|
119 |
+
|
120 |
+
&:focus
|
121 |
+
+vex-animation(vex-pulse 1.1s infinite)
|
122 |
+
outline: none
|
123 |
+
|
124 |
+
// vex-pulse uses -webkit-filter which
|
125 |
+
// doesn't play so nice in mobile webkit
|
126 |
+
@media (max-width: 568px)
|
127 |
+
+vex-animation(none)
|
128 |
+
|
129 |
+
&.vex-dialog-button-primary
|
130 |
+
background: $blue
|
131 |
+
color: #fff
|
132 |
+
|
133 |
+
&.vex-dialog-button-secondary
|
134 |
+
background: #e0e0e0
|
135 |
+
color: #777
|
136 |
+
|
137 |
+
.vex-loading-spinner.vex-theme-top
|
138 |
+
+box-shadow(0 0 0 .5em #f0f0f0, 0 0 1px .5em rgba(0, 0, 0, 0.3))
|
139 |
+
+border-radius(100%)
|
140 |
+
background: #f0f0f0
|
141 |
+
border: .2em solid transparent
|
142 |
+
border-top-color: #bbb
|
143 |
+
top: -1.1em
|
144 |
+
bottom: auto
|
power-ups/subscribe-widget/frontend/sass/config.rb
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Compass is a great cross-platform tool for compiling SASS.
|
2 |
+
# This compass config file will allow you to
|
3 |
+
# quickly dive right in.
|
4 |
+
# For more info about compass + SASS: http://net.tutsplus.com/tutorials/html-css-techniques/using-compass-and-sass-for-css-in-your-next-project/
|
5 |
+
|
6 |
+
require 'susy'
|
7 |
+
|
8 |
+
#########
|
9 |
+
# 1. Set this to the root of your project when deployed:
|
10 |
+
http_path = "/"
|
11 |
+
|
12 |
+
# 2. probably don't need to touch these
|
13 |
+
css_dir = "../css"
|
14 |
+
sass_dir = "./"
|
15 |
+
images_dir = "../../images"
|
16 |
+
environment = :development
|
17 |
+
relative_assets = true
|
18 |
+
|
19 |
+
|
20 |
+
# 3. You can select your preferred output style here (can be overridden via the command line):
|
21 |
+
output_style = :expanded
|
22 |
+
|
23 |
+
# 4. When you are ready to launch your WP theme comment out (3) and uncomment the line below
|
24 |
+
# output_style = :compressed
|
25 |
+
|
26 |
+
# To disable debugging comments that display the original location of your selectors. Uncomment:
|
27 |
+
# line_comments = false
|
28 |
+
|
29 |
+
# don't touch this
|
30 |
+
preferred_syntax = :sass
|
power-ups/subscribe-widget/frontend/sass/vex.sass
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
|
3 |
+
@import mixins
|
4 |
+
@import keyframes
|
5 |
+
|
6 |
+
@import vex-theme-default
|
7 |
+
@import vex-theme-bottom-right-corner
|
8 |
+
@import vex-theme-top
|
9 |
+
|
10 |
+
|
11 |
+
+keyframes-vex-fadein
|
12 |
+
+keyframes-vex-fadeout
|
13 |
+
|
14 |
+
+keyframes-vex-rotation
|
15 |
+
|
16 |
+
.vex, .vex *, .vex *:before, .vex *:after
|
17 |
+
+box-sizing(border-box)
|
18 |
+
|
19 |
+
.vex
|
20 |
+
position: fixed
|
21 |
+
overflow: visible
|
22 |
+
-webkit-overflow-scrolling: touch
|
23 |
+
z-index: 1111
|
24 |
+
top: 0
|
25 |
+
right: 0
|
26 |
+
bottom: 0
|
27 |
+
left: 0
|
28 |
+
|
29 |
+
// IE
|
30 |
+
.vex-overlay
|
31 |
+
background: #000
|
32 |
+
filter: alpha(opacity=40) /* IE 5–7 */
|
33 |
+
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)" /* IE 8 */
|
34 |
+
|
35 |
+
.vex-overlay
|
36 |
+
+vex-animation(vex-fadein .5s)
|
37 |
+
position: fixed
|
38 |
+
background: rgba(0, 0, 0, .4)
|
39 |
+
top: 0
|
40 |
+
right: 0
|
41 |
+
bottom: 0
|
42 |
+
left: 0
|
43 |
+
|
44 |
+
.vex.vex-closing &
|
45 |
+
+vex-animation(vex-fadeout .5s)
|
46 |
+
|
47 |
+
.vex-content
|
48 |
+
+pie-clearfix()
|
49 |
+
+vex-animation(vex-fadein .5s)
|
50 |
+
+box-shadow(0px 1px 2px rgba(0,0,0,.15))
|
51 |
+
background: #fff
|
52 |
+
|
53 |
+
.vex.vex-closing &
|
54 |
+
+vex-animation(vex-fadeout .5s)
|
55 |
+
|
56 |
+
.powered-by
|
57 |
+
display: block
|
58 |
+
font-size: 11px
|
59 |
+
color: #888
|
60 |
+
padding: 10px 0 0 0
|
61 |
+
|
62 |
+
.vex-dialog-message, .vex-dialog-input, .vex-dialog-buttons
|
63 |
+
+pie-clearfix()
|
64 |
+
font-size: 16px
|
65 |
+
|
66 |
+
.leadin-subscribe-powered-by
|
67 |
+
float: right
|
68 |
+
font-size: 12px
|
69 |
+
font-weight: bold
|
70 |
+
color: #3288e6
|
71 |
+
|
72 |
+
.vex-close:before
|
73 |
+
font-family: Arial, sans-serif
|
74 |
+
content: "\00D7"
|
75 |
+
|
76 |
+
.vex-dialog-form
|
77 |
+
margin: 0 // Browser reset
|
78 |
+
|
79 |
+
.vex-dialog-message
|
80 |
+
font-weight: bold
|
81 |
+
|
82 |
+
.vex-dialog-button
|
83 |
+
-webkit-appearance: none
|
84 |
+
cursor: pointer
|
85 |
+
+border-radius(3px)
|
86 |
+
float: right
|
87 |
+
margin: 0 0 0 .5em
|
88 |
+
font-family: inherit
|
89 |
+
text-transform: uppercase
|
90 |
+
letter-spacing: .1em
|
91 |
+
font-size: .8em
|
92 |
+
line-height: 1em
|
93 |
+
padding: .75em 2em
|
94 |
+
|
95 |
+
&.vex-last
|
96 |
+
margin-left: 0
|
97 |
+
|
98 |
+
&:focus, &:hover
|
99 |
+
outline: none
|
100 |
+
|
101 |
+
&.vex-dialog-button-primary
|
102 |
+
+box-shadow(none)
|
103 |
+
border: 0
|
104 |
+
background: $blue
|
105 |
+
color: #fff
|
106 |
+
|
107 |
+
&:hover
|
108 |
+
background: lighten($blue, 10%)
|
109 |
+
|
110 |
+
&.vex-dialog-button-secondary
|
111 |
+
+box-shadow(none)
|
112 |
+
border: 0
|
113 |
+
background: #e0e0e0
|
114 |
+
color: #777
|
115 |
+
|
116 |
+
.vex-loading-spinner
|
117 |
+
+vex-animation(vex-rotation .7s linear infinite)
|
118 |
+
+box-shadow(0 0 1em rgba(0, 0, 0, 0.1))
|
119 |
+
position: fixed
|
120 |
+
z-index: 1112
|
121 |
+
margin: auto
|
122 |
+
top: 0
|
123 |
+
right: 0
|
124 |
+
bottom: 0
|
125 |
+
left: 0
|
126 |
+
height: 2em
|
127 |
+
width: 2em
|
128 |
+
background: #fff
|
129 |
+
|
130 |
+
|
131 |
+
@media only screen and (max-width: 760px)
|
132 |
+
#leadin-subscribe-mobile-check, .leadin-subscribe-powered-by
|
133 |
+
display: none
|
readme.txt
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
=== LeadIn ===
|
2 |
Contributors: andygcook, nelsonjoyce
|
3 |
-
Tags: lead tracking, visitor tracking, analytics, crm, marketing automation, inbound marketing, subscription, marketing, lead generation
|
4 |
Requires at least: 3.7
|
5 |
-
Tested up to: 3.8.
|
6 |
-
Stable tag: 0.
|
7 |
|
8 |
LeadIn is an easy-to-use marketing automation and lead tracking plugin for WordPress that helps you better understand your web site visitors.
|
9 |
|
@@ -88,8 +88,18 @@ To ensure quality we've tested the most popular WordPress form builder plugins.
|
|
88 |
|
89 |
== Changelog ==
|
90 |
|
91 |
-
Current version: 0.
|
92 |
-
Current version release: 2014-04-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
93 |
|
94 |
= 0.6.2 (2014.04.07) =
|
95 |
- Bug fixes
|
@@ -97,6 +107,7 @@ Current version release: 2014-04-07
|
|
97 |
- MySQL query optimizations
|
98 |
- Fixed bug with MySQL V5.0+ by adding default NULL values for insert statements on contacts table
|
99 |
- Changed title for returning lead email notifications
|
|
|
100 |
|
101 |
= Enhancements =
|
102 |
- Added ability to change button label on subscribe widget
|
@@ -114,18 +125,18 @@ Current version release: 2014-04-07
|
|
114 |
- Number of contacts does not equal leads + commenters + subscribers
|
115 |
- Modals aren't bound to forms after page load
|
116 |
- Fix bug with activating + reactivating the plugin overwriting the saved settings
|
117 |
-
- Override button styles for
|
118 |
|
119 |
= Enhancements =
|
120 |
- Improved readability on new lead notification emails
|
121 |
-
- Confirmation email added for new subscribers to the LeadIn Subscribe Pop-
|
122 |
- Updated screenshots
|
123 |
- Improved onboarding flow
|
124 |
- Deleted unused and deprecated files
|
125 |
|
126 |
= 0.5.1 (2014.03.03) =
|
127 |
- Bug fixes
|
128 |
-
- Fixed Subscribe Pop-
|
129 |
|
130 |
= 0.5.0 (2014.02.25) =
|
131 |
- Bug fixes
|
1 |
=== LeadIn ===
|
2 |
Contributors: andygcook, nelsonjoyce
|
3 |
+
Tags: lead tracking, visitor tracking, analytics, crm, marketing automation, inbound marketing, subscription, marketing, lead generation, mailchimp
|
4 |
Requires at least: 3.7
|
5 |
+
Tested up to: 3.8.2
|
6 |
+
Stable tag: 0.7.1
|
7 |
|
8 |
LeadIn is an easy-to-use marketing automation and lead tracking plugin for WordPress that helps you better understand your web site visitors.
|
9 |
|
88 |
|
89 |
== Changelog ==
|
90 |
|
91 |
+
Current version: 0.7.1
|
92 |
+
Current version release: 2014-04-11
|
93 |
+
|
94 |
+
= 0.7.1 (2014.04.11) =
|
95 |
+
-Bug fixes
|
96 |
+
- SVN bug fix that did not add the MailChimp List sync power-up
|
97 |
+
|
98 |
+
= 0.7.0 (2014.04.10) =
|
99 |
+
|
100 |
+
= Enhancements =
|
101 |
+
- MailChimp List Sync power-up
|
102 |
+
- Added new themes (bottom right, bottom left, top and pop-up) to the WordPress Subscribe Widget power-up
|
103 |
|
104 |
= 0.6.2 (2014.04.07) =
|
105 |
- Bug fixes
|
107 |
- MySQL query optimizations
|
108 |
- Fixed bug with MySQL V5.0+ by adding default NULL values for insert statements on contacts table
|
109 |
- Changed title for returning lead email notifications
|
110 |
+
- Setting to change button label on
|
111 |
|
112 |
= Enhancements =
|
113 |
- Added ability to change button label on subscribe widget
|
125 |
- Number of contacts does not equal leads + commenters + subscribers
|
126 |
- Modals aren't bound to forms after page load
|
127 |
- Fix bug with activating + reactivating the plugin overwriting the saved settings
|
128 |
+
- Override button styles for Subscribe Pop-up widget
|
129 |
|
130 |
= Enhancements =
|
131 |
- Improved readability on new lead notification emails
|
132 |
+
- Confirmation email added for new subscribers to the LeadIn Subscribe Pop-up
|
133 |
- Updated screenshots
|
134 |
- Improved onboarding flow
|
135 |
- Deleted unused and deprecated files
|
136 |
|
137 |
= 0.5.1 (2014.03.03) =
|
138 |
- Bug fixes
|
139 |
+
- Fixed Subscribe Pop-up automatically enabling itself
|
140 |
|
141 |
= 0.5.0 (2014.02.25) =
|
142 |
- Bug fixes
|
trunk/admin/css/leadin-admin.css
ADDED
@@ -0,0 +1,546 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* line 12, ../sass/_grid.sass */
|
2 |
+
#leadin {
|
3 |
+
*zoom: 1;
|
4 |
+
max-width: 1180px;
|
5 |
+
max-width: 73.75rem;
|
6 |
+
_width: 1180px;
|
7 |
+
padding-left: 20px;
|
8 |
+
padding-left: 1.25rem;
|
9 |
+
padding-right: 20px;
|
10 |
+
padding-right: 1.25rem;
|
11 |
+
margin-left: auto;
|
12 |
+
margin-right: auto;
|
13 |
+
margin: 0;
|
14 |
+
padding: 0;
|
15 |
+
}
|
16 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
17 |
+
#leadin:after {
|
18 |
+
content: "";
|
19 |
+
display: table;
|
20 |
+
clear: both;
|
21 |
+
}
|
22 |
+
@media (min-width: 782px) {
|
23 |
+
/* line 12, ../sass/_grid.sass */
|
24 |
+
#leadin {
|
25 |
+
*zoom: 1;
|
26 |
+
max-width: 1180px;
|
27 |
+
max-width: 73.75rem;
|
28 |
+
padding-left: 20px;
|
29 |
+
padding-left: 1.25rem;
|
30 |
+
padding-right: 20px;
|
31 |
+
padding-right: 1.25rem;
|
32 |
+
margin-left: auto;
|
33 |
+
margin-right: auto;
|
34 |
+
}
|
35 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
36 |
+
#leadin:after {
|
37 |
+
content: "";
|
38 |
+
display: table;
|
39 |
+
clear: both;
|
40 |
+
}
|
41 |
+
}
|
42 |
+
/* line 17, ../sass/_grid.sass */
|
43 |
+
#leadin * {
|
44 |
+
box-sizing: border-box;
|
45 |
+
}
|
46 |
+
@media (min-width: 782px) {
|
47 |
+
/* line 12, ../sass/_grid.sass */
|
48 |
+
#leadin {
|
49 |
+
margin: 0;
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
/* line 6, ../sass/_tables.sass */
|
54 |
+
#leadin .top_table_controls {
|
55 |
+
border-bottom: 2px solid #dedede;
|
56 |
+
margin: 0 0 18px 0;
|
57 |
+
margin-bottom: 16px;
|
58 |
+
*zoom: 1;
|
59 |
+
}
|
60 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
61 |
+
#leadin .top_table_controls:after {
|
62 |
+
content: "";
|
63 |
+
display: table;
|
64 |
+
clear: both;
|
65 |
+
}
|
66 |
+
/* line 12, ../sass/_tables.sass */
|
67 |
+
#leadin .table_segment_picker {
|
68 |
+
float: left;
|
69 |
+
margin: 0;
|
70 |
+
}
|
71 |
+
/* line 16, ../sass/_tables.sass */
|
72 |
+
#leadin .table_segment_picker li {
|
73 |
+
display: inline-block;
|
74 |
+
margin: 0;
|
75 |
+
}
|
76 |
+
/* line 20, ../sass/_tables.sass */
|
77 |
+
#leadin .table_segment_picker li + li {
|
78 |
+
margin-left: 2em;
|
79 |
+
}
|
80 |
+
/* line 22, ../sass/_tables.sass */
|
81 |
+
#leadin .table_segment_picker li a {
|
82 |
+
display: block;
|
83 |
+
padding: 12px 0;
|
84 |
+
line-height: 24px;
|
85 |
+
font-weight: 300;
|
86 |
+
font-size: 20px;
|
87 |
+
text-decoration: none;
|
88 |
+
}
|
89 |
+
/* line 30, ../sass/_tables.sass */
|
90 |
+
#leadin .table_segment_picker li a.current {
|
91 |
+
margin-bottom: -2px;
|
92 |
+
font-weight: 400;
|
93 |
+
border-bottom: 2px solid #f66000;
|
94 |
+
}
|
95 |
+
/* line 35, ../sass/_tables.sass */
|
96 |
+
#leadin .table_segment_picker li a.current, #leadin .table_segment_picker li a:hover, #leadin .table_segment_picker li a:active {
|
97 |
+
color: #f66000;
|
98 |
+
}
|
99 |
+
/* line 38, ../sass/_tables.sass */
|
100 |
+
#leadin .table_search {
|
101 |
+
float: right;
|
102 |
+
padding: 10px 0;
|
103 |
+
padding-bottom: 9px;
|
104 |
+
}
|
105 |
+
/* line 44, ../sass/_tables.sass */
|
106 |
+
#leadin table .leadin-contact-avatar {
|
107 |
+
float: left;
|
108 |
+
}
|
109 |
+
/* line 48, ../sass/_tables.sass */
|
110 |
+
#leadin.pre-mp6 .table_search {
|
111 |
+
float: right;
|
112 |
+
padding: 12px 0;
|
113 |
+
padding-bottom: 11px;
|
114 |
+
}
|
115 |
+
/* line 53, ../sass/_tables.sass */
|
116 |
+
#leadin.pre-mp6 table {
|
117 |
+
background-color: white;
|
118 |
+
border-color: #dedede;
|
119 |
+
}
|
120 |
+
/* line 59, ../sass/_tables.sass */
|
121 |
+
#leadin.pre-mp6 table tr.alternate {
|
122 |
+
background-color: white;
|
123 |
+
}
|
124 |
+
/* line 62, ../sass/_tables.sass */
|
125 |
+
#leadin.pre-mp6 table th, #leadin.pre-mp6 table td {
|
126 |
+
border-top: 0;
|
127 |
+
padding: 12px 6px 11px;
|
128 |
+
}
|
129 |
+
/* line 66, ../sass/_tables.sass */
|
130 |
+
#leadin.pre-mp6 table th a, #leadin.pre-mp6 table td a {
|
131 |
+
padding: 0;
|
132 |
+
}
|
133 |
+
/* line 69, ../sass/_tables.sass */
|
134 |
+
#leadin.pre-mp6 table th[scope="col"] {
|
135 |
+
background: #eeeeee;
|
136 |
+
font-family: sans-serif;
|
137 |
+
font-size: 12px;
|
138 |
+
text-shadow: none;
|
139 |
+
}
|
140 |
+
/* line 75, ../sass/_tables.sass */
|
141 |
+
#leadin.pre-mp6 table td {
|
142 |
+
border-color: #dedede;
|
143 |
+
line-height: 18px;
|
144 |
+
font-size: 14px;
|
145 |
+
}
|
146 |
+
/* line 80, ../sass/_tables.sass */
|
147 |
+
#leadin.pre-mp6 table td .row-actions {
|
148 |
+
float: left;
|
149 |
+
}
|
150 |
+
|
151 |
+
/* line 9, ../sass/leadin-admin.sass */
|
152 |
+
#leadin {
|
153 |
+
padding-right: 20px;
|
154 |
+
}
|
155 |
+
@media screen and (min-width: 500px) {
|
156 |
+
/* line 9, ../sass/leadin-admin.sass */
|
157 |
+
#leadin {
|
158 |
+
padding-right: 10px;
|
159 |
+
}
|
160 |
+
}
|
161 |
+
/* line 15, ../sass/leadin-admin.sass */
|
162 |
+
#leadin label {
|
163 |
+
cursor: default;
|
164 |
+
}
|
165 |
+
/* line 18, ../sass/leadin-admin.sass */
|
166 |
+
#leadin .col-wrap {
|
167 |
+
padding: 0 14px 0 0;
|
168 |
+
}
|
169 |
+
/* line 21, ../sass/leadin-admin.sass */
|
170 |
+
#leadin .metabox-holder {
|
171 |
+
*zoom: 1;
|
172 |
+
}
|
173 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
174 |
+
#leadin .metabox-holder:after {
|
175 |
+
content: "";
|
176 |
+
display: table;
|
177 |
+
clear: both;
|
178 |
+
}
|
179 |
+
/* line 24, ../sass/leadin-admin.sass */
|
180 |
+
#leadin #leadin-footer {
|
181 |
+
*zoom: 1;
|
182 |
+
clear: both;
|
183 |
+
margin-top: 48px;
|
184 |
+
color: #999999;
|
185 |
+
border-top: 1px solid #dedede;
|
186 |
+
}
|
187 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
188 |
+
#leadin #leadin-footer:after {
|
189 |
+
content: "";
|
190 |
+
display: table;
|
191 |
+
clear: both;
|
192 |
+
}
|
193 |
+
/* line 31, ../sass/leadin-admin.sass */
|
194 |
+
#leadin #leadin-footer .support .sharing {
|
195 |
+
height: 18px;
|
196 |
+
text-align: left;
|
197 |
+
}
|
198 |
+
@media screen and (min-width: 500px) {
|
199 |
+
/* line 36, ../sass/leadin-admin.sass */
|
200 |
+
#leadin #leadin-footer .support, #leadin #leadin-footer .version, #leadin #leadin-footer .sharing {
|
201 |
+
width: 50%;
|
202 |
+
float: left;
|
203 |
+
}
|
204 |
+
/* line 40, ../sass/leadin-admin.sass */
|
205 |
+
#leadin #leadin-footer .sharing {
|
206 |
+
text-align: right;
|
207 |
+
}
|
208 |
+
}
|
209 |
+
|
210 |
+
/* line 45, ../sass/leadin-admin.sass */
|
211 |
+
#wp-admin-bar-leadin-admin-menu img {
|
212 |
+
height: 16px;
|
213 |
+
width: 16px;
|
214 |
+
opacity: 0.6;
|
215 |
+
}
|
216 |
+
|
217 |
+
/* line 1, ../sass/_settings_page.sass */
|
218 |
+
#icon-leadin {
|
219 |
+
background: url("../../images/leadin-icon-32x32.png") top center no-repeat;
|
220 |
+
}
|
221 |
+
|
222 |
+
/* line 4, ../sass/_settings_page.sass */
|
223 |
+
.help-notification {
|
224 |
+
background: #d9edf7;
|
225 |
+
border: 1px solid #bce8f1;
|
226 |
+
padding: 10px;
|
227 |
+
-webkit-border-radius: 3px;
|
228 |
+
-moz-border-radius: 3px;
|
229 |
+
border-radius: 3px;
|
230 |
+
}
|
231 |
+
|
232 |
+
/* line 12, ../sass/_settings_page.sass */
|
233 |
+
.toplevel_page_leadin_contacts .wp-menu-image img {
|
234 |
+
width: 16px;
|
235 |
+
height: 16px;
|
236 |
+
}
|
237 |
+
|
238 |
+
/* line 16, ../sass/_settings_page.sass */
|
239 |
+
.leadin-contact-avatar {
|
240 |
+
margin-right: 10px;
|
241 |
+
}
|
242 |
+
|
243 |
+
/* line 19, ../sass/_settings_page.sass */
|
244 |
+
.power-up-settings-icon {
|
245 |
+
padding-right: 10px;
|
246 |
+
float: left;
|
247 |
+
max-height: 20px;
|
248 |
+
margin-top: -1px;
|
249 |
+
}
|
250 |
+
|
251 |
+
/* line 25, ../sass/_settings_page.sass */
|
252 |
+
.dashicons {
|
253 |
+
margin-right: 10px;
|
254 |
+
float: left;
|
255 |
+
margin-top: -1px;
|
256 |
+
}
|
257 |
+
|
258 |
+
/* line 30, ../sass/_settings_page.sass */
|
259 |
+
.steps {
|
260 |
+
margin: 48px auto 0;
|
261 |
+
text-align: center;
|
262 |
+
max-width: 600px;
|
263 |
+
}
|
264 |
+
/* line 35, ../sass/_settings_page.sass */
|
265 |
+
.steps h3, .steps p {
|
266 |
+
margin: 0;
|
267 |
+
}
|
268 |
+
/* line 38, ../sass/_settings_page.sass */
|
269 |
+
.steps .step-names {
|
270 |
+
margin: 0;
|
271 |
+
*zoom: 1;
|
272 |
+
}
|
273 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
274 |
+
.steps .step-names:after {
|
275 |
+
content: "";
|
276 |
+
display: table;
|
277 |
+
clear: both;
|
278 |
+
}
|
279 |
+
/* line 42, ../sass/_settings_page.sass */
|
280 |
+
.steps .step-names .step-name {
|
281 |
+
color: #cccccc;
|
282 |
+
display: list-item;
|
283 |
+
float: left;
|
284 |
+
width: 33%;
|
285 |
+
margin: 0;
|
286 |
+
padding-bottom: 18px;
|
287 |
+
font-size: 16px;
|
288 |
+
list-style: decimal inside none;
|
289 |
+
}
|
290 |
+
/* line 52, ../sass/_settings_page.sass */
|
291 |
+
.steps .step-names .step-name.active {
|
292 |
+
color: #1f7d71;
|
293 |
+
background-image: url(../../images/triangle.png);
|
294 |
+
background-position: bottom center;
|
295 |
+
background-repeat: no-repeat;
|
296 |
+
}
|
297 |
+
/* line 58, ../sass/_settings_page.sass */
|
298 |
+
.steps .step-names .step-name.completed {
|
299 |
+
list-style-image: url(../../images/checkmark.png);
|
300 |
+
}
|
301 |
+
/* line 61, ../sass/_settings_page.sass */
|
302 |
+
.steps .step-content {
|
303 |
+
margin: 0;
|
304 |
+
}
|
305 |
+
/* line 64, ../sass/_settings_page.sass */
|
306 |
+
.steps .step-content .description {
|
307 |
+
margin: 10px 0 20px;
|
308 |
+
display: block;
|
309 |
+
}
|
310 |
+
/* line 68, ../sass/_settings_page.sass */
|
311 |
+
.steps .step {
|
312 |
+
display: none;
|
313 |
+
padding: 18px;
|
314 |
+
background-color: #d3eeeb;
|
315 |
+
border: 2px solid #22aa99;
|
316 |
+
-moz-border-radius: 5px;
|
317 |
+
-webkit-border-radius: 5px;
|
318 |
+
border-radius: 5px;
|
319 |
+
color: #1f7d71;
|
320 |
+
}
|
321 |
+
/* line 76, ../sass/_settings_page.sass */
|
322 |
+
.steps .step h2 {
|
323 |
+
color: #1f7d71;
|
324 |
+
margin-top: 0;
|
325 |
+
margin-bottom: 18px;
|
326 |
+
}
|
327 |
+
/* line 82, ../sass/_settings_page.sass */
|
328 |
+
.steps .step ol {
|
329 |
+
text-align: left;
|
330 |
+
margin-bottom: 18px;
|
331 |
+
}
|
332 |
+
/* line 86, ../sass/_settings_page.sass */
|
333 |
+
.steps .step label {
|
334 |
+
text-align: right;
|
335 |
+
}
|
336 |
+
/* line 89, ../sass/_settings_page.sass */
|
337 |
+
.steps .step.active {
|
338 |
+
display: block;
|
339 |
+
}
|
340 |
+
/* line 93, ../sass/_settings_page.sass */
|
341 |
+
.steps .step .form-table th {
|
342 |
+
display: none;
|
343 |
+
}
|
344 |
+
/* line 96, ../sass/_settings_page.sass */
|
345 |
+
.steps .step .form-table td {
|
346 |
+
text-align: center;
|
347 |
+
width: auto;
|
348 |
+
display: block;
|
349 |
+
}
|
350 |
+
/* line 101, ../sass/_settings_page.sass */
|
351 |
+
.steps .step .form-table input {
|
352 |
+
width: 100%;
|
353 |
+
font-size: 16px;
|
354 |
+
line-height: 1.5;
|
355 |
+
padding: 7px 10px;
|
356 |
+
display: block;
|
357 |
+
}
|
358 |
+
|
359 |
+
/* line 5, ../sass/_contacts_list_page.sass */
|
360 |
+
#leadin-contacts th#source {
|
361 |
+
width: 20%;
|
362 |
+
}
|
363 |
+
/* line 8, ../sass/_contacts_list_page.sass */
|
364 |
+
#leadin-contacts th#visits, #leadin-contacts th#submissions {
|
365 |
+
width: 8%;
|
366 |
+
}
|
367 |
+
/* line 11, ../sass/_contacts_list_page.sass */
|
368 |
+
#leadin-contacts th#status, #leadin-contacts th#last_visit, #leadin-contacts th#date, #leadin-contacts th#pageviews {
|
369 |
+
width: 10%;
|
370 |
+
}
|
371 |
+
|
372 |
+
/* line 3, ../sass/_contact_detail_page.sass */
|
373 |
+
#leadin .header-wrap {
|
374 |
+
*zoom: 1;
|
375 |
+
padding: 9px 15px 4px 0;
|
376 |
+
}
|
377 |
+
/* line 38, ../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-core-1.0.0.alpha.19/stylesheets/compass/utilities/general/_clearfix.scss */
|
378 |
+
#leadin .header-wrap:after {
|
379 |
+
content: "";
|
380 |
+
display: table;
|
381 |
+
clear: both;
|
382 |
+
}
|
383 |
+
/* line 7, ../sass/_contact_detail_page.sass */
|
384 |
+
#leadin .header-wrap h1, #leadin .header-wrap img {
|
385 |
+
float: left;
|
386 |
+
}
|
387 |
+
/* line 10, ../sass/_contact_detail_page.sass */
|
388 |
+
#leadin .header-wrap h1 {
|
389 |
+
padding: 0 0 0 10px;
|
390 |
+
margin: 0;
|
391 |
+
}
|
392 |
+
/* line 14, ../sass/_contact_detail_page.sass */
|
393 |
+
#leadin .contact-name {
|
394 |
+
line-height: 40px;
|
395 |
+
}
|
396 |
+
/* line 19, ../sass/_contact_detail_page.sass */
|
397 |
+
#leadin .contact-info label {
|
398 |
+
font-weight: bold;
|
399 |
+
line-height: 1;
|
400 |
+
cursor: default;
|
401 |
+
}
|
402 |
+
/* line 24, ../sass/_contact_detail_page.sass */
|
403 |
+
#leadin .contact-history {
|
404 |
+
padding-left: 20px;
|
405 |
+
margin-left: 20px;
|
406 |
+
border-left: 2px solid #dedede;
|
407 |
+
}
|
408 |
+
/* line 31, ../sass/_contact_detail_page.sass */
|
409 |
+
#leadin .contact-history .session + .session {
|
410 |
+
margin-top: 30px;
|
411 |
+
}
|
412 |
+
/* line 34, ../sass/_contact_detail_page.sass */
|
413 |
+
#leadin .contact-history .session-date {
|
414 |
+
position: relative;
|
415 |
+
}
|
416 |
+
/* line 37, ../sass/_contact_detail_page.sass */
|
417 |
+
#leadin .contact-history .session-date:before {
|
418 |
+
content: "\2022";
|
419 |
+
font-size: 32px;
|
420 |
+
line-height: 0;
|
421 |
+
height: 31px;
|
422 |
+
width: 31px;
|
423 |
+
position: absolute;
|
424 |
+
left: -27px;
|
425 |
+
top: 9px;
|
426 |
+
color: #dedede;
|
427 |
+
}
|
428 |
+
/* line 48, ../sass/_contact_detail_page.sass */
|
429 |
+
#leadin .contact-history .events {
|
430 |
+
background-color: white;
|
431 |
+
border: 1px solid #dedede;
|
432 |
+
-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
433 |
+
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
434 |
+
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
435 |
+
}
|
436 |
+
/* line 53, ../sass/_contact_detail_page.sass */
|
437 |
+
#leadin .contact-history .event {
|
438 |
+
margin: 0;
|
439 |
+
padding: 10px 20px;
|
440 |
+
border-bottom: 1px solid #dedede;
|
441 |
+
border-left: 4px solid;
|
442 |
+
}
|
443 |
+
/* line 60, ../sass/_contact_detail_page.sass */
|
444 |
+
#leadin .contact-history .event:first-child {
|
445 |
+
border-top: 0;
|
446 |
+
}
|
447 |
+
/* line 63, ../sass/_contact_detail_page.sass */
|
448 |
+
#leadin .contact-history .event.pageview {
|
449 |
+
border-left-color: #2288cc;
|
450 |
+
color: #2288cc;
|
451 |
+
}
|
452 |
+
/* line 67, ../sass/_contact_detail_page.sass */
|
453 |
+
#leadin .contact-history .event.form-submission {
|
454 |
+
border-left-color: #f66000;
|
455 |
+
color: #f66000;
|
456 |
+
}
|
457 |
+
/* line 71, ../sass/_contact_detail_page.sass */
|
458 |
+
#leadin .contact-history .event.source {
|
459 |
+
border-left-color: #99aa1f;
|
460 |
+
color: #99aa1f;
|
461 |
+
}
|
462 |
+
/* line 75, ../sass/_contact_detail_page.sass */
|
463 |
+
#leadin .contact-history .event-title {
|
464 |
+
margin: 0;
|
465 |
+
font-size: 13px;
|
466 |
+
font-weight: 600;
|
467 |
+
}
|
468 |
+
/* line 80, ../sass/_contact_detail_page.sass */
|
469 |
+
#leadin .contact-history .event-time-range {
|
470 |
+
float: right;
|
471 |
+
font-weight: 400;
|
472 |
+
font-size: 0.85em;
|
473 |
+
color: #999999;
|
474 |
+
}
|
475 |
+
/* line 86, ../sass/_contact_detail_page.sass */
|
476 |
+
#leadin .contact-history .event-detail {
|
477 |
+
margin-top: 20px;
|
478 |
+
color: #444444;
|
479 |
+
}
|
480 |
+
/* line 90, ../sass/_contact_detail_page.sass */
|
481 |
+
#leadin .contact-history .event-detail li + li {
|
482 |
+
padding-top: 6px;
|
483 |
+
border-top: 1px solid #eeeeee;
|
484 |
+
}
|
485 |
+
/* line 95, ../sass/_contact_detail_page.sass */
|
486 |
+
#leadin .contact-history .visit-source p {
|
487 |
+
margin: 0;
|
488 |
+
color: #1f6696;
|
489 |
+
}
|
490 |
+
/* line 99, ../sass/_contact_detail_page.sass */
|
491 |
+
#leadin .contact-history .pageview-url {
|
492 |
+
margin: 0;
|
493 |
+
color: #cccccc;
|
494 |
+
}
|
495 |
+
/* line 103, ../sass/_contact_detail_page.sass */
|
496 |
+
#leadin .contact-history .field-label {
|
497 |
+
text-transform: uppercase;
|
498 |
+
letter-spacing: 0.05em;
|
499 |
+
color: #999999;
|
500 |
+
margin-bottom: 6px;
|
501 |
+
font-size: 0.9em;
|
502 |
+
}
|
503 |
+
/* line 110, ../sass/_contact_detail_page.sass */
|
504 |
+
#leadin .contact-history .field-value {
|
505 |
+
margin: 0;
|
506 |
+
}
|
507 |
+
/* line 115, ../sass/_contact_detail_page.sass */
|
508 |
+
#leadin.pre-mp6 .events {
|
509 |
+
background-color: #f9f9f9;
|
510 |
+
}
|
511 |
+
|
512 |
+
/* line 1, ../sass/_powerups_page.sass */
|
513 |
+
.powerup-list {
|
514 |
+
margin: 0;
|
515 |
+
}
|
516 |
+
/* line 4, ../sass/_powerups_page.sass */
|
517 |
+
.powerup-list .powerup {
|
518 |
+
border: 2px solid;
|
519 |
+
width: 20%;
|
520 |
+
min-width: 250px;
|
521 |
+
float: left;
|
522 |
+
margin: 20px;
|
523 |
+
padding: 15px;
|
524 |
+
background-color: #f9f9f9;
|
525 |
+
border-color: #cccccc;
|
526 |
+
text-align: center;
|
527 |
+
-moz-border-radius: 10px;
|
528 |
+
-webkit-border-radius: 10px;
|
529 |
+
border-radius: 10px;
|
530 |
+
}
|
531 |
+
/* line 16, ../sass/_powerups_page.sass */
|
532 |
+
.powerup-list .powerup h2, .powerup-list .powerup p, .powerup-list .powerup img {
|
533 |
+
margin: 0;
|
534 |
+
padding: 0;
|
535 |
+
color: #666666;
|
536 |
+
margin-bottom: 15px;
|
537 |
+
}
|
538 |
+
/* line 22, ../sass/_powerups_page.sass */
|
539 |
+
.powerup-list .powerup.activated {
|
540 |
+
background-color: #d3eeeb;
|
541 |
+
border-color: #1f7d71;
|
542 |
+
}
|
543 |
+
/* line 26, ../sass/_powerups_page.sass */
|
544 |
+
.powerup-list .powerup.activated h2, .powerup-list .powerup.activated p {
|
545 |
+
color: #1f7d71;
|
546 |
+
}
|
trunk/admin/inc/class-leadin-contact.php
ADDED
@@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
//=============================================
|
3 |
+
// LI_Contact Class
|
4 |
+
//=============================================
|
5 |
+
class LI_Contact {
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Variables
|
9 |
+
*/
|
10 |
+
var $hashkey;
|
11 |
+
var $history;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Class constructor
|
15 |
+
*/
|
16 |
+
function LI_Contact () {
|
17 |
+
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Gets hashkey from lead id
|
22 |
+
*
|
23 |
+
* @param int
|
24 |
+
* @return string
|
25 |
+
*/
|
26 |
+
function set_hashkey_by_id ( $lead_id ) {
|
27 |
+
global $wpdb;
|
28 |
+
$q = $wpdb->prepare("SELECT hashkey FROM li_leads WHERE lead_id = %d", $lead_id);
|
29 |
+
$this->hashkey = $wpdb->get_var($q);
|
30 |
+
|
31 |
+
return $this->hashkey;
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Gets contact history from the database (pageviews, form submissions, and lead details)
|
36 |
+
*
|
37 |
+
* @param string
|
38 |
+
* @return object $history (pageviews_by_session, submission, lead)
|
39 |
+
*/
|
40 |
+
function get_contact_history () {
|
41 |
+
global $wpdb;
|
42 |
+
|
43 |
+
// Get the contact details
|
44 |
+
$q = $wpdb->prepare("
|
45 |
+
SELECT
|
46 |
+
DATE_FORMAT(lead_date, %s) AS lead_date,
|
47 |
+
lead_ip,
|
48 |
+
lead_source,
|
49 |
+
lead_email,
|
50 |
+
lead_status
|
51 |
+
FROM
|
52 |
+
li_leads
|
53 |
+
WHERE hashkey LIKE %s", '%b %D %l:%i%p', $this->hashkey);
|
54 |
+
|
55 |
+
$lead = $wpdb->get_row($q);
|
56 |
+
|
57 |
+
// Get all page views for the contact
|
58 |
+
$q = $wpdb->prepare("
|
59 |
+
SELECT
|
60 |
+
pageview_id,
|
61 |
+
pageview_date AS event_date,
|
62 |
+
DATE_FORMAT(pageview_date, %s) AS pageview_day,
|
63 |
+
DATE_FORMAT(pageview_date, %s) AS pageview_date,
|
64 |
+
lead_hashkey, pageview_title, pageview_url, pageview_source, pageview_session_start
|
65 |
+
FROM
|
66 |
+
li_pageviews
|
67 |
+
WHERE
|
68 |
+
lead_hashkey LIKE %s ORDER BY event_date DESC", '%b %D', '%b %D %l:%i%p', $this->hashkey);
|
69 |
+
|
70 |
+
$pageviews = $wpdb->get_results($q, ARRAY_A);
|
71 |
+
|
72 |
+
// Get all submissions for the contact
|
73 |
+
$q = $wpdb->prepare("
|
74 |
+
SELECT
|
75 |
+
form_date AS event_date,
|
76 |
+
DATE_FORMAT(form_date, %s) AS form_date,
|
77 |
+
form_page_title,
|
78 |
+
form_page_url,
|
79 |
+
form_fields,
|
80 |
+
form_type
|
81 |
+
FROM
|
82 |
+
li_submissions
|
83 |
+
WHERE
|
84 |
+
lead_hashkey = '%s' ORDER BY event_date DESC", '%b %D %l:%i%p', $this->hashkey);
|
85 |
+
|
86 |
+
$submissions = $wpdb->get_results($q, ARRAY_A);
|
87 |
+
|
88 |
+
// Merge the page views array and submissions array and reorder by date
|
89 |
+
$events_array = array_merge($pageviews, $submissions);
|
90 |
+
usort($events_array, array('LI_Contact','sort_by_event_date'));
|
91 |
+
|
92 |
+
$sessions = array();
|
93 |
+
$cur_array = '0';
|
94 |
+
$first_iteration = TRUE;
|
95 |
+
$count = 0;
|
96 |
+
$cur_event = 0;
|
97 |
+
$prev_form_event = FALSE;
|
98 |
+
$total_visits = 0;
|
99 |
+
$total_pageviews = 0;
|
100 |
+
$total_submissions = 0;
|
101 |
+
|
102 |
+
foreach ( $events_array as $event_name => $event )
|
103 |
+
{
|
104 |
+
// Create a new session array if pageview started a new session
|
105 |
+
if ( (isset($event['pageview_session_start']) && $event['pageview_session_start'] ) || $first_iteration )
|
106 |
+
{
|
107 |
+
$cur_array = $count;
|
108 |
+
$sessions['session_' . $cur_array] = array();
|
109 |
+
$sessions['session_' . $cur_array]['session_date'] = $event['event_date'];
|
110 |
+
$sessions['session_' . $cur_array]['events'] = array();
|
111 |
+
|
112 |
+
if ( $first_iteration )
|
113 |
+
$first_iteration = FALSE;
|
114 |
+
|
115 |
+
$cur_event = $count;
|
116 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event] = array();
|
117 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['event_type'] = 'pageview';
|
118 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['event_date'] = $event['event_date'];
|
119 |
+
|
120 |
+
// Set the first submission if it's not set and then leave it alone
|
121 |
+
if ( !$lead->first_visit )
|
122 |
+
$lead->first_visit = $event['event_date'];
|
123 |
+
|
124 |
+
// Always overwrite the last_submission date which will end as last submission date
|
125 |
+
$lead->last_visit = $event['event_date'];
|
126 |
+
|
127 |
+
// Used for $lead->total_visits
|
128 |
+
$total_visits++;
|
129 |
+
}
|
130 |
+
|
131 |
+
// Pageview activity
|
132 |
+
if ( !isset($event['form_fields']) )
|
133 |
+
{
|
134 |
+
$cur_event = $count;
|
135 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event] = array();
|
136 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['event_type'] = 'pageview';
|
137 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['event_date'] = $event['event_date'];
|
138 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['activities'][] = $event;
|
139 |
+
$total_pageviews++;
|
140 |
+
}
|
141 |
+
else
|
142 |
+
{
|
143 |
+
$cur_event = $count;
|
144 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event] = array();
|
145 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['event_type'] = 'form';
|
146 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['event_date'] = $event['event_date'];
|
147 |
+
$sessions['session_' . $cur_array]['events']['event_' . $cur_event]['activities'][] = $event;
|
148 |
+
|
149 |
+
// Set the first submission if it's not set and then leave it alone
|
150 |
+
if ( !$lead->first_submission )
|
151 |
+
$lead->first_submission = $event['event_date'];
|
152 |
+
|
153 |
+
// Always overwrite the last_submission date which will end as last submission date
|
154 |
+
$lead->last_submission = $event['event_date'];
|
155 |
+
|
156 |
+
// Used for $lead->total_submissions
|
157 |
+
$total_submissions++;
|
158 |
+
}
|
159 |
+
|
160 |
+
$count++;
|
161 |
+
}
|
162 |
+
|
163 |
+
$lead->lead_status = $this->frontend_lead_status($lead->lead_status);
|
164 |
+
$lead->total_visits = $total_visits;
|
165 |
+
$lead->total_pageviews = $total_pageviews;
|
166 |
+
$lead->total_submissions = $total_submissions;
|
167 |
+
|
168 |
+
$this->history = (object)NULL;
|
169 |
+
$this->history->sessions = $sessions;
|
170 |
+
$this->history->lead = $lead;
|
171 |
+
|
172 |
+
return stripslashes_deep($this->history);
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* usort helper function to sort array by event date
|
177 |
+
*
|
178 |
+
* @param string
|
179 |
+
* @return array
|
180 |
+
*/
|
181 |
+
function sort_by_event_date ( $a, $b ) {
|
182 |
+
return $a['event_date'] > $b['event_date'];
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Normalizes li_leads.lead_status for front end display
|
187 |
+
*
|
188 |
+
* @param string
|
189 |
+
* @return string
|
190 |
+
*/
|
191 |
+
function frontend_lead_status ( $lead_status = 'lead' ) {
|
192 |
+
if ( $lead_status == 'lead' )
|
193 |
+
return 'Lead';
|
194 |
+
else if ( $lead_status == 'comment' )
|
195 |
+
return 'Commenter';
|
196 |
+
else
|
197 |
+
return 'Subscriber';
|
198 |
+
}
|
199 |
+
}
|
200 |
+
?>
|
trunk/admin/inc/class-leadin-list-table.php
ADDED
@@ -0,0 +1,455 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
//=============================================
|
4 |
+
// Include Needed Files
|
5 |
+
//=============================================
|
6 |
+
|
7 |
+
if ( !class_exists('WP_List_Table') )
|
8 |
+
require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
|
9 |
+
|
10 |
+
require_once(LEADIN_PLUGIN_DIR . '/inc/leadin-functions.php');
|
11 |
+
|
12 |
+
//=============================================
|
13 |
+
// LI_List_Table Class
|
14 |
+
//=============================================
|
15 |
+
class LI_List_Table extends WP_List_Table {
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Variables
|
19 |
+
*/
|
20 |
+
public $data = array();
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Class constructor
|
24 |
+
*/
|
25 |
+
function __construct ()
|
26 |
+
{
|
27 |
+
global $status, $page;
|
28 |
+
|
29 |
+
//Set parent defaults
|
30 |
+
parent::__construct( array(
|
31 |
+
'singular' => 'contact',
|
32 |
+
'plural' => 'contacts',
|
33 |
+
'ajax' => false
|
34 |
+
));
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Prints text for no rows found in table
|
39 |
+
*/
|
40 |
+
function no_items ()
|
41 |
+
{
|
42 |
+
_e('No contacts found.');
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Prints values for columns for which no column function has been defined
|
47 |
+
*
|
48 |
+
* @param object
|
49 |
+
* @param string
|
50 |
+
* @return * item value's type
|
51 |
+
*/
|
52 |
+
function column_default ( $item, $column_name )
|
53 |
+
{
|
54 |
+
switch ( $column_name )
|
55 |
+
{
|
56 |
+
case 'email':
|
57 |
+
|
58 |
+
case 'status':
|
59 |
+
return $item[$column_name];
|
60 |
+
case 'date':
|
61 |
+
return $item[$column_name];
|
62 |
+
case 'last_visit':
|
63 |
+
return $item[$column_name];
|
64 |
+
case 'submissions':
|
65 |
+
return $item[$column_name];
|
66 |
+
case 'pageviews':
|
67 |
+
return $item[$column_name];
|
68 |
+
case 'visits':
|
69 |
+
return $item[$column_name];
|
70 |
+
case 'source':
|
71 |
+
return $item[$column_name];
|
72 |
+
default:
|
73 |
+
return print_r($item,true);
|
74 |
+
}
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Prints text for email column
|
79 |
+
*
|
80 |
+
* @param object
|
81 |
+
* @return string
|
82 |
+
*/
|
83 |
+
function column_email ( $item )
|
84 |
+
{
|
85 |
+
//Build row actions
|
86 |
+
$actions = array(
|
87 |
+
'view' => sprintf('<div style="clear:both;"></div><a href="?page=%s&action=%s&lead=%s">View</a>',$_REQUEST['page'],'view',$item['ID']),
|
88 |
+
'delete' => sprintf('<a href="?page=%s&action=%s&lead=%s">Delete</a>',$_REQUEST['page'],'delete',$item['ID'])
|
89 |
+
);
|
90 |
+
|
91 |
+
//Return the title contents
|
92 |
+
return sprintf('%1$s<br/>%2$s',
|
93 |
+
/*$1%s*/ $item['email'],
|
94 |
+
/*$2%s*/ $this->row_actions($actions)
|
95 |
+
);
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Prints checkbox column
|
100 |
+
*
|
101 |
+
* @param object
|
102 |
+
* @return string
|
103 |
+
*/
|
104 |
+
function column_cb ( $item )
|
105 |
+
{
|
106 |
+
return sprintf(
|
107 |
+
'<input type="checkbox" name="%1$s[]" value="%2$s" />',
|
108 |
+
/*$1%s*/ $this->_args['singular'],
|
109 |
+
/*$2%s*/ $item['ID']
|
110 |
+
);
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Get all the columns for the list table
|
115 |
+
*
|
116 |
+
* @param object
|
117 |
+
* @param string
|
118 |
+
* @return array associative array of columns
|
119 |
+
*/
|
120 |
+
function get_columns ()
|
121 |
+
{
|
122 |
+
$columns = array(
|
123 |
+
'cb' => '<input type="checkbox" />',
|
124 |
+
'email' => 'Email',
|
125 |
+
'source' => 'Original source',
|
126 |
+
'status' => 'Status',
|
127 |
+
'visits' => 'Visits',
|
128 |
+
'pageviews' => 'Page views',
|
129 |
+
'submissions' => 'Forms',
|
130 |
+
'last_visit' => 'Last visit',
|
131 |
+
'date' => 'Created on'
|
132 |
+
);
|
133 |
+
return $columns;
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Defines sortable columns for table
|
138 |
+
*
|
139 |
+
* @param object
|
140 |
+
* @param string
|
141 |
+
* @return array associative array of columns
|
142 |
+
*/
|
143 |
+
function get_sortable_columns ()
|
144 |
+
{
|
145 |
+
$sortable_columns = array(
|
146 |
+
'email' => array('email',false), //true means it's already sorted
|
147 |
+
'status' => array('status',false),
|
148 |
+
'pageviews' => array('pageviews',false),
|
149 |
+
'visits' => array('visits',false),
|
150 |
+
'submissions' => array('submissions',false),
|
151 |
+
'date' => array('date',true),
|
152 |
+
'last_visit' => array('last_visit',false),
|
153 |
+
'source' => array('source',false)
|
154 |
+
);
|
155 |
+
return $sortable_columns;
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Get the bulk actions
|
160 |
+
*
|
161 |
+
* @return array associative array of actions
|
162 |
+
*/
|
163 |
+
function get_bulk_actions ()
|
164 |
+
{
|
165 |
+
$actions = array(
|
166 |
+
'delete' => 'Delete'
|
167 |
+
);
|
168 |
+
return $actions;
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* Process bulk actions for deleting
|
173 |
+
*/
|
174 |
+
function process_bulk_action ()
|
175 |
+
{
|
176 |
+
global $wpdb;
|
177 |
+
$ids_to_delete = '';
|
178 |
+
$hashes_to_delete = '';
|
179 |
+
|
180 |
+
if ( isset ($_GET['contact']) )
|
181 |
+
{
|
182 |
+
for ( $i = 0; $i < count($_GET['contact']); $i++ )
|
183 |
+
{
|
184 |
+
$ids_to_delete .= $_GET['contact'][$i];;
|
185 |
+
|
186 |
+
if ( $i != (count($_GET['contact'])-1) )
|
187 |
+
$ids_to_delete .= ',';
|
188 |
+
}
|
189 |
+
|
190 |
+
$q = $wpdb->prepare("SELECT hashkey FROM li_leads WHERE lead_id IN ( " . $ids_to_delete . " )", $ids_to_delete);
|
191 |
+
$hashes = $wpdb->get_results($q);
|
192 |
+
|
193 |
+
for ( $i = 0; $i < count($hashes); $i++ )
|
194 |
+
{
|
195 |
+
|
196 |
+
$hashes_to_delete .= "'". $hashes[$i]->hashkey. "'";
|
197 |
+
|
198 |
+
if ( $i != (count($hashes)-1) )
|
199 |
+
$hashes_to_delete .= ",";
|
200 |
+
}
|
201 |
+
|
202 |
+
//Detect when a bulk action is being triggered...
|
203 |
+
if( 'delete' === $this->current_action() )
|
204 |
+
{
|
205 |
+
$q = $wpdb->prepare("DELETE FROM li_pageviews WHERE lead_hashkey IN (" . $hashes_to_delete . ")", "");
|
206 |
+
$delete_pageviews = $wpdb->query($q);
|
207 |
+
|
208 |
+
$q = $wpdb->prepare("DELETE FROM li_submissions WHERE lead_hashkey IN (" . $hashes_to_delete . ")", "");
|
209 |
+
$delete_submissions = $wpdb->query($q);
|
210 |
+
|
211 |
+
$q = $wpdb->prepare("DELETE FROM li_leads WHERE lead_id IN (" . $ids_to_delete . ")", "");
|
212 |
+
$delete_leads = $wpdb->query($q);
|
213 |
+
}
|
214 |
+
}
|
215 |
+
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Get the leads for the contacts table based on $GET_['contact_type'] or $_GET['s'] (search)
|
220 |
+
*
|
221 |
+
* @return array associative array of all contacts
|
222 |
+
*/
|
223 |
+
function get_leads ()
|
224 |
+
{
|
225 |
+
global $wpdb;
|
226 |
+
|
227 |
+
$mysql_search_filter = '';
|
228 |
+
|
229 |
+
if ( isset($_GET['s']) )
|
230 |
+
{
|
231 |
+
$search_query = $_GET['s'];
|
232 |
+
$mysql_search_filter = $wpdb->prepare(" AND ( l.lead_email LIKE '%%%s%%' OR l.lead_source LIKE '%%%s%%' ) ", like_escape($search_query), like_escape($search_query));
|
233 |
+
}
|
234 |
+
|
235 |
+
if ( isset($_GET['contact_type']) )
|
236 |
+
{
|
237 |
+
$mysql_contact_type_filter = $wpdb->prepare("AND l.lead_status = %s ", $_GET['contact_type']);
|
238 |
+
}
|
239 |
+
else
|
240 |
+
{
|
241 |
+
$mysql_contact_type_filter = " AND ( l.lead_status = 'lead' OR l.lead_status = 'comment' OR l.lead_status = 'subscribe') ";
|
242 |
+
}
|
243 |
+
|
244 |
+
$q = $wpdb->prepare("
|
245 |
+
SELECT
|
246 |
+
l.lead_id AS lead_id,
|
247 |
+
LOWER(DATE_FORMAT(l.lead_date, %s)) AS lead_date, l.lead_ip, l.lead_source, l.lead_email, l.lead_status, l.hashkey,
|
248 |
+
COUNT(DISTINCT s.form_id) AS lead_form_submissions,
|
249 |
+
COUNT(DISTINCT p.pageview_id) AS lead_pageviews,
|
250 |
+
LOWER(DATE_FORMAT(MAX(p.pageview_date), %s)) AS last_visit
|
251 |
+
FROM
|
252 |
+
li_leads l
|
253 |
+
LEFT JOIN li_submissions s ON l.hashkey = s.lead_hashkey
|
254 |
+
LEFT JOIN li_pageviews p ON l.hashkey = p.lead_hashkey
|
255 |
+
WHERE l.lead_email != ''", '%Y/%m/%d %l:%i%p', '%Y/%m/%d %l:%i%p');
|
256 |
+
|
257 |
+
$q .= $mysql_contact_type_filter;
|
258 |
+
$q .= ( $mysql_search_filter ? $mysql_search_filter : "" );
|
259 |
+
$q .= " GROUP BY l.lead_email";
|
260 |
+
|
261 |
+
$leads = $wpdb->get_results($q);
|
262 |
+
|
263 |
+
$all_leads = array();
|
264 |
+
|
265 |
+
foreach ( $leads as $lead )
|
266 |
+
{
|
267 |
+
$q = $wpdb->prepare("SELECT COUNT(DISTINCT pageview_id) FROM li_pageviews WHERE lead_hashkey = %s AND pageview_session_start = 1", $lead->hashkey);
|
268 |
+
$pageviews = $wpdb->get_var($q);
|
269 |
+
$lead->lead_visits = $pageviews;
|
270 |
+
|
271 |
+
$lead_status = 'Lead';
|
272 |
+
|
273 |
+
if ( $lead->lead_status == 'subscribe' )
|
274 |
+
$lead_status = 'Subscriber';
|
275 |
+
else if ( $lead->lead_status == 'comment' )
|
276 |
+
$lead_status = 'Commenter';
|
277 |
+
|
278 |
+
$lead_array = array(
|
279 |
+
'ID' => $lead->lead_id,
|
280 |
+
'email' => sprintf('<a href="?page=%s&action=%s&lead=%s">' . "<img class='pull-left leadin-contact-avatar' src='https://app.getsignals.com/avatar/image/?emails=" . $lead->lead_email . "' width='35' height='35'/> " . '</a>', $_REQUEST['page'], 'view', $lead->lead_id) . sprintf('<a href="?page=%s&action=%s&lead=%s"><b>' . $lead->lead_email . '</b></a>', $_REQUEST['page'], 'view', $lead->lead_id),
|
281 |
+
'status' => $lead_status,
|
282 |
+
'visits' => ( !$lead->lead_visits ? 1 : $lead->lead_visits ),
|
283 |
+
'submissions' => $lead->lead_form_submissions,
|
284 |
+
'pageviews' => $lead->lead_pageviews,
|
285 |
+
'date' => $lead->lead_date,
|
286 |
+
'last_visit' => $lead->last_visit,
|
287 |
+
'source' => ( $lead->lead_source ? "<a title='Visit page' href='" . $lead->lead_source . "' target='_blank'>" . $lead->lead_source . "</a>" : 'Direct' )
|
288 |
+
);
|
289 |
+
|
290 |
+
array_push($all_leads, $lead_array);
|
291 |
+
}
|
292 |
+
|
293 |
+
return $all_leads;
|
294 |
+
}
|
295 |
+
|
296 |
+
/**
|
297 |
+
* Gets the total number of contacts, comments and subscribers for above the table
|
298 |
+
*/
|
299 |
+
function get_contact_type_totals ()
|
300 |
+
{
|
301 |
+
global $wpdb;
|
302 |
+
// @TODO Need to select distinct emails
|
303 |
+
$q = $wpdb->prepare("
|
304 |
+
SELECT
|
305 |
+
COUNT(DISTINCT lead_email) AS total_contacts,
|
306 |
+
( SELECT COUNT(DISTINCT lead_email) FROM li_leads WHERE lead_status = 'lead' AND lead_email != '' ) AS total_leads,
|
307 |
+
( SELECT COUNT(DISTINCT lead_email) FROM li_leads WHERE lead_status = 'comment' AND lead_email != '' ) AS total_comments,
|
308 |
+
( SELECT COUNT(DISTINCT lead_email) FROM li_leads WHERE lead_status = 'subscribe' AND lead_email != '' ) AS total_subscribes
|
309 |
+
FROM
|
310 |
+
li_leads
|
311 |
+
WHERE
|
312 |
+
lead_email != ''", "");
|
313 |
+
|
314 |
+
$totals = $wpdb->get_row($q);
|
315 |
+
return $totals;
|
316 |
+
}
|
317 |
+
|
318 |
+
/**
|
319 |
+
* Gets the current view based off $_GET['contact_type']
|
320 |
+
*
|
321 |
+
* @return string
|
322 |
+
*/
|
323 |
+
function get_view ()
|
324 |
+
{
|
325 |
+
$current = ( !empty($_GET['contact_type']) ? html_entity_decode($_GET['contact_type']) : 'all' );
|
326 |
+
return $current;
|
327 |
+
}
|
328 |
+
|
329 |
+
/**
|
330 |
+
* Get the view menus above the contacts table
|
331 |
+
*
|
332 |
+
* @return string
|
333 |
+
*/
|
334 |
+
function get_views ()
|
335 |
+
{
|
336 |
+
$views = array();
|
337 |
+
$totals = $this->get_contact_type_totals();
|
338 |
+
|
339 |
+
$current = ( !empty($_GET['contact_type']) ? html_entity_decode($_GET['contact_type']) : 'all' );
|
340 |
+
|
341 |
+
// All link
|
342 |
+
$class = ( $current == 'all' ? ' class="current"' :'' );
|
343 |
+
$all_url = remove_query_arg('contact_type');
|
344 |
+
$views['all'] = "<a href='{$all_url }' {$class} >" . ( $totals->total_leads + $totals->total_comments + $totals->total_subscribes ) . " total</a>";
|
345 |
+
|
346 |
+
// Leads link
|
347 |
+
$leads_url = add_query_arg('contact_type','lead');
|
348 |
+
$class = ( $current == 'lead' ? ' class="current"' :'' );
|
349 |
+
$views['contacts'] = "<a href='{$leads_url}' {$class} >" . leadin_single_plural_label($totals->total_leads, 'lead', 'leads') . "</a>";
|
350 |
+
|
351 |
+
// Commenters link
|
352 |
+
$comments_url = add_query_arg('contact_type','comment');
|
353 |
+
$class = ( $current == 'comment' ? ' class="current"' :'' );
|
354 |
+
$views['commenters'] = "<a href='{$comments_url}' {$class} >" . leadin_single_plural_label($totals->total_comments, 'commenter', 'commenters') . "</a>";
|
355 |
+
|
356 |
+
// Commenters link
|
357 |
+
$subscribers_url = add_query_arg('contact_type','subscribe');
|
358 |
+
$class = ( $current == 'subscribe' ? ' class="current"' :'' );
|
359 |
+
$views['subscribe'] = "<a href='{$subscribers_url}' {$class} >" . leadin_single_plural_label($totals->total_subscribes, 'subscriber', 'subscribers') . "</a>";
|
360 |
+
|
361 |
+
return $views;
|
362 |
+
}
|
363 |
+
|
364 |
+
/**
|
365 |
+
* Prints contacts menu above contacts table
|
366 |
+
*/
|
367 |
+
function views ()
|
368 |
+
{
|
369 |
+
$views = $this->get_views();
|
370 |
+
$views = apply_filters( 'views_' . $this->screen->id, $views );
|
371 |
+
|
372 |
+
$current_view = $this->get_view();
|
373 |
+
|
374 |
+
if ( $current_view == 'lead' )
|
375 |
+
$view_label = 'Leads';
|
376 |
+
else if ( $current_view == 'comment' )
|
377 |
+
$view_label = 'Commenters';
|
378 |
+
else if ( $current_view == 'subscribe' )
|
379 |
+
$view_label = 'Subscribers';
|
380 |
+
else
|
381 |
+
$view_label = 'Contacts';
|
382 |
+
|
383 |
+
if ( empty( $views ) )
|
384 |
+
return;
|
385 |
+
|
386 |
+
echo "<div class='top_table_controls'>\n";
|
387 |
+
|
388 |
+
echo "<ul class='table_segment_picker'>\n";
|
389 |
+
foreach ( $views as $class => $view ) {
|
390 |
+
$views[ $class ] = "\t<li class='$class'>$view";
|
391 |
+
}
|
392 |
+
echo implode( "</li>\n", $views ) . "</li>\n";
|
393 |
+
echo "</ul>";
|
394 |
+
|
395 |
+
echo "<span class='table_search'>\n";
|
396 |
+
echo "<label class='screen-reader-text' for='post-search-input'>Search Contacts:</label>";
|
397 |
+
echo "<input type='search' id='leadin-contact-search-input' name='s' value='" . print_submission_val('s') . "'/>";
|
398 |
+
if ( isset ($_GET['contact_type']) ) {
|
399 |
+
echo "<input type='hidden' name='contact_type' value='" . print_submission_val('contact_type') . "'/>";
|
400 |
+
}
|
401 |
+
echo "<input type='submit' name='' id='leadin-search-submit' class='button' value='Search " . $view_label . "'>";
|
402 |
+
echo "</span>";
|
403 |
+
|
404 |
+
echo "</div>";
|
405 |
+
}
|
406 |
+
|
407 |
+
/**
|
408 |
+
* Gets + prepares the contacts for the list table
|
409 |
+
*/
|
410 |
+
function prepare_items ()
|
411 |
+
{
|
412 |
+
global $wpdb;
|
413 |
+
|
414 |
+
$per_page = 10;
|
415 |
+
|
416 |
+
$columns = $this->get_columns();
|
417 |
+
$hidden = array();
|
418 |
+
$sortable = $this->get_sortable_columns();
|
419 |
+
$this->_column_headers = array($columns, $hidden, $sortable);
|
420 |
+
$this->process_bulk_action();
|
421 |
+
$this->data = $this->get_leads();;
|
422 |
+
|
423 |
+
$orderby = ( !empty($_REQUEST['orderby']) ? $_REQUEST['orderby'] : 'date' );
|
424 |
+
$order = ( !empty($_REQUEST['order']) ? $_REQUEST['order'] : 'desc' );
|
425 |
+
|
426 |
+
function usort_reorder($a,$b)
|
427 |
+
{
|
428 |
+
$orderby = ( !empty($_REQUEST['orderby']) ? $_REQUEST['orderby'] : 'date' );
|
429 |
+
$order = ( !empty($_REQUEST['order']) ? $_REQUEST['order'] : 'desc' );
|
430 |
+
|
431 |
+
if ( $a[$orderby] == $b[$orderby] )
|
432 |
+
$result = 0;
|
433 |
+
else if ( $a[$orderby] < $b[$orderby] )
|
434 |
+
$result = -1;
|
435 |
+
else
|
436 |
+
$result = 1;
|
437 |
+
|
438 |
+
return ( $order === 'asc' ? $result : -$result );
|
439 |
+
}
|
440 |
+
|
441 |
+
usort($this->data, 'usort_reorder');
|
442 |
+
|
443 |
+
$current_page = $this->get_pagenum();
|
444 |
+
$total_items = count($this->data);
|
445 |
+
$this->data = array_slice($this->data, (($current_page-1)*$per_page), $per_page);
|
446 |
+
$this->items = $this->data;
|
447 |
+
|
448 |
+
$this->set_pagination_args( array(
|
449 |
+
'total_items' => $total_items,
|
450 |
+
'per_page' => $per_page,
|
451 |
+
'total_pages' => ceil($total_items/$per_page)
|
452 |
+
) );
|
453 |
+
}
|
454 |
+
|
455 |
+
}
|
trunk/admin/inc/class-leadin-pointers.php
ADDED
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( !defined('LEADIN_PLUGIN_VERSION') )
|
4 |
+
{
|
5 |
+
header('HTTP/1.0 403 Forbidden');
|
6 |
+
die;
|
7 |
+
}
|
8 |
+
|
9 |
+
/**
|
10 |
+
* This class handles the pointers used in the introduction tour.
|
11 |
+
*
|
12 |
+
* @todo Add an introdutory pointer on the edit post page too.
|
13 |
+
*/
|
14 |
+
class LI_Pointers {
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Class constructor.
|
18 |
+
*/
|
19 |
+
function __construct ()
|
20 |
+
{
|
21 |
+
//=============================================
|
22 |
+
// Hooks & Filters
|
23 |
+
//=============================================
|
24 |
+
|
25 |
+
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Enqueue styles and scripts needed for the pointers.
|
30 |
+
*/
|
31 |
+
function enqueue ()
|
32 |
+
{
|
33 |
+
if ( !current_user_can( 'manage_options' ) )
|
34 |
+
return;
|
35 |
+
|
36 |
+
$options = get_option('leadin_options');
|
37 |
+
|
38 |
+
if ( !isset($options['ignore_settings_popup']) || !$options['ignore_settings_popup'] )
|
39 |
+
{
|
40 |
+
wp_enqueue_style( 'wp-pointer' );
|
41 |
+
wp_enqueue_script( 'jquery-ui' );
|
42 |
+
wp_enqueue_script( 'wp-pointer' );
|
43 |
+
wp_enqueue_script( 'utils' );
|
44 |
+
|
45 |
+
add_action('admin_print_footer_scripts', array( $this, 'li_settings_popup'));
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Shows a popup that asks for permission to allow tracking.
|
51 |
+
*/
|
52 |
+
function li_settings_popup() {
|
53 |
+
$id = '#toplevel_page_leadin_contacts';
|
54 |
+
$nonce = wp_create_nonce( 'wpseo_activate_tracking' );
|
55 |
+
|
56 |
+
$content = '<h3>' . __( 'Finish setting up LeadIn', 'leadin' ) . '</h3>';
|
57 |
+
$content .= '<p>' . __( 'You\'ve just installed LeadIn. Visit your settings page to make sure LeadIn is properly setup.', 'leadin' ) . '</p>';
|
58 |
+
$opt_arr = array(
|
59 |
+
'content' => $content,
|
60 |
+
'position' => array( 'edge' => 'left', 'align' => 'center' )
|
61 |
+
);
|
62 |
+
|
63 |
+
$function2 = 'li_redirect_to_settings()';
|
64 |
+
|
65 |
+
$this->print_scripts($id, $opt_arr, 'Go to settings', FALSE, '', $function2);
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Prints the pointer script
|
70 |
+
*
|
71 |
+
* @param string $selector The CSS selector the pointer is attached to.
|
72 |
+
* @param array $options The options for the pointer.
|
73 |
+
* @param string $button1 Text for button 1
|
74 |
+
* @param string|bool $button2 Text for button 2 (or false to not show it, defaults to false)
|
75 |
+
* @param string $button2_function The JavaScript function to attach to button 2
|
76 |
+
* @param string $button1_function The JavaScript function to attach to button 1
|
77 |
+
*/
|
78 |
+
function print_scripts( $selector, $options, $button1, $button2 = FALSE, $button2_function = '', $button1_function = '' )
|
79 |
+
{
|
80 |
+
?>
|
81 |
+
<script type="text/javascript">
|
82 |
+
//<![CDATA[
|
83 |
+
(function ($) {
|
84 |
+
|
85 |
+
var li_pointer_options = <?php echo json_encode( $options ); ?>, setup;
|
86 |
+
|
87 |
+
function li_redirect_to_settings() {
|
88 |
+
window.location.href = "<?php echo get_bloginfo('wpurl'); ?>/wp-admin/admin.php?page=leadin_settings";
|
89 |
+
}
|
90 |
+
|
91 |
+
li_pointer_options = $.extend(li_pointer_options, {
|
92 |
+
buttons: function (event, t) {
|
93 |
+
button = jQuery('<a id="pointer-close" style="margin-left:5px" class="button-secondary">' + '<?php echo $button1; ?>' + '</a>');
|
94 |
+
button.bind('click.pointer', function () {
|
95 |
+
window.location.href = "<?php echo get_bloginfo('wpurl'); ?>/wp-admin/admin.php?page=leadin_settings";
|
96 |
+
//t.element.pointer('close');
|
97 |
+
});
|
98 |
+
return button;
|
99 |
+
},
|
100 |
+
close : function () {
|
101 |
+
}
|
102 |
+
});
|
103 |
+
|
104 |
+
setup = function () {
|
105 |
+
$('<?php echo $selector; ?>').pointer(li_pointer_options).pointer('open');
|
106 |
+
};
|
107 |
+
|
108 |
+
if (li_pointer_options.position && li_pointer_options.position.defer_loading)
|
109 |
+
$(window).bind('load.wp-pointers', setup);
|
110 |
+
else
|
111 |
+
$(document).ready(setup);
|
112 |
+
})(jQuery);
|
113 |
+
//]]>
|
114 |
+
</script>
|
115 |
+
<?php
|
116 |
+
}
|
117 |
+
}
|
trunk/admin/js/leadin-admin.js
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
jQuery(document).ready( function ( $ ) {
|
2 |
+
|
3 |
+
});
|
trunk/admin/leadin-admin.php
ADDED
@@ -0,0 +1,503 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( !defined('LEADIN_PLUGIN_VERSION') )
|
4 |
+
{
|
5 |
+
header('HTTP/1.0 403 Forbidden');
|
6 |
+
die;
|
7 |
+
}
|
8 |
+
|
9 |
+
//=============================================
|
10 |
+
// Define Constants
|
11 |
+
//=============================================
|
12 |
+
|
13 |
+
if ( !defined('LEADIN_ADMIN_PATH') )
|
14 |
+
define('LEADIN_ADMIN_PATH', untrailingslashit(__FILE__));
|
15 |
+
|
16 |
+
//=============================================
|
17 |
+
// Include Needed Files
|
18 |
+
//=============================================
|
19 |
+
|
20 |
+
if ( !class_exists('LI_List_Table') )
|
21 |
+
require_once LEADIN_PLUGIN_DIR . '/admin/inc/class-leadin-list-table.php';
|
22 |
+
|
23 |
+
if ( !class_exists('LI_Contact') )
|
24 |
+
require_once LEADIN_PLUGIN_DIR . '/admin/inc/class-leadin-contact.php';
|
25 |
+
|
26 |
+
if ( !class_exists('LI_Pointers') )
|
27 |
+
require_once LEADIN_PLUGIN_DIR . '/admin/inc/class-leadin-pointers.php';
|
28 |
+
|
29 |
+
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
|
30 |
+
|
31 |
+
//=============================================
|
32 |
+
// WPLeadInAdmin Class
|
33 |
+
//=============================================
|
34 |
+
class WPLeadInAdmin {
|
35 |
+
|
36 |
+
var $admin_power_ups;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Class constructor
|
40 |
+
*/
|
41 |
+
function __construct ( $power_ups )
|
42 |
+
{
|
43 |
+
//=============================================
|
44 |
+
// Hooks & Filters
|
45 |
+
//=============================================
|
46 |
+
|
47 |
+
$this->admin_power_ups = $power_ups;
|
48 |
+
|
49 |
+
if( is_admin() )
|
50 |
+
{
|
51 |
+
add_action('admin_menu', array(&$this, 'leadin_add_menu_items'));
|
52 |
+
add_action('admin_init', array(&$this, 'leadin_build_settings_page'));
|
53 |
+
add_action('admin_print_styles', array(&$this, 'add_leadin_admin_styles'));
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
//=============================================
|
58 |
+
// Menus
|
59 |
+
//=============================================
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Adds LeadIn menu to /wp-admin sidebar
|
63 |
+
*/
|
64 |
+
function leadin_add_menu_items ()
|
65 |
+
{
|
66 |
+
global $submenu;
|
67 |
+
global $wp_version;
|
68 |
+
|
69 |
+
self::check_admin_action();
|
70 |
+
|
71 |
+
foreach ( $this->admin_power_ups as $power_up )
|
72 |
+
{
|
73 |
+
if ( $power_up->activated )
|
74 |
+
{
|
75 |
+
$power_up->admin_init();
|
76 |
+
|
77 |
+
if ( $power_up->menu_text == 'Contacts' )
|
78 |
+
add_menu_page('LeadIn', 'LeadIn', 'manage_categories', 'leadin_contacts', array($power_up, 'power_up_setup_callback'), LEADIN_PATH . '/images/' . ( $wp_version < 3.8 && !is_plugin_active('mp6/mp6.php') ? 'leadin-icon-32x32.png' : 'leadin-svg-icon.svg'));
|
79 |
+
else if ( $power_up->menu_text )
|
80 |
+
add_submenu_page('leadin_contacts', $power_up->menu_text, $power_up->menu_text, 'manage_categories', 'leadin_' . $power_up->menu_link, array($power_up, 'power_up_setup_callback'));
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
add_submenu_page('leadin_contacts', 'Settings', 'Settings', 'manage_categories', 'leadin_settings', array(&$this, 'leadin_plugin_options'));
|
85 |
+
add_submenu_page('leadin_contacts', 'Power-ups', 'Power-ups', 'manage_categories', 'leadin_power_ups', array(&$this, 'leadin_power_ups_page'));
|
86 |
+
$submenu['leadin_contacts'][0][0] = 'Contacts';
|
87 |
+
|
88 |
+
if ( !isset($_GET['page']) || $_GET['page'] != 'leadin_settings' )
|
89 |
+
{
|
90 |
+
$options = get_option('leadin_options');
|
91 |
+
if ( !isset($options['ignore_settings_popup']) || !$options['ignore_settings_popup'] )
|
92 |
+
$li_pointers = new LI_Pointers();
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
//=============================================
|
97 |
+
// Settings Page
|
98 |
+
//=============================================
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Adds setting link for LeadIn to plugins management page
|
102 |
+
*
|
103 |
+
* @param array $links
|
104 |
+
* @return array
|
105 |
+
*/
|
106 |
+
function leadin_plugin_settings_link ( $links )
|
107 |
+
{
|
108 |
+
$url = get_admin_url() . 'admin.php?page=leadin_settings';
|
109 |
+
$settings_link = '<a href="' . $url . '">Settings</a>';
|
110 |
+
array_unshift($links, $settings_link);
|
111 |
+
return $links;
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Creates settings options
|
116 |
+
*/
|
117 |
+
function leadin_build_settings_page ()
|
118 |
+
{
|
119 |
+
// Show the settings popup on all pages except the settings page
|
120 |
+
if( isset($_GET['settings-updated']) )
|
121 |
+
{
|
122 |
+
$options = get_option('leadin_options');
|
123 |
+
|
124 |
+
if ( !isset($options['onboarding_complete']) || !$options['onboarding_complete'] )
|
125 |
+
leadin_update_option('leadin_options', 'onboarding_complete', 1);
|
126 |
+
|
127 |
+
if ( !isset($options['ignore_settings_popup']) || !$options['ignore_settings_popup'] )
|
128 |
+
leadin_update_option('leadin_options', 'ignore_settings_popup', 1);
|
129 |
+
}
|
130 |
+
|
131 |
+
register_setting('leadin_settings_options', 'leadin_options', array($this, 'sanitize'));
|
132 |
+
add_settings_section('leadin_settings_section', 'Visitor Tracking', array($this, 'leadin_options_section_heading'), LEADIN_ADMIN_PATH);
|
133 |
+
add_settings_field('li_email', 'Email', array($this, 'li_email_callback'), LEADIN_ADMIN_PATH, 'leadin_settings_section');
|
134 |
+
|
135 |
+
add_filter( 'update_option_leadin_options', array($this, 'update_option_leadin_options_callback'), 10, 2 );
|
136 |
+
}
|
137 |
+
|
138 |
+
function leadin_options_section_heading ( )
|
139 |
+
{
|
140 |
+
?>
|
141 |
+
<div id="message" class="updated below-h2">
|
142 |
+
<p>Visitor tracking is <span style='color: #090; font-weight: bold;'>installed and tracking visitors</span>.</p>
|
143 |
+
<p>The next time a visitor fills out a form on your WordPress site with an email address, LeadIn will send you an email with the contact's referral source and page view history.</p>
|
144 |
+
<p>All of your visitor's form submissions are stored in your <a href='<?php echo get_bloginfo('wpurl');?>/wp-admin/admin.php?page=leadin_contacts'>LeadIn Contacts</a>.</p>
|
145 |
+
</div>
|
146 |
+
<?php
|
147 |
+
|
148 |
+
$this->print_hidden_settings_fields();
|
149 |
+
}
|
150 |
+
|
151 |
+
function print_hidden_settings_fields ()
|
152 |
+
{
|
153 |
+
// Hacky solution to solve the Settings API overwriting the default values
|
154 |
+
$options = get_option('leadin_options');
|
155 |
+
$li_installed = ( $options['li_installed'] ? $options['li_installed'] : 1 );
|
156 |
+
$li_db_version = ( $options['li_db_version'] ? $options['li_db_version'] : LEADIN_DB_VERSION );
|
157 |
+
$ignore_settings_popup = ( $options['ignore_settings_popup'] ? $options['ignore_settings_popup'] : 0 );
|
158 |
+
$onboarding_complete = ( $options['onboarding_complete'] ? $options['onboarding_complete'] : 0 );
|
159 |
+
|
160 |
+
printf(
|
161 |
+
'<input id="li_installed" type="hidden" name="leadin_options[li_installed]" value="%d"/>',
|
162 |
+
$li_installed
|
163 |
+
);
|
164 |
+
|
165 |
+
printf(
|
166 |
+
'<input id="li_db_version" type="hidden" name="leadin_options[li_db_version]" value="%s"/>',
|
167 |
+
$li_db_version
|
168 |
+
);
|
169 |
+
|
170 |
+
printf(
|
171 |
+
'<input id="ignore_settings_popup" type="hidden" name="leadin_options[ignore_settings_popup]" value="%d"/>',
|
172 |
+
$ignore_settings_popup
|
173 |
+
);
|
174 |
+
|
175 |
+
printf(
|
176 |
+
'<input id="onboarding_complete" type="hidden" name="leadin_options[onboarding_complete]" value="%d"/>',
|
177 |
+
$onboarding_complete
|
178 |
+
);
|
179 |
+
}
|
180 |
+
|
181 |
+
function update_option_leadin_options_callback ( $old_value, $new_value )
|
182 |
+
{
|
183 |
+
$user_email = $new_value["li_email"];
|
184 |
+
leadin_register_user();
|
185 |
+
}
|
186 |
+
|
187 |
+
/**
|
188 |
+
* Creates settings page
|
189 |
+
*/
|
190 |
+
function leadin_plugin_options ()
|
191 |
+
{
|
192 |
+
global $wp_version;
|
193 |
+
|
194 |
+
if ( !current_user_can( 'manage_categories' ) )
|
195 |
+
{
|
196 |
+
wp_die(__('You do not have sufficient permissions to access this page.'));
|
197 |
+
}
|
198 |
+
|
199 |
+
// Update the settings popup flag when the settings page is visited for the first time
|
200 |
+
$li_options = get_option('leadin_options');
|
201 |
+
|
202 |
+
echo '<div id="leadin" class="li-settings wrap '. ( $wp_version < 3.8 && !is_plugin_active('mp6/mp6.php') ? 'pre-mp6' : ''). '">';
|
203 |
+
|
204 |
+
$this->leadin_header('LeadIn Settings');
|
205 |
+
|
206 |
+
if ( !$li_options['onboarding_complete'] && !isset($_GET['settings-updated']) )
|
207 |
+
$this->leadin_plugin_onboarding();
|
208 |
+
else
|
209 |
+
$this->leadin_plugin_settings();
|
210 |
+
|
211 |
+
|
212 |
+
$this->leadin_footer();
|
213 |
+
|
214 |
+
//end wrap
|
215 |
+
echo '</div>';
|
216 |
+
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* Creates onboarding settings page
|
221 |
+
*/
|
222 |
+
function leadin_plugin_onboarding ()
|
223 |
+
{
|
224 |
+
leadin_track_plugin_activity("Loaded Onboarding Page");
|
225 |
+
|
226 |
+
?>
|
227 |
+
|
228 |
+
<div class="steps">
|
229 |
+
<ol class="step-names">
|
230 |
+
<li class="step-name completed">Downloaded</li>
|
231 |
+
<li class="step-name completed">Activated</li>
|
232 |
+
<li class="step-name active">Confirm Email</li>
|
233 |
+
</ol>
|
234 |
+
<ul class="step-content">
|
235 |
+
<li class="step active">
|
236 |
+
<h2>Confirm your email</h2>
|
237 |
+
<form method="post" action="options.php">
|
238 |
+
<?php settings_fields('leadin_settings_options'); ?>
|
239 |
+
<p>
|
240 |
+
<?php $this->li_email_callback(); ?>
|
241 |
+
</p>
|
242 |
+
|
243 |
+
<input type="hidden" name="onboarding-complete" value="true">
|
244 |
+
<?php $this->print_hidden_settings_fields(); ?>
|
245 |
+
|
246 |
+
<input type="submit" name="submit" id="submit" class="button button-primary" value="<?php esc_attr_e('Save Settings'); ?>">
|
247 |
+
</form>
|
248 |
+
</li>
|
249 |
+
</ul>
|
250 |
+
</div>
|
251 |
+
|
252 |
+
<?php
|
253 |
+
}
|
254 |
+
|
255 |
+
/**
|
256 |
+
* Creates default settings page
|
257 |
+
*/
|
258 |
+
function leadin_plugin_settings ()
|
259 |
+
{
|
260 |
+
leadin_track_plugin_activity("Loaded Settings Page");
|
261 |
+
|
262 |
+
?>
|
263 |
+
<form method="post" action="options.php">
|
264 |
+
<?php
|
265 |
+
settings_fields('leadin_settings_options');
|
266 |
+
do_settings_sections(LEADIN_ADMIN_PATH);
|
267 |
+
submit_button('Save Settings');
|
268 |
+
?>
|
269 |
+
</form>
|
270 |
+
<?php
|
271 |
+
}
|
272 |
+
|
273 |
+
/**
|
274 |
+
* Sanitize each setting field as needed
|
275 |
+
*
|
276 |
+
* @param array $input Contains all settings fields as array keys
|
277 |
+
*/
|
278 |
+
public function sanitize ( $input )
|
279 |
+
{
|
280 |
+
$new_input = array();
|
281 |
+
|
282 |
+
if( isset( $input['li_email'] ) )
|
283 |
+
$new_input['li_email'] = sanitize_text_field( $input['li_email'] );
|
284 |
+
|
285 |
+
if( isset( $input['li_installed'] ) )
|
286 |
+
$new_input['li_installed'] = $input['li_installed'];
|
287 |
+
|
288 |
+
if( isset( $input['li_db_version'] ) )
|
289 |
+
$new_input['li_db_version'] = $input['li_db_version'];
|
290 |
+
|
291 |
+
if( isset( $input['onboarding_complete'] ) )
|
292 |
+
$new_input['onboarding_complete'] = $input['onboarding_complete'];
|
293 |
+
|
294 |
+
if( isset( $input['ignore_settings_popup'] ) )
|
295 |
+
$new_input['ignore_settings_popup'] = $input['ignore_settings_popup'];
|
296 |
+
|
297 |
+
return $new_input;
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* Prints email input for settings page
|
302 |
+
*/
|
303 |
+
function li_email_callback ()
|
304 |
+
{
|
305 |
+
$options = get_option('leadin_options');
|
306 |
+
$li_email = ( $options['li_email'] ? $options['li_email'] : get_bloginfo('admin_email') ); // Get email from plugin settings, if none set, use admin email
|
307 |
+
|
308 |
+
printf(
|
309 |
+
'<input id="li_email" type="text" id="title" name="leadin_options[li_email]" value="%s" size="50"/><br/><span class="description">Separate multiple emails with commas</span>',
|
310 |
+
$li_email
|
311 |
+
);
|
312 |
+
}
|
313 |
+
|
314 |
+
/**
|
315 |
+
* Creates power-up page
|
316 |
+
*/
|
317 |
+
function leadin_power_ups_page ()
|
318 |
+
{
|
319 |
+
global $wp_version;
|
320 |
+
|
321 |
+
leadin_track_plugin_activity("Loaded Power-ups Page");
|
322 |
+
|
323 |
+
if ( !current_user_can( 'manage_categories' ) )
|
324 |
+
{
|
325 |
+
wp_die(__('You do not have sufficient permissions to access this page.'));
|
326 |
+
}
|
327 |
+
|
328 |
+
echo '<div id="leadin" class="li-settings wrap '. ( $wp_version < 3.8 && !is_plugin_active('mp6/mp6.php') ? 'pre-mp6' : ''). '">';
|
329 |
+
|
330 |
+
$this->leadin_header('LeadIn Power-ups');
|
331 |
+
|
332 |
+
?>
|
333 |
+
|
334 |
+
<p>Get the most out of your LeadIn install with these powerful marketing powerups.</p>
|
335 |
+
|
336 |
+
<ul class="powerup-list">
|
337 |
+
|
338 |
+
<?php foreach ( $this->admin_power_ups as $power_up ) : ?>
|
339 |
+
<li class="powerup <?php echo ( $power_up->activated ? 'activated' : ''); ?>">
|
340 |
+
<h2><?php echo $power_up->power_up_name; ?></h2>
|
341 |
+
<img src="<?php echo LEADIN_PATH . '/images/' . $power_up->icon . '@2x.png'; ?>" height="80px" width="80px"/>
|
342 |
+
<p><?php echo $power_up->description; ?></p>
|
343 |
+
<p><a href="<?php echo $power_up->link_uri; ?>" target="_blank">Learn more</a></p>
|
344 |
+
<?php if ( $power_up->activated ) : ?>
|
345 |
+
<?php if ( ! $power_up->permanent ) : ?>
|
346 |
+
<a href="<?php echo get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_power_ups&leadin_action=deactivate&power_up=' . $power_up->slug; ?>" class="button button-secondary button-large">Deactivate</a>
|
347 |
+
<?php endif; ?>
|
348 |
+
<?php else : ?>
|
349 |
+
<a href="<?php echo get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_power_ups&leadin_action=activate&power_up=' . $power_up->slug; ?>" class="button button-primary button-large">Activate</a>
|
350 |
+
<?php endif; ?>
|
351 |
+
|
352 |
+
<?php if ( $power_up->activated || $power_up->permanent ) : ?>
|
353 |
+
<?php if ( $power_up->menu_link == 'contacts' ) : ?>
|
354 |
+
<a href="<?php echo get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_' . $power_up->menu_link; ?>" class="button button-secondary button-large">View Contacts</a>
|
355 |
+
<a href="<?php echo get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_settings'; ?>" class="button button-secondary button-large">Configure</a>
|
356 |
+
<?php else : ?>
|
357 |
+
<a href="<?php echo get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_' . $power_up->menu_link; ?>" class="button button-secondary button-large">Configure</a>
|
358 |
+
<?php endif; ?>
|
359 |
+
<?php endif; ?>
|
360 |
+
</li>
|
361 |
+
<?php endforeach; ?>
|
362 |
+
|
363 |
+
<li class="powerup">
|
364 |
+
<h2>Content Analytics</h2>
|
365 |
+
<img src="<?php echo LEADIN_PATH; ?>/images/powerup-icon-analytics@2x.png" height="80px" width="80px">
|
366 |
+
<p>See where all your conversions are coming from.</p>
|
367 |
+
<p><a href="http://leadin.com/content-analytics-plugin-wordpress/">Learn more</a></p>
|
368 |
+
<a disabled="true" class="button button-primary button-large">Coming soon</a>
|
369 |
+
</li>
|
370 |
+
<li class="powerup">
|
371 |
+
<h2>Your Idea</h2>
|
372 |
+
<img src="<?php echo LEADIN_PATH; ?>/images/powerup-icon-ideas@2x.png" height="80px" width="80px">
|
373 |
+
<p>Have an idea for a power-up? We'd love to hear it!</p>
|
374 |
+
<p> </p>
|
375 |
+
<a href="mailto:team@leadin.com" target="_blank" class="button button-primary button-large">Suggest an idea</a>
|
376 |
+
</li>
|
377 |
+
</ul>
|
378 |
+
|
379 |
+
<?php
|
380 |
+
|
381 |
+
|
382 |
+
$this->leadin_footer();
|
383 |
+
|
384 |
+
//end wrap
|
385 |
+
echo '</div>';
|
386 |
+
|
387 |
+
}
|
388 |
+
|
389 |
+
function check_admin_action ( )
|
390 |
+
{
|
391 |
+
if ( isset( $_GET['leadin_action'] ) )
|
392 |
+
{
|
393 |
+
switch ( $_GET['leadin_action'] )
|
394 |
+
{
|
395 |
+
case 'activate' :
|
396 |
+
|
397 |
+
$power_up = stripslashes( $_GET['power_up'] );
|
398 |
+
|
399 |
+
WPLeadIn::activate_power_up( $power_up, FALSE );
|
400 |
+
//ob_end_clean();
|
401 |
+
leadin_track_plugin_activity($power_up . " power-up activated");
|
402 |
+
wp_redirect(get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_power_ups');
|
403 |
+
exit;
|
404 |
+
|
405 |
+
break;
|
406 |
+
|
407 |
+
case 'deactivate' :
|
408 |
+
|
409 |
+
$power_up = stripslashes( $_GET['power_up'] );
|
410 |
+
|
411 |
+
WPLeadIn::deactivate_power_up( $power_up, FALSE );
|
412 |
+
leadin_track_plugin_activity($power_up . " power-up deactivated");
|
413 |
+
wp_redirect(get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_power_ups');
|
414 |
+
exit;
|
415 |
+
|
416 |
+
break;
|
417 |
+
}
|
418 |
+
}
|
419 |
+
}
|
420 |
+
|
421 |
+
//=============================================
|
422 |
+
// Admin Styles & Scripts
|
423 |
+
//=============================================
|
424 |
+
|
425 |
+
/**
|
426 |
+
* Adds admin style sheets
|
427 |
+
*/
|
428 |
+
function add_leadin_admin_styles ()
|
429 |
+
{
|
430 |
+
wp_register_style('leadin-admin-css', LEADIN_PATH . '/admin/css/leadin-admin.css');
|
431 |
+
wp_enqueue_style('leadin-admin-css');
|
432 |
+
}
|
433 |
+
|
434 |
+
//=============================================
|
435 |
+
// Internal Class Functions
|
436 |
+
//=============================================
|
437 |
+
|
438 |
+
/**
|
439 |
+
* Creates postbox for admin
|
440 |
+
* @param string
|
441 |
+
* @param string
|
442 |
+
* @param string
|
443 |
+
* @param bool
|
444 |
+
* @return string HTML for postbox
|
445 |
+
*/
|
446 |
+
function leadin_postbox ( $id, $title, $content, $handle = TRUE )
|
447 |
+
{
|
448 |
+
$postbox_wrap = "";
|
449 |
+
$postbox_wrap .= '<div id="' . $id . '" class="postbox leadin-admin-postbox">';
|
450 |
+
$postbox_wrap .= ( $handle ? '<div class="handlediv" title="Click to toggle"><br /></div>' : '' );
|
451 |
+
$postbox_wrap .= '<h3><span>' . $title . '</span></h3>';
|
452 |
+
$postbox_wrap .= '<div class="inside">' . $content . '</div>';
|
453 |
+
$postbox_wrap .= '</div>';
|
454 |
+
return $postbox_wrap;
|
455 |
+
}
|
456 |
+
|
457 |
+
/**
|
458 |
+
* Prints the admin page title, icon and help notification
|
459 |
+
* @param string
|
460 |
+
*/
|
461 |
+
function leadin_header ( $page_title = '' )
|
462 |
+
{
|
463 |
+
?>
|
464 |
+
<?php screen_icon('leadin'); ?>
|
465 |
+
<h2><?php echo $page_title; ?></h2>
|
466 |
+
|
467 |
+
<?php if ( isset($_GET['settings-updated']) ) : ?>
|
468 |
+
<div id="message" class="updated">
|
469 |
+
<p><strong><?php _e('Settings saved.') ?></strong></p>
|
470 |
+
</div>
|
471 |
+
<?php endif;
|
472 |
+
}
|
473 |
+
|
474 |
+
function leadin_footer ()
|
475 |
+
{
|
476 |
+
?>
|
477 |
+
<div id="leadin-footer">
|
478 |
+
<p class="support"><a href="http://leadin.com">LeadIn</a> <?php echo LEADIN_PLUGIN_VERSION?> | Need help? <a href="#" onclick="return SnapEngage.startLink();">Contact us</a>.</p>
|
479 |
+
<p class="sharing"><a href="https://twitter.com/leadinapp" class="twitter-follow-button" data-show-count="false">Follow @leadinapp</a>
|
480 |
+
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script></p>
|
481 |
+
</div>
|
482 |
+
<!-- begin SnapEngage code -->
|
483 |
+
<script type="text/javascript">
|
484 |
+
(function() {
|
485 |
+
var se = document.createElement('script'); se.type = 'text/javascript'; se.async = true;
|
486 |
+
se.src = '//commondatastorage.googleapis.com/code.snapengage.com/js/b7667cce-a26d-4440-a716-7c4b9f086705.js';
|
487 |
+
var done = false;
|
488 |
+
se.onload = se.onreadystatechange = function() {
|
489 |
+
if (!done&&(!this.readyState||this.readyState==='loaded'||this.readyState==='complete')) {
|
490 |
+
done = true;
|
491 |
+
// Place your SnapEngage JS API code below
|
492 |
+
// SnapEngage.allowChatSound(true); // Example JS API: Enable sounds for Visitors.
|
493 |
+
}
|
494 |
+
};
|
495 |
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(se, s);
|
496 |
+
})();
|
497 |
+
</script>
|
498 |
+
<!-- end SnapEngage code -->
|
499 |
+
<?php
|
500 |
+
}
|
501 |
+
}
|
502 |
+
|
503 |
+
?>
|
trunk/admin/sass/_contact_detail_page.sass
ADDED
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#leadin
|
2 |
+
|
3 |
+
.header-wrap
|
4 |
+
@include pie-clearfix
|
5 |
+
padding: 9px 15px 4px 0
|
6 |
+
|
7 |
+
h1, img
|
8 |
+
float: left
|
9 |
+
|
10 |
+
h1
|
11 |
+
padding: 0 0 0 10px
|
12 |
+
margin: 0
|
13 |
+
|
14 |
+
.contact-name
|
15 |
+
line-height: 40px
|
16 |
+
|
17 |
+
.contact-info
|
18 |
+
|
19 |
+
label
|
20 |
+
font-weight: bold
|
21 |
+
line-height: 1
|
22 |
+
cursor: default
|
23 |
+
|
24 |
+
.contact-history
|
25 |
+
padding-left: 20px
|
26 |
+
margin-left: 20px
|
27 |
+
border-left: 2px solid $color-border
|
28 |
+
|
29 |
+
.session
|
30 |
+
|
31 |
+
& + .session
|
32 |
+
margin-top: $base-vertical-unit*5
|
33 |
+
|
34 |
+
.session-date
|
35 |
+
position: relative
|
36 |
+
|
37 |
+
&:before
|
38 |
+
content: "\2022"
|
39 |
+
font-size: 32px
|
40 |
+
line-height: 0
|
41 |
+
height: 31px
|
42 |
+
width: 31px
|
43 |
+
position: absolute
|
44 |
+
left: -27px
|
45 |
+
top: 9px
|
46 |
+
color: $color-border
|
47 |
+
|
48 |
+
.events
|
49 |
+
background-color: #fff
|
50 |
+
border: 1px solid $color-border
|
51 |
+
@include box-shadow(0 1px 1px rgba(0,0,0,.04))
|
52 |
+
|
53 |
+
.event
|
54 |
+
margin: 0
|
55 |
+
padding: 10px 20px
|
56 |
+
border:
|
57 |
+
bottom: 1px solid $color-border
|
58 |
+
left: 4px solid
|
59 |
+
|
60 |
+
&:first-child
|
61 |
+
border-top: 0
|
62 |
+
|
63 |
+
&.pageview
|
64 |
+
border-left-color: $blue
|
65 |
+
color: $blue
|
66 |
+
|
67 |
+
&.form-submission
|
68 |
+
border-left-color: $orange
|
69 |
+
color: $orange
|
70 |
+
|
71 |
+
&.source
|
72 |
+
border-left-color: $green
|
73 |
+
color: $green
|
74 |
+
|
75 |
+
.event-title
|
76 |
+
margin: 0
|
77 |
+
font-size: 13px
|
78 |
+
font-weight: 600
|
79 |
+
|
80 |
+
.event-time-range
|
81 |
+
float: right
|
82 |
+
font-weight: 400
|
83 |
+
font-size: 0.85em
|
84 |
+
color: $color-text-light
|
85 |
+
|
86 |
+
.event-detail
|
87 |
+
margin-top: 20px
|
88 |
+
color: $color-text
|
89 |
+
|
90 |
+
li + li
|
91 |
+
padding-top: $base-vertical-unit
|
92 |
+
border-top: 1px solid $color-border-light
|
93 |
+
|
94 |
+
.visit-source
|
95 |
+
p
|
96 |
+
margin: 0
|
97 |
+
color: $blue-dark
|
98 |
+
|
99 |
+
.pageview-url
|
100 |
+
margin: 0
|
101 |
+
color: $color-text-lighter
|
102 |
+
|
103 |
+
.field-label
|
104 |
+
text-transform: uppercase
|
105 |
+
letter-spacing: 0.05em
|
106 |
+
color: $color-text-light
|
107 |
+
margin-bottom: 6px
|
108 |
+
font-size: 0.9em
|
109 |
+
|
110 |
+
.field-value
|
111 |
+
margin: 0
|
112 |
+
|
113 |
+
&.pre-mp6
|
114 |
+
|
115 |
+
.events
|
116 |
+
background-color: #f9f9f9
|
trunk/admin/sass/_contacts_list_page.sass
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#leadin-contacts
|
2 |
+
|
3 |
+
th
|
4 |
+
|
5 |
+
&#source
|
6 |
+
width: 20%
|
7 |
+
|
8 |
+
&#visits, &#submissions
|
9 |
+
width: 8%
|
10 |
+
|
11 |
+
&#status, &#last_visit, &#date, &#pageviews
|
12 |
+
width: 10%
|
13 |
+
|
trunk/admin/sass/_grid.sass
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import "susyone"
|
2 |
+
|
3 |
+
// Settings
|
4 |
+
|
5 |
+
$break: 782px 12
|
6 |
+
|
7 |
+
$total-columns: 12
|
8 |
+
$column-width: 80px
|
9 |
+
$gutter-width: 20px
|
10 |
+
$grid-padding: 20px
|
11 |
+
|
12 |
+
#leadin
|
13 |
+
@include container($total-columns, $break)
|
14 |
+
margin: 0
|
15 |
+
padding: 0
|
16 |
+
|
17 |
+
*
|
18 |
+
box-sizing: border-box
|
19 |
+
|
20 |
+
@include at-breakpoint($break)
|
21 |
+
margin: 0
|
22 |
+
|
23 |
+
// Layout
|
24 |
+
|
25 |
+
@include at-breakpoint($break)
|
trunk/admin/sass/_powerups_page.sass
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.powerup-list
|
2 |
+
margin: 0
|
3 |
+
|
4 |
+
.powerup
|
5 |
+
border: 2px solid
|
6 |
+
width: 20%
|
7 |
+
min-width: 250px
|
8 |
+
float: left
|
9 |
+
margin: $grid-padding
|
10 |
+
padding: 15px
|
11 |
+
background-color: #f9f9f9
|
12 |
+
border-color: #ccc
|
13 |
+
text-align: center
|
14 |
+
@include border-radius(10px)
|
15 |
+
|
16 |
+
h2, p, img
|
17 |
+
margin: 0
|
18 |
+
padding: 0
|
19 |
+
color: #666
|
20 |
+
margin-bottom: 15px
|
21 |
+
|
22 |
+
&.activated
|
23 |
+
background-color: $teal-background
|
24 |
+
border-color: $teal-dark
|
25 |
+
|
26 |
+
h2, p
|
27 |
+
color: $teal-dark
|
trunk/admin/sass/_settings_page.sass
ADDED
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#icon-leadin
|
2 |
+
background: url('../../images/leadin-icon-32x32.png') top center no-repeat
|
3 |
+
|
4 |
+
.help-notification
|
5 |
+
background: #d9edf7
|
6 |
+
border: 1px solid #bce8f1
|
7 |
+
padding: 10px
|
8 |
+
-webkit-border-radius: 3px
|
9 |
+
-moz-border-radius: 3px
|
10 |
+
border-radius: 3px
|
11 |
+
|
12 |
+
.toplevel_page_leadin_contacts .wp-menu-image img
|
13 |
+
width: 16px
|
14 |
+
height: 16px
|
15 |
+
|
16 |
+
.leadin-contact-avatar
|
17 |
+
margin-right: 10px
|
18 |
+
|
19 |
+
.power-up-settings-icon
|
20 |
+
padding-right: 10px
|
21 |
+
float: left
|
22 |
+
max-height: 20px
|
23 |
+
margin-top: -1px
|
24 |
+
|
25 |
+
.dashicons
|
26 |
+
margin-right: 10px
|
27 |
+
float: left
|
28 |
+
margin-top: -1px
|
29 |
+
|
30 |
+
.steps
|
31 |
+
margin: $base-vertical-unit*8 auto 0
|
32 |
+
text-align: center
|
33 |
+
max-width: 600px
|
34 |
+
|
35 |
+
h3, p
|
36 |
+
margin: 0
|
37 |
+
|
38 |
+
.step-names
|
39 |
+
margin: 0
|
40 |
+
+pie-clearfix
|
41 |
+
|
42 |
+
.step-name
|
43 |
+
color: #ccc
|
44 |
+
display: list-item
|
45 |
+
float: left
|
46 |
+
width: 33%
|
47 |
+
margin: 0
|
48 |
+
padding-bottom: $base-vertical-unit*3
|
49 |
+
font-size: 16px
|
50 |
+
list-style: decimal inside none
|
51 |
+
|
52 |
+
&.active
|
53 |
+
color: $teal-dark
|
54 |
+
background-image: url(../../images/triangle.png)
|
55 |
+
background-position: bottom center
|
56 |
+
background-repeat: no-repeat
|
57 |
+
|
58 |
+
&.completed
|
59 |
+
list-style-image: url(../../images/checkmark.png)
|
60 |
+
|
61 |
+
.step-content
|
62 |
+
margin: 0
|
63 |
+
|
64 |
+
.description
|
65 |
+
margin: 10px 0 20px
|
66 |
+
display: block
|
67 |
+
|
68 |
+
.step
|
69 |
+
display: none
|
70 |
+
padding: $base-vertical-unit*3
|
71 |
+
background-color: $teal-background
|
72 |
+
border: 2px solid $teal
|
73 |
+
+border-radius(5px)
|
74 |
+
color: $teal-dark
|
75 |
+
|
76 |
+
h2
|
77 |
+
color: $teal-dark
|
78 |
+
margin:
|
79 |
+
top: 0
|
80 |
+
bottom: $base-vertical-unit*3
|
81 |
+
|
82 |
+
ol
|
83 |
+
text-align: left
|
84 |
+
margin-bottom: $base-vertical-unit*3
|
85 |
+
|
86 |
+
label
|
87 |
+
text-align: right
|
88 |
+
|
89 |
+
&.active
|
90 |
+
display: block
|
91 |
+
|
92 |
+
.form-table
|
93 |
+
th
|
94 |
+
display: none
|
95 |
+
|
96 |
+
td
|
97 |
+
text-align: center
|
98 |
+
width: auto
|
99 |
+
display: block
|
100 |
+
|
101 |
+
input
|
102 |
+
width: 100%
|
103 |
+
font-size: 16px
|
104 |
+
line-height: 1.5
|
105 |
+
padding: 7px 10px
|
106 |
+
display: block
|
trunk/admin/sass/_tables.sass
ADDED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
$table-controls-pading: $base-vertical-unit*2
|
2 |
+
$table-controls-border-size: 2px
|
3 |
+
|
4 |
+
#leadin
|
5 |
+
|
6 |
+
.top_table_controls
|
7 |
+
border-bottom: $table-controls-border-size solid $color-border
|
8 |
+
margin: 0 0 $base-vertical-unit*3 0
|
9 |
+
margin-bottom: $base-vertical-unit*3 - $table-controls-border-size
|
10 |
+
@include pie-clearfix
|
11 |
+
|
12 |
+
.table_segment_picker
|
13 |
+
float: left
|
14 |
+
margin: 0
|
15 |
+
|
16 |
+
li
|
17 |
+
display: inline-block
|
18 |
+
margin: 0
|
19 |
+
|
20 |
+
& + li
|
21 |
+
margin-left: 2em
|
22 |
+
a
|
23 |
+
display: block
|
24 |
+
padding: $table-controls-pading 0
|
25 |
+
line-height: $base-vertical-unit*4
|
26 |
+
font-weight: 300
|
27 |
+
font-size: 20px
|
28 |
+
text-decoration: none
|
29 |
+
|
30 |
+
&.current
|
31 |
+
margin-bottom: -2px
|
32 |
+
font-weight: 400
|
33 |
+
border-bottom: 2px solid $color-primary
|
34 |
+
|
35 |
+
&.current, &:hover, &:active
|
36 |
+
color: $color-primary
|
37 |
+
|
38 |
+
.table_search
|
39 |
+
float: right
|
40 |
+
padding: ($table-controls-pading - 2px) 0
|
41 |
+
padding-bottom: $table-controls-pading - 3px
|
42 |
+
|
43 |
+
table
|
44 |
+
.leadin-contact-avatar
|
45 |
+
float: left
|
46 |
+
|
47 |
+
&.pre-mp6
|
48 |
+
.table_search
|
49 |
+
float: right
|
50 |
+
padding: $table-controls-pading 0
|
51 |
+
padding-bottom: $table-controls-pading - 1px
|
52 |
+
|
53 |
+
table
|
54 |
+
background-color: #fff
|
55 |
+
border-color: $color-border
|
56 |
+
|
57 |
+
tr
|
58 |
+
|
59 |
+
&.alternate
|
60 |
+
background-color: #fff
|
61 |
+
|
62 |
+
th, td
|
63 |
+
border-top: 0
|
64 |
+
padding: $base-vertical-unit*2 $base-vertical-unit $base-vertical-unit*2 - 1px
|
65 |
+
|
66 |
+
a
|
67 |
+
padding: 0
|
68 |
+
|
69 |
+
th[scope="col"]
|
70 |
+
background: #eee
|
71 |
+
font-family: $font-sans
|
72 |
+
font-size: 12px
|
73 |
+
text-shadow: none
|
74 |
+
|
75 |
+
td
|
76 |
+
border-color: $color-border
|
77 |
+
line-height: $base-vertical-unit*3
|
78 |
+
font-size: 14px
|
79 |
+
|
80 |
+
.row-actions
|
81 |
+
float: left
|
trunk/admin/sass/_variables.sass
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
$base-vertical-unit: 6px
|
2 |
+
$font-sans: sans-serif
|
3 |
+
|
4 |
+
$color-primary: #F66000
|
5 |
+
$color-secondary: #F66000
|
6 |
+
|
7 |
+
$color-text: #444
|
8 |
+
$color-text-light: #999
|
9 |
+
$color-text-lighter: #ccc
|
10 |
+
|
11 |
+
$color-border: #dedede
|
12 |
+
$color-border-light: #eeeeee
|
13 |
+
|
14 |
+
// orange
|
15 |
+
$orange-darker: #71350E
|
16 |
+
$orange-dark: #B34A12
|
17 |
+
$orange: #F66000
|
18 |
+
$orange-light: #F88E4B
|
19 |
+
$orange-lighter: #FBBF99
|
20 |
+
$orange-background: #FDDFCC
|
21 |
+
|
22 |
+
// blue
|
23 |
+
$blue-darker: #1D5072
|
24 |
+
$blue-dark: #1F6696
|
25 |
+
$blue: #2288CC
|
26 |
+
$blue-light: #64AADA
|
27 |
+
$blue-lighter: #A7CFEB
|
28 |
+
$blue-background: #D3E7F5
|
29 |
+
|
30 |
+
// teal
|
31 |
+
$teal-darker: #1D524C
|
32 |
+
$teal-dark: #1F7D71
|
33 |
+
$teal: #22AA99
|
34 |
+
$teal-light: #64C2B6
|
35 |
+
$teal-lighter: #A7DDD6
|
36 |
+
$teal-background: #D3EEEB
|
37 |
+
|
38 |
+
// fucia
|
39 |
+
$fucia-darker: #5A2A45
|
40 |
+
$fucia-dark: #1F7E72
|
41 |
+
$fucia: #BB4488
|
42 |
+
$fucia-light: #CF7BAA
|
43 |
+
$fucia-lighter: #E4B4CF
|
44 |
+
$fucia-background: #F1DAE7
|
45 |
+
|
46 |
+
// green
|
47 |
+
$green-darker: #4C530F
|
48 |
+
$green-dark: #A27E18
|
49 |
+
$green: #99AA1F
|
50 |
+
$green-light: #B7C24B
|
51 |
+
$green-lighter: #D6DD99
|
52 |
+
$green-background: #EBEECC
|
53 |
+
|
54 |
+
// grey
|
55 |
+
$grey: #666
|
56 |
+
$grey-light: #999
|
57 |
+
$grey-lighter: #ccc
|
58 |
+
$grey-background: #f9f9f9
|
59 |
+
$grey-dark: #444
|
60 |
+
$grey-darker: #222
|
trunk/admin/sass/config.rb
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Compass is a great cross-platform tool for compiling SASS.
|
2 |
+
# This compass config file will allow you to
|
3 |
+
# quickly dive right in.
|
4 |
+
# For more info about compass + SASS: http://net.tutsplus.com/tutorials/html-css-techniques/using-compass-and-sass-for-css-in-your-next-project/
|
5 |
+
|
6 |
+
require 'susy'
|
7 |
+
|
8 |
+
#########
|
9 |
+
# 1. Set this to the root of your project when deployed:
|
10 |
+
http_path = "/"
|
11 |
+
|
12 |
+
# 2. probably don't need to touch these
|
13 |
+
css_dir = "../css"
|
14 |
+
sass_dir = "./"
|
15 |
+
images_dir = "../../images"
|
16 |
+
environment = :development
|
17 |
+
relative_assets = true
|
18 |
+
|
19 |
+
|
20 |
+
# 3. You can select your preferred output style here (can be overridden via the command line):
|
21 |
+
output_style = :expanded
|
22 |
+
|
23 |
+
# 4. When you are ready to launch your WP theme comment out (3) and uncomment the line below
|
24 |
+
# output_style = :compressed
|
25 |
+
|
26 |
+
# To disable debugging comments that display the original location of your selectors. Uncomment:
|
27 |
+
# line_comments = false
|
28 |
+
|
29 |
+
# don't touch this
|
30 |
+
preferred_syntax = :sass
|
trunk/admin/sass/leadin-admin.sass
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import "compass/utilities/general/clearfix"
|
2 |
+
@import "compass/css3"
|
3 |
+
|
4 |
+
@import variables.sass
|
5 |
+
@import grid.sass
|
6 |
+
@import tables.sass
|
7 |
+
|
8 |
+
//WordPress stuff
|
9 |
+
#leadin
|
10 |
+
padding-right: 20px
|
11 |
+
|
12 |
+
@media screen and (min-width: 500px)
|
13 |
+
padding-right: 10px
|
14 |
+
|
15 |
+
label
|
16 |
+
cursor: default
|
17 |
+
|
18 |
+
.col-wrap
|
19 |
+
padding: 0 14px 0 0
|
20 |
+
|
21 |
+
.metabox-holder
|
22 |
+
+pie-clearfix
|
23 |
+
|
24 |
+
#leadin-footer
|
25 |
+
+pie-clearfix
|
26 |
+
clear: both
|
27 |
+
margin-top: $base-vertical-unit*8
|
28 |
+
color: $color-text-light
|
29 |
+
border-top: 1px solid $color-border
|
30 |
+
|
31 |
+
.support .sharing
|
32 |
+
height: 18px
|
33 |
+
text-align: left
|
34 |
+
|
35 |
+
@media screen and (min-width: 500px)
|
36 |
+
.support, .version, .sharing
|
37 |
+
width: 50%
|
38 |
+
float: left
|
39 |
+
|
40 |
+
.sharing
|
41 |
+
text-align: right
|
42 |
+
|
43 |
+
#wp-admin-bar-leadin-admin-menu
|
44 |
+
|
45 |
+
img
|
46 |
+
height: 16px
|
47 |
+
width: 16px
|
48 |
+
opacity: 0.6
|
49 |
+
|
50 |
+
// Pages
|
51 |
+
@import settings_page.sass
|
52 |
+
@import contacts_list_page.sass
|
53 |
+
@import contact_detail_page.sass
|
54 |
+
@import powerups_page.sass
|
55 |
+
|
trunk/frontend/js/jquery.cookie.js
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* jQuery Cookie Plugin v1.4.0
|
3 |
+
* https://github.com/carhartl/jquery-cookie
|
4 |
+
*
|
5 |
+
* Copyright 2013 Klaus Hartl
|
6 |
+
* Released under the MIT license
|
7 |
+
*/
|
8 |
+
(function (factory) {
|
9 |
+
if (typeof define === 'function' && define.amd) {
|
10 |
+
// AMD. Register as anonymous module.
|
11 |
+
define(['jquery'], factory);
|
12 |
+
} else {
|
13 |
+
// Browser globals.
|
14 |
+
factory(jQuery);
|
15 |
+
}
|
16 |
+
}(function ($) {
|
17 |
+
|
18 |
+
var pluses = /\+/g;
|
19 |
+
|
20 |
+
function encode(s) {
|
21 |
+
return config.raw ? s : encodeURIComponent(s);
|
22 |
+
}
|
23 |
+
|
24 |
+
function decode(s) {
|
25 |
+
return config.raw ? s : decodeURIComponent(s);
|
26 |
+
}
|
27 |
+
|
28 |
+
function stringifyCookieValue(value) {
|
29 |
+
return encode(config.json ? JSON.stringify(value) : String(value));
|
30 |
+
}
|
31 |
+
|
32 |
+
function parseCookieValue(s) {
|
33 |
+
if (s.indexOf('"') === 0) {
|
34 |
+
// This is a quoted cookie as according to RFC2068, unescape...
|
35 |
+
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
36 |
+
}
|
37 |
+
|
38 |
+
try {
|
39 |
+
// Replace server-side written pluses with spaces.
|
40 |
+
// If we can't decode the cookie, ignore it, it's unusable.
|
41 |
+
// If we can't parse the cookie, ignore it, it's unusable.
|
42 |
+
s = decodeURIComponent(s.replace(pluses, ' '));
|
43 |
+
return config.json ? JSON.parse(s) : s;
|
44 |
+
} catch(e) {}
|
45 |
+
}
|
46 |
+
|
47 |
+
function read(s, converter) {
|
48 |
+
var value = config.raw ? s : parseCookieValue(s);
|
49 |
+
return $.isFunction(converter) ? converter(value) : value;
|
50 |
+
}
|
51 |
+
|
52 |
+
var config = $.cookie = function (key, value, options) {
|
53 |
+
|
54 |
+
// Write
|
55 |
+
if (value !== undefined && !$.isFunction(value)) {
|
56 |
+
options = $.extend({}, config.defaults, options);
|
57 |
+
|
58 |
+
if (typeof options.expires === 'number') {
|
59 |
+
var days = options.expires, t = options.expires = new Date();
|
60 |
+
t.setDate(t.getDate() + days);
|
61 |
+
}
|
62 |
+
|
63 |
+
return (document.cookie = [
|
64 |
+
encode(key), '=', stringifyCookieValue(value),
|
65 |
+
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
|
66 |
+
options.path ? '; path=' + options.path : '',
|
67 |
+
options.domain ? '; domain=' + options.domain : '',
|
68 |
+
options.secure ? '; secure' : ''
|
69 |
+
].join(''));
|
70 |
+
}
|
71 |
+
|
72 |
+
// Read
|
73 |
+
|
74 |
+
var result = key ? undefined : {};
|
75 |
+
|
76 |
+
// To prevent the for loop in the first place assign an empty array
|
77 |
+
// in case there are no cookies at all. Also prevents odd result when
|
78 |
+
// calling $.cookie().
|
79 |
+
var cookies = document.cookie ? document.cookie.split('; ') : [];
|
80 |
+
|
81 |
+
for (var i = 0, l = cookies.length; i < l; i++) {
|
82 |
+
var parts = cookies[i].split('=');
|
83 |
+
var name = decode(parts.shift());
|
84 |
+
var cookie = parts.join('=');
|
85 |
+
|
86 |
+
if (key && key === name) {
|
87 |
+
// If second argument (value) is a function it's a converter...
|
88 |
+
result = read(cookie, value);
|
89 |
+
break;
|
90 |
+
}
|
91 |
+
|
92 |
+
// Prevent storing a cookie that we couldn't decode.
|
93 |
+
if (!key && (cookie = read(cookie)) !== undefined) {
|
94 |
+
result[name] = cookie;
|
95 |
+
}
|
96 |
+
}
|
97 |
+
|
98 |
+
return result;
|
99 |
+
};
|
100 |
+
|
101 |
+
config.defaults = {};
|
102 |
+
|
103 |
+
$.removeCookie = function (key, options) {
|
104 |
+
if ($.cookie(key) === undefined) {
|
105 |
+
return false;
|
106 |
+
}
|
107 |
+
|
108 |
+
// Must not alter options, thus extending a fresh object...
|
109 |
+
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
|
110 |
+
return !$.cookie(key);
|
111 |
+
};
|
112 |
+
|
113 |
+
}));
|
trunk/frontend/js/leadin.js
ADDED
@@ -0,0 +1,435 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
var page_title = jQuery(document).find("title").text();
|
2 |
+
var page_url = window.location.href;
|
3 |
+
var page_referrer = document.referrer;
|
4 |
+
var form_saved = false;
|
5 |
+
|
6 |
+
jQuery(document).ready( function ( $ ) {
|
7 |
+
|
8 |
+
var hashkey = $.cookie("li_hash");
|
9 |
+
var li_submission_cookie = $.cookie("li_submission");
|
10 |
+
|
11 |
+
// The submission didn't officially finish before the page refresh, so try it again
|
12 |
+
if ( li_submission_cookie )
|
13 |
+
{
|
14 |
+
var submission_data = JSON.parse(li_submission_cookie);
|
15 |
+
leadin_insert_form_submission(submission_data.submission_hash, submission_data.hashkey, submission_data.page_title, submission_data.page_url, submission_data.json_form_fields, submission_data.lead_email, submission_data.form_submission_type, function ( data ) {
|
16 |
+
// Form was submitted successfully before page reload. Delete cookie for this submission
|
17 |
+
$.removeCookie('li_submission', {path: "/", domain: ""});
|
18 |
+
});
|
19 |
+
}
|
20 |
+
|
21 |
+
if ( !hashkey )
|
22 |
+
{
|
23 |
+
hashkey = Math.random().toString(36).slice(2);
|
24 |
+
$.cookie("li_hash", hashkey, {path: "/", domain: ""});
|
25 |
+
leadin_insert_lead(hashkey, page_referrer);
|
26 |
+
}
|
27 |
+
|
28 |
+
leadin_log_pageview(hashkey, page_title, page_url, page_referrer, $.cookie('li_last_visit'));
|
29 |
+
|
30 |
+
var date = new Date();
|
31 |
+
var current_time = date.getTime();
|
32 |
+
date.setTime(date.getTime() + (60 * 60 * 1000));
|
33 |
+
|
34 |
+
// The li_last_visit has expired, so check to see if this is a stale contact that has been merged
|
35 |
+
if ( !$.cookie('li_last_visit') )
|
36 |
+
{
|
37 |
+
leadin_check_merged_contact(hashkey);
|
38 |
+
}
|
39 |
+
|
40 |
+
$.cookie("li_last_visit", current_time, {path: "/", domain: "", expires: date});
|
41 |
+
});
|
42 |
+
|
43 |
+
jQuery(function($){
|
44 |
+
|
45 |
+
// Many WordPress sites run outdated version of jQuery. This is a fix to support jQuery < 1.7.0 and futureproof the plugin when bind, live, etc are deprecated
|
46 |
+
if ( $.versioncompare($.fn.jquery, '1.7.0') != -1 )
|
47 |
+
{
|
48 |
+
$(document).on('submit', 'form', function( e ) {
|
49 |
+
var $form = $(this).closest('form');
|
50 |
+
leadin_submit_form($form, $);
|
51 |
+
});
|
52 |
+
}
|
53 |
+
else
|
54 |
+
{
|
55 |
+
$(document).bind('submit', 'form', function( e ) {
|
56 |
+
var $form = $(this).closest('form');
|
57 |
+
leadin_submit_form($form, $);
|
58 |
+
});
|
59 |
+
}
|
60 |
+
});
|
61 |
+
|
62 |
+
function leadin_submit_form ( $form, $, form_type )
|
63 |
+
{
|
64 |
+
var $this = $form;
|
65 |
+
|
66 |
+
var form_fields = [];
|
67 |
+
var lead_email = '';
|
68 |
+
var form_submission_type = ( form_type ? form_type : 'lead' );
|
69 |
+
|
70 |
+
// Excludes hidden input fields + submit inputs
|
71 |
+
$this.find('input[type!="submit"], textarea').not('input[type="hidden"], input[type="radio"], input[type="password"]').each( function ( index ) {
|
72 |
+
var $element = $(this);
|
73 |
+
var $value = $element.val();
|
74 |
+
|
75 |
+
if ( !$element.is(':visible' ) )
|
76 |
+
return true;
|
77 |
+
|
78 |
+
// Check if input has an attached lable using for= tag
|
79 |
+
var $label = $("label[for='" + $element.attr('id') + "']").text();
|
80 |
+
|
81 |
+
// Check for label in same container immediately before input
|
82 |
+
if ($label.length == 0)
|
83 |
+
{
|
84 |
+
$label = $element.prev('label').not('.li_used').addClass('li_used').first().text();
|
85 |
+
|
86 |
+
if ( !$label.length )
|
87 |
+
{
|
88 |
+
$label = $element.prevAll('b, strong, span').text(); // Find previous closest string
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
// Check for label in same container immediately after input
|
93 |
+
if ($label.length == 0)
|
94 |
+
{
|
95 |
+
$label = $element.next('label').not('.li_used').addClass('li_used').first().text();
|
96 |
+
|
97 |
+
if ( !$label.length )
|
98 |
+
{
|
99 |
+
$label = $element.nextAll('b, strong, span').text(); // Find next closest string
|
100 |
+
}
|
101 |
+
}
|
102 |
+
|
103 |
+
// Checks the parent for a label or bold text
|
104 |
+
if ($label.length == 0)
|
105 |
+
{
|
106 |
+
$label = $element.parent().find('label, b, strong').not('.li_used').first().text();
|
107 |
+
}
|
108 |
+
|
109 |
+
// Checks the parent's parent for a label or bold text
|
110 |
+
if ($label.length == 0)
|
111 |
+
{
|
112 |
+
if ( $.contains($this, $element.parent().parent()) )
|
113 |
+
{
|
114 |
+
$label = $element.parent().parent().find('label, b, strong').first().text();
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
// Looks for closests p tag parent, and looks for label inside
|
119 |
+
if ( $label.length == 0 )
|
120 |
+
{
|
121 |
+
$p = $element.closest('p').not('.li_used').addClass('li_used');
|
122 |
+
|
123 |
+
// This gets the text from the p tag parent if it exists
|
124 |
+
if ( $p.length )
|
125 |
+
{
|
126 |
+
$label = $p.text();
|
127 |
+
$label = $.trim($label.replace($value, "")); // Hack to exclude the textarea text from the label text
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
131 |
+
// Check for placeholder attribute
|
132 |
+
if ( $label.length == 0 )
|
133 |
+
{
|
134 |
+
if ( $element.attr('placeholder') !== undefined )
|
135 |
+
{
|
136 |
+
$label = $element.attr('placeholder').toString();
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
if ( $label.length == 0 )
|
141 |
+
{
|
142 |
+
if ( $element.attr('name') !== undefined )
|
143 |
+
{
|
144 |
+
$label = $element.attr('name').toString();
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
if ( $element.is(':checkbox') )
|
149 |
+
{
|
150 |
+
if ( $element.is(':checked'))
|
151 |
+
{
|
152 |
+
$value = 'Checked';
|
153 |
+
}
|
154 |
+
else
|
155 |
+
{
|
156 |
+
$value = 'Not checked';
|
157 |
+
}
|
158 |
+
}
|
159 |
+
|
160 |
+
var $label_text = $.trim($label.replaceArray(["(", ")", "required", "Required", "*", ":"], [""]));
|
161 |
+
|
162 |
+
push_form_field($label_text, $value, form_fields);
|
163 |
+
|
164 |
+
if ( $value.indexOf('@') != -1 && $value.indexOf('.') != -1 && !lead_email )
|
165 |
+
lead_email = $value;
|
166 |
+
});
|
167 |
+
|
168 |
+
var radio_groups = [];
|
169 |
+
var rbg_label_values = [];
|
170 |
+
$this.find(":radio").each(function(){
|
171 |
+
if ( $.inArray(this.name, radio_groups) == -1 )
|
172 |
+
radio_groups.push(this.name);
|
173 |
+
rbg_label_values.push($(this).val());
|
174 |
+
});
|
175 |
+
|
176 |
+
for ( var i = 0; i < radio_groups.length; i++ )
|
177 |
+
{
|
178 |
+
var $rbg = $("input:radio[name='" + radio_groups[i] + "']");
|
179 |
+
var $rbg_value = $("input:radio[name='" + radio_groups[i] + "']:checked").val();
|
180 |
+
|
181 |
+
if ( $this.find('.gfield').length ) // Hack for gravity forms
|
182 |
+
$p = $rbg.closest('.gfield').not('.li_used').addClass('li_used');
|
183 |
+
else if ( $this.find('.frm_form_field').length ) // Hack for Formidable
|
184 |
+
$p = $rbg.closest('.frm_form_field').not('.li_used').addClass('li_used');
|
185 |
+
else
|
186 |
+
$p = $rbg.closest('div, p').not('.li_used').addClass('li_used');
|
187 |
+
|
188 |
+
// This gets the text from the p tag parent if it exists
|
189 |
+
if ( $p.length )
|
190 |
+
{
|
191 |
+
//$p.find('label, strong, span, b').html();
|
192 |
+
$rbg_label = $p.text();
|
193 |
+
$rbg_label = $.trim($rbg_label.replaceArray(rbg_label_values, [""]).replace($p.find('.gfield_description').text(), ''));
|
194 |
+
// Remove .gfield_description from gravity forms
|
195 |
+
}
|
196 |
+
|
197 |
+
var rgb_selected = ( !$("input:radio[name='" + radio_groups[i] + "']:checked").val() ) ? 'not selected' : $("input:radio[name='" + radio_groups[i] + "']:checked").val();
|
198 |
+
|
199 |
+
push_form_field($rbg_label, rgb_selected, form_fields);
|
200 |
+
}
|
201 |
+
|
202 |
+
$this.find('select').each( function ( ) {
|
203 |
+
var $select = $(this);
|
204 |
+
var $select_label = $("label[for='" + $select.attr('id') + "']").text();
|
205 |
+
|
206 |
+
if ( !$select_label.length )
|
207 |
+
{
|
208 |
+
var select_values = [];
|
209 |
+
$select.find("option").each(function(){
|
210 |
+
if ( $.inArray($(this).val(), select_values) == -1 )
|
211 |
+
select_values.push($(this).val());
|
212 |
+
});
|
213 |
+
|
214 |
+
$p = $select.closest('div, p').not('.li_used').addClass('li_used');
|
215 |
+
|
216 |
+
if ( $this.find('.gfield').length ) // Hack for gravity forms
|
217 |
+
$p = $select.closest('.gfield').not('.li_used').addClass('li_used');
|
218 |
+
else
|
219 |
+
{
|
220 |
+
$p = $select.closest('div, p').addClass('li_used');
|
221 |
+
}
|
222 |
+
|
223 |
+
if ( $p.length )
|
224 |
+
{
|
225 |
+
$select_label = $p.text();
|
226 |
+
$select_label = $.trim($select_label.replaceArray(select_values, [""]).replace($p.find('.gfield_description').text(), ''));
|
227 |
+
}
|
228 |
+
}
|
229 |
+
|
230 |
+
push_form_field($select_label, $select.val(), form_fields);
|
231 |
+
});
|
232 |
+
|
233 |
+
$this.find('.li_used').removeClass('li_used'); // Clean up added classes
|
234 |
+
|
235 |
+
if ( $this.find('#comment_post_ID').length )
|
236 |
+
{
|
237 |
+
form_submission_type = 'comment';
|
238 |
+
}
|
239 |
+
|
240 |
+
// Save submission into database, send LeadIn email, and submit form as usual
|
241 |
+
if ( lead_email )
|
242 |
+
{
|
243 |
+
var submission_hash = Math.random().toString(36).slice(2);
|
244 |
+
var hashkey = $.cookie("li_hash");
|
245 |
+
var json_form_fields = JSON.stringify(form_fields);
|
246 |
+
|
247 |
+
var form_submission = {};
|
248 |
+
form_submission = {
|
249 |
+
"submission_hash": submission_hash,
|
250 |
+
"hashkey": hashkey,
|
251 |
+
"lead_email": lead_email,
|
252 |
+
"page_title": page_title,
|
253 |
+
"page_url": page_url,
|
254 |
+
"json_form_fields": json_form_fields,
|
255 |
+
"form_submission_type": form_submission_type,
|
256 |
+
};
|
257 |
+
|
258 |
+
$.cookie("li_submission", JSON.stringify(form_submission), {path: "/", domain: ""});
|
259 |
+
|
260 |
+
leadin_insert_form_submission(submission_hash, hashkey, page_title, page_url, json_form_fields, lead_email, form_submission_type, function ( data ) {
|
261 |
+
// Form was executed 100% successfully before page reload. Delete cookie for this submission
|
262 |
+
$.removeCookie('li_submission', {path: "/", domain: ""});
|
263 |
+
});
|
264 |
+
}
|
265 |
+
else // No lead - submit form as usual
|
266 |
+
{
|
267 |
+
form_saved = true;
|
268 |
+
}
|
269 |
+
}
|
270 |
+
|
271 |
+
function leadin_check_merged_contact ( hashkey )
|
272 |
+
{
|
273 |
+
jQuery.ajax({
|
274 |
+
type: 'POST',
|
275 |
+
url: li_ajax.ajax_url,
|
276 |
+
data: {
|
277 |
+
"action": "leadin_check_merged_contact",
|
278 |
+
"li_id": hashkey
|
279 |
+
},
|
280 |
+
success: function(data){
|
281 |
+
// Force override the current tracking with the merged value
|
282 |
+
var json_data = jQuery.parseJSON(data);
|
283 |
+
if ( json_data )
|
284 |
+
jQuery.cookie("li_hash", json_data, {path: "/", domain: ""});
|
285 |
+
},
|
286 |
+
error: function ( error_data ) {
|
287 |
+
//alert(error_data);
|
288 |
+
}
|
289 |
+
});
|
290 |
+
}
|
291 |
+
|
292 |
+
function leadin_check_visitor_status ( hashkey, callback )
|
293 |
+
{
|
294 |
+
jQuery.ajax({
|
295 |
+
type: 'POST',
|
296 |
+
url: li_ajax.ajax_url,
|
297 |
+
data: {
|
298 |
+
"action": "leadin_check_visitor_status",
|
299 |
+
"li_id": hashkey
|
300 |
+
},
|
301 |
+
success: function(data){
|
302 |
+
// Force override the current tracking with the merged value
|
303 |
+
var json_data = jQuery.parseJSON(data);
|
304 |
+
|
305 |
+
if ( callback )
|
306 |
+
callback(json_data);
|
307 |
+
},
|
308 |
+
error: function ( error_data ) {
|
309 |
+
//alert(error_data);
|
310 |
+
}
|
311 |
+
});
|
312 |
+
}
|
313 |
+
|
314 |
+
function leadin_log_pageview ( hashkey, page_title, page_url, page_referrer, last_visit )
|
315 |
+
{
|
316 |
+
jQuery.ajax({
|
317 |
+
type: 'POST',
|
318 |
+
url: li_ajax.ajax_url,
|
319 |
+
data: {
|
320 |
+
"action": "leadin_log_pageview",
|
321 |
+
"li_id": hashkey,
|
322 |
+
"li_title": page_title,
|
323 |
+
"li_url": page_url,
|
324 |
+
"li_referrer": page_referrer,
|
325 |
+
"li_last_visit": last_visit
|
326 |
+
},
|
327 |
+
success: function(data){
|
328 |
+
},
|
329 |
+
error: function ( error_data ) {
|
330 |
+
//alert(error_data);
|
331 |
+
}
|
332 |
+
});
|
333 |
+
}
|
334 |
+
|
335 |
+
function leadin_insert_lead ( hashkey, page_referrer ) {
|
336 |
+
jQuery.ajax({
|
337 |
+
type: 'POST',
|
338 |
+
url: li_ajax.ajax_url,
|
339 |
+
data: {
|
340 |
+
"action": "leadin_insert_lead",
|
341 |
+
"li_id": hashkey,
|
342 |
+
"li_referrer": page_referrer
|
343 |
+
},
|
344 |
+
success: function(data){
|
345 |
+
},
|
346 |
+
error: function ( error_data ) {
|
347 |
+
//alert(error_data);
|
348 |
+
}
|
349 |
+
});
|
350 |
+
}
|
351 |
+
|
352 |
+
function leadin_insert_form_submission ( submission_haskey, hashkey, page_title, page_url, json_fields, lead_email, form_submission_type, Callback )
|
353 |
+
{
|
354 |
+
jQuery.ajax({
|
355 |
+
type: 'POST',
|
356 |
+
url: li_ajax.ajax_url,
|
357 |
+
data: {
|
358 |
+
"action": "leadin_insert_form_submission",
|
359 |
+
"li_submission_id": submission_haskey,
|
360 |
+
"li_id": hashkey,
|
361 |
+
"li_title": page_title,
|
362 |
+
"li_url": page_url,
|
363 |
+
"li_fields": json_fields,
|
364 |
+
"li_email": lead_email,
|
365 |
+
"li_submission_type": form_submission_type
|
366 |
+
},
|
367 |
+
success: function(data){
|
368 |
+
if ( Callback )
|
369 |
+
Callback(data);
|
370 |
+
},
|
371 |
+
error: function ( error_data ) {
|
372 |
+
//alert(error_data);
|
373 |
+
}
|
374 |
+
});
|
375 |
+
|
376 |
+
}
|
377 |
+
|
378 |
+
function push_form_field ( label, value, form_fields )
|
379 |
+
{
|
380 |
+
var field = {
|
381 |
+
label: label,
|
382 |
+
value: value
|
383 |
+
};
|
384 |
+
|
385 |
+
form_fields.push(field);
|
386 |
+
}
|
387 |
+
|
388 |
+
String.prototype.replaceArray = function(find, replace) {
|
389 |
+
var replaceString = this;
|
390 |
+
for (var i = 0; i < find.length; i++) {
|
391 |
+
if ( replace.length != 1 )
|
392 |
+
replaceString = replaceString.replace(find[i], replace[i]);
|
393 |
+
else
|
394 |
+
replaceString = replaceString.replace(find[i], replace[0]);
|
395 |
+
}
|
396 |
+
return replaceString;
|
397 |
+
};
|
398 |
+
|
399 |
+
/**
|
400 |
+
* Checks the version number of jQuery and compares to string
|
401 |
+
*
|
402 |
+
* @param string
|
403 |
+
* @param string
|
404 |
+
*
|
405 |
+
* @return bool
|
406 |
+
*/
|
407 |
+
|
408 |
+
(function($){
|
409 |
+
$.versioncompare = function(version1, version2){
|
410 |
+
if ('undefined' === typeof version1) {
|
411 |
+
throw new Error("$.versioncompare needs at least one parameter.");
|
412 |
+
}
|
413 |
+
version2 = version2 || $.fn.jquery;
|
414 |
+
if (version1 == version2) {
|
415 |
+
return 0;
|
416 |
+
}
|
417 |
+
var v1 = normalize(version1);
|
418 |
+
var v2 = normalize(version2);
|
419 |
+
var len = Math.max(v1.length, v2.length);
|
420 |
+
for (var i = 0; i < len; i++) {
|
421 |
+
v1[i] = v1[i] || 0;
|
422 |
+
v2[i] = v2[i] || 0;
|
423 |
+
if (v1[i] == v2[i]) {
|
424 |
+
continue;
|
425 |
+
}
|
426 |
+
return v1[i] > v2[i] ? 1 : -1;
|
427 |
+
}
|
428 |
+
return 0;
|
429 |
+
};
|
430 |
+
function normalize(version){
|
431 |
+
return $.map(version.split('.'), function(value){
|
432 |
+
return parseInt(value, 10);
|
433 |
+
});
|
434 |
+
}
|
435 |
+
}(jQuery));
|
trunk/images/checkmark.png
ADDED
Binary file
|
trunk/images/leadin-icon-32x32.png
ADDED
Binary file
|
trunk/images/leadin-svg-icon.svg
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2 |
+
<svg width="32px" height="20px" viewBox="0 0 32 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
3 |
+
<title>leadin-svg-icon</title>
|
4 |
+
<description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
|
5 |
+
<defs></defs>
|
6 |
+
<g id="Logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
7 |
+
<path d="M24.2659022,1.36625531 L18.6030712,19.9939886 L24.3824248,19.9939886 C25.180195,19.9939886 26.0085196,19.3966068 26.2321138,18.6610995 L31.4897464,1.36625531 C31.7135312,0.630121017 31.2475193,0.0333662628 30.450454,0.0333662628 L26.1155911,0.0333662628 C25.3178209,0.0333662628 24.4894964,0.63074804 24.2659022,1.36625531 Z" id="Rectangle-100" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
|
8 |
+
<path d="M13.4017203,6.68750917 L9.35655059,19.9939886 L15.1359041,19.9939886 C15.9336743,19.9939886 16.761737,19.3974683 16.9851132,18.6626783 L21.0302829,5.35619888 L15.2509294,5.35619888 C14.4531592,5.35619888 13.6250965,5.95271916 13.4017203,6.68750917 Z" id="Rectangle-100-copy" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
|
9 |
+
<path d="M2.53756131,12.008688 L0.514245522,18.664332 C0.291003421,19.3986811 0.757455297,19.9939886 1.55452066,19.9939886 L5.88938348,19.9939886 C6.68715368,19.9939886 7.51532043,19.3971259 7.73808978,18.664332 L10.1656212,10.6790315 L4.38626761,10.6790315 C3.58849742,10.6790315 2.76033066,11.2758941 2.53756131,12.008688 Z" id="Rectangle-100-copy-2" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
|
10 |
+
</g>
|
11 |
+
</svg>
|
trunk/images/power-up-icon-mailchimp-list-sync.png
ADDED
Binary file
|
trunk/images/power-up-icon-mailchimp-list-sync@2x.png
ADDED
Binary file
|
trunk/images/power-up-icon-mailchimp-list-sync_small.png
ADDED
Binary file
|
trunk/images/power-up-icon-mailchimp-list-sync_small@2x.png
ADDED
Binary file
|
trunk/images/powerup-icon-analytics.png
ADDED
Binary file
|
trunk/images/powerup-icon-analytics@2x.png
ADDED
Binary file
|
trunk/images/powerup-icon-ideas.png
ADDED
Binary file
|
trunk/images/powerup-icon-ideas@2x.png
ADDED
Binary file
|
trunk/images/powerup-icon-leads.png
ADDED
Binary file
|
trunk/images/powerup-icon-leads@2x.png
ADDED
Binary file
|
trunk/images/powerup-icon-subscribe.png
ADDED
Binary file
|
trunk/images/powerup-icon-subscribe@2x.png
ADDED
Binary file
|
trunk/images/powerups.png
ADDED
Binary file
|
trunk/images/triangle.png
ADDED
Binary file
|
trunk/inc/class-emailer.php
ADDED
@@ -0,0 +1,435 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
//=============================================
|
3 |
+
// LI_Emailer Class
|
4 |
+
//=============================================
|
5 |
+
class LI_Emailer {
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Class constructor
|
9 |
+
*/
|
10 |
+
function LI_Emailer ()
|
11 |
+
{
|
12 |
+
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Sends the leads history email
|
17 |
+
*
|
18 |
+
* @param string
|
19 |
+
* @return bool $email_sent Whether the email contents were sent successfully. A true return value does not automatically mean that the user received the email successfully. It just only means that the method used was able to process the request without any errors.
|
20 |
+
*/
|
21 |
+
function send_new_lead_email ( $hashkey )
|
22 |
+
{
|
23 |
+
$history = $this->get_lead_history($hashkey);
|
24 |
+
|
25 |
+
$avatar_img = "https://app.getsignals.com/avatar/image/?emails=" . $history->lead->lead_email;
|
26 |
+
|
27 |
+
// @EMAIL - Use this variable to concatenate your HTML
|
28 |
+
$body = "";
|
29 |
+
|
30 |
+
// Email Base open
|
31 |
+
$body .= "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html xmlns='http://www.w3.org/1999/xhtml' xmlns='http://www.w3.org/1999/xhtml'><head><meta http-equiv='Content-Type' content='text/html;charset=utf-8'/><meta name='viewport' content='width=device-width'/></head><body style='width: 100% !important;-webkit-text-size-adjust: 100%;-ms-text-size-adjust: 100%;color: #222222;display: block;font-family: Helvetica, Arial, sans-serif;font-weight: normal;text-align: left;line-height: 19px;font-size: 14px;margin: 0;padding: 0;'><style type='text/css'>a:hover{color: #2795b6 !important;}a:active{color: #2795b6 !important;}a:visited{color: #2ba6cb !important;}h1 a:active{color: #2ba6cb !important;}h2 a:active{color: #2ba6cb !important;}h3 a:active{color: #2ba6cb !important;}h4 a:active{color: #2ba6cb !important;}h5 a:active{color: #2ba6cb !important;}h6 a:active{color: #2ba6cb !important;}h1 a:visited{color: #2ba6cb !important;}h2 a:visited{color: #2ba6cb !important;}h3 a:visited{color: #2ba6cb !important;}h4 a:visited{color: #2ba6cb !important;}h5 a:visited{color: #2ba6cb !important;}h6 a:visited{color: #2ba6cb !important;}.button:hover table td{background: #2795b6 !important;}.tiny-button:hover table td{background: #2795b6 !important;}.small-button:hover table td{background: #2795b6 !important;}.medium-button:hover table td{background: #2795b6 !important;}.large-button:hover table td{background: #2795b6 !important;}.button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.tiny-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.tiny-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.tiny-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.small-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.small-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.small-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.medium-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.medium-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.medium-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.large-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.large-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.large-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.secondary:hover table td{background: #d0d0d0 !important;}.success:hover table td{background: #457a1a !important;}.alert:hover table td{background: #970b0e !important;}@media only screen and (max-width: 600px){table[class='body'] img{width: auto !important;height: auto !important;}table[class='body'] .container{width: 95% !important;}table[class='body'] .row{width: 100% !important;display: block !important;}table[class='body'] .wrapper{display: block !important;padding-right: 0 !important;}table[class='body'] .columns{table-layout: fixed !important;float: none !important;width: 100% !important;padding-right: 0px !important;padding-left: 0px !important;display: block !important;}table[class='body'] .column{table-layout: fixed !important;float: none !important;width: 100% !important;padding-right: 0px !important;padding-left: 0px !important;display: block !important;}table[class='body'] .wrapper.first .columns{display: table !important;}table[class='body'] .wrapper.first .column{display: table !important;}table[class='body'] table.columns td{width: 100%;}table[class='body'] table.column td{width: 100%;}table[class='body'] td.offset-by-one{padding-left: 0 !important;}table[class='body'] td.offset-by-two{padding-left: 0 !important;}table[class='body'] td.offset-by-three{padding-left: 0 !important;}table[class='body'] td.offset-by-four{padding-left: 0 !important;}table[class='body'] td.offset-by-five{padding-left: 0 !important;}table[class='body'] td.offset-by-six{padding-left: 0 !important;}table[class='body'] td.offset-by-seven{padding-left: 0 !important;}table[class='body'] td.offset-by-eight{padding-left: 0 !important;}table[class='body'] td.offset-by-nine{padding-left: 0 !important;}table[class='body'] td.offset-by-ten{padding-left: 0 !important;}table[class='body'] td.offset-by-eleven{padding-left: 0 !important;}table[class='body'] .expander{width: 9999px !important;}table[class='body'] .hide-for-small{display: none !important;}table[class='body'] .show-for-desktop{display: none !important;}table[class='body'] .show-for-small{display: inherit !important;}table[class='body'] .hide-for-desktop{display: inherit !important;}table[class='body'] .container.main{width: 100% !important;}}</style><table class='body' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;height: 100%;width: 100%;padding: 0;'><tr align='left' style='vertical-align: top; text-align: left; padding: 0;'><td class='center' align='center' valign='top' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;padding: 0 0 20px;'><center style='width: 100%;'>";
|
32 |
+
|
33 |
+
// Email Header open
|
34 |
+
$body .= "<table class='row header' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='center' align='center' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;padding: 0;' valign='top'><center style='width: 100%;'><table class='container' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: inherit;width: 580px;margin:0 auto 10px auto; padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 10px 0px 0px;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='two sub-columns' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;width: 16.66667% !important;padding: 0px 3.44828% 10px 0px;' align='left' valign='top'><img width='77' height='77' src='" . $avatar_img . "' style='outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;width: auto;max-width: 100%;float: left;clear: both;display: block;' align='left'/></td><td class='ten sub-columns last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: middle;text-align: left;width: 83.33333% !important;padding: 0px 0px 10px;' align='left' valign='middle'>";
|
35 |
+
|
36 |
+
$body .= "<h1 class='lead-name' style='color: #222222; display: block; font-family: Helvetica, Arial, sans-serif; font-weight: bold; text-align: left; line-height: 1.3; word-break: normal; font-size: 20px; margin: 0; padding: 0;' align='left'>" . $history->lead->lead_email . "</h1>";
|
37 |
+
|
38 |
+
// Email Header close
|
39 |
+
$body .= "</td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;padding: 0;' align='left' valign='top'></td></tr></table></td></tr></table></center></td></tr></table>";
|
40 |
+
|
41 |
+
// Main container open
|
42 |
+
$body .= "<table class='container main' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: inherit;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;padding: 0;' align='left' valign='top'>";
|
43 |
+
|
44 |
+
// Form Submission section open
|
45 |
+
$body .= "<table class='row section form-submission' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;display: block;background: #deedf8;padding: 0px;' bgcolor='#deedf8'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 0 0px 0 0;' align='left' valign='top'>";
|
46 |
+
|
47 |
+
// Form Submission section header
|
48 |
+
$body .= $this->build_submission_header($history->submission, FALSE);
|
49 |
+
|
50 |
+
// Form Submission Rows
|
51 |
+
$fields = json_decode(stripslashes($history->submission->form_fields), true);
|
52 |
+
|
53 |
+
foreach ( $fields as $field )
|
54 |
+
{
|
55 |
+
$body .= $this->build_submission_row($field);
|
56 |
+
}
|
57 |
+
|
58 |
+
// Form Submission Section Close
|
59 |
+
$body .= "</td></tr></table>";
|
60 |
+
|
61 |
+
// @EMAIL - end form section
|
62 |
+
|
63 |
+
// History section title
|
64 |
+
$body .= "<h2 class='section-title' style='color: #222222; display: block; font-family: Helvetica, Arial, sans-serif; font-weight: bold; text-align: left; line-height: 1.3; word-break: normal; font-size: 18px; margin: 0; padding: 30px 0px 0px 20px;' align='left'>Lead History</h2>";
|
65 |
+
|
66 |
+
foreach ( array_reverse($history->pageviews_by_session) as $session )
|
67 |
+
{
|
68 |
+
// History section open
|
69 |
+
$body .= "<table class='row section lead-history' style='border-spacing: 0; border-collapse: collapse; vertical-align: top; text-align: left; width: 100%; position: relative; display: block; background: #ffefe6; padding: 0px; margin-top: 20px;' bgcolor='#ffefe6'><tr style='vertical-align: top; text-align: left; padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; vertical-align: top; text-align: left; position: relative; padding: 0 0px 0 0;' align='left' valign='top'>";
|
70 |
+
|
71 |
+
$body .= $this->build_history_header($session);
|
72 |
+
|
73 |
+
// History section rows
|
74 |
+
foreach ( $session as $pageview )
|
75 |
+
{
|
76 |
+
$body .= $this->build_history_row($pageview);
|
77 |
+
}
|
78 |
+
|
79 |
+
// History section close
|
80 |
+
$body .= '</td></tr></table>';
|
81 |
+
|
82 |
+
// @EMAIL - end session
|
83 |
+
}
|
84 |
+
// @EMAIL - end visit history
|
85 |
+
|
86 |
+
// Button row
|
87 |
+
$body .= $this->build_button_row($history->lead->lead_id);
|
88 |
+
|
89 |
+
// Main container close
|
90 |
+
$body .= '</td></tr></table>';
|
91 |
+
|
92 |
+
// Email Base close
|
93 |
+
$body .= '</center></td></tr></table></body></html>';
|
94 |
+
|
95 |
+
// Each line in an email can only be 998 characters long, so lines need to be broken with a wordwrap
|
96 |
+
$body = wordwrap($body, 900, "\r\n");
|
97 |
+
|
98 |
+
$headers = "From: LeadIn <team@leadin.com>\r\n";
|
99 |
+
$headers.= "Reply-To: LeadIn <team@leadin.com>\r\n";
|
100 |
+
$headers.= "X-Mailer: PHP/" . phpversion()."\r\n";
|
101 |
+
$headers.= "MIME-Version: 1.0\r\n";
|
102 |
+
$headers.= "Content-type: text/html; charset=utf-8\r\n";
|
103 |
+
|
104 |
+
// Get email from plugin settings, if none set, use admin email
|
105 |
+
$options = get_option('leadin_options');
|
106 |
+
$to = ( $options['li_email'] ? $options['li_email'] : get_bloginfo('admin_email') ); // Get email from plugin settings, if none set, use admin email
|
107 |
+
|
108 |
+
if ( $history->submission->form_type == "comment" )
|
109 |
+
{
|
110 |
+
$subject = "New comment posted on " . $history->submission->form_page_title;
|
111 |
+
leadin_track_plugin_activity("New comment");
|
112 |
+
$subject .= " by " . $history->lead->lead_email;
|
113 |
+
}
|
114 |
+
else if ( $history->submission->form_type == "subscribe" )
|
115 |
+
{
|
116 |
+
$subject = "New subscriber from " . $history->submission->form_page_title;
|
117 |
+
leadin_track_plugin_activity("New subscriber");
|
118 |
+
$this->send_subscriber_confirmation_email($history);
|
119 |
+
}
|
120 |
+
else
|
121 |
+
{
|
122 |
+
if ( $history->new_contact )
|
123 |
+
{
|
124 |
+
$subject = "New lead from " . get_bloginfo('name') . " - Say hello to " . $history->lead->lead_email;
|
125 |
+
leadin_track_plugin_activity("New lead");
|
126 |
+
}
|
127 |
+
else
|
128 |
+
{
|
129 |
+
$subject = "Lead from " . get_bloginfo('name') . " - Say hello again to " . $history->lead->lead_email;
|
130 |
+
leadin_track_plugin_activity("Returning lead");
|
131 |
+
}
|
132 |
+
}
|
133 |
+
|
134 |
+
$email_sent = wp_mail($to, $subject, $body, $headers);
|
135 |
+
return $email_sent;
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Gets lead history from the database (pageviews, form submission, and lead details)
|
140 |
+
*
|
141 |
+
* @param string
|
142 |
+
* @return object $history (pageviews_by_session, submission, lead)
|
143 |
+
*/
|
144 |
+
function get_lead_history ( $hashkey )
|
145 |
+
{
|
146 |
+
global $wpdb;
|
147 |
+
|
148 |
+
$q = $wpdb->prepare(
|
149 |
+
"SELECT
|
150 |
+
pageview_id,
|
151 |
+
DATE_FORMAT(pageview_date, %s) AS pageview_day,
|
152 |
+
DATE_FORMAT(pageview_date, %s) AS pageview_date,
|
153 |
+
lead_hashkey, pageview_title, pageview_url, pageview_source, pageview_session_start
|
154 |
+
FROM
|
155 |
+
li_pageviews
|
156 |
+
WHERE
|
157 |
+
lead_hashkey LIKE %s ORDER BY pageview_date ASC", '%b %e', '%b %e %l:%i%p', $hashkey);
|
158 |
+
|
159 |
+
$pageviews = $wpdb->get_results($q);
|
160 |
+
|
161 |
+
$pageviews_by_session = array();
|
162 |
+
$cur_array = '0';
|
163 |
+
$count = 0;
|
164 |
+
foreach ( $pageviews as $pageview )
|
165 |
+
{
|
166 |
+
if ( $pageview->pageview_session_start )
|
167 |
+
{
|
168 |
+
$cur_array = $count;
|
169 |
+
$pageviews_by_session['session_' . $cur_array] = array();
|
170 |
+
}
|
171 |
+
|
172 |
+
$pageviews_by_session['session_' . $cur_array][] = $pageview;
|
173 |
+
$count++;
|
174 |
+
}
|
175 |
+
|
176 |
+
$q = $wpdb->prepare("SELECT form_date AS form_datetime, DATE_FORMAT(form_date, %s) AS form_date, form_page_title, form_page_url, form_fields, form_type FROM li_submissions WHERE lead_hashkey = '%s' ORDER BY form_datetime DESC", '%b %e %l:%i%p', $hashkey);
|
177 |
+
$submissions = $wpdb->get_results($q);
|
178 |
+
|
179 |
+
$q = $wpdb->prepare("SELECT lead_id, lead_date, lead_ip, lead_source, lead_email, lead_status FROM li_leads WHERE hashkey LIKE %s AND lead_email != ''", $hashkey);
|
180 |
+
$lead = $wpdb->get_row($q);
|
181 |
+
|
182 |
+
$history = (object)NULL;
|
183 |
+
$history->pageviews_by_session = $pageviews_by_session;
|
184 |
+
$history->submission = $submissions[0];
|
185 |
+
$history->new_contact = ( count($submissions) == 1 ? true : false );
|
186 |
+
$history->lead = $lead;
|
187 |
+
|
188 |
+
return $history;
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Builds the blue form submission header for the lead email
|
193 |
+
* @param object $submission
|
194 |
+
* @return string
|
195 |
+
*/
|
196 |
+
function build_submission_header ( $submission, $confirmation_email = FALSE )
|
197 |
+
{
|
198 |
+
// @EMAIL Use these variables to construct the heading for the form section
|
199 |
+
$form_page_title = "<a href='" . $submission->form_page_url . "'>" . $submission->form_page_title . "</a>";
|
200 |
+
$form_submission_day = date('M j' , strtotime($submission->form_date));
|
201 |
+
$form_submission_time = date('g:i a', strtotime($submission->form_date));
|
202 |
+
$form_submission_type = $submission->form_type;
|
203 |
+
|
204 |
+
$submissionHeader = "";
|
205 |
+
|
206 |
+
// Form Submission header open
|
207 |
+
$submissionHeader .= "<table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='section-header' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;border-bottom-width: 1px;border-bottom-color: #c9e1f3;border-bottom-style: solid;background: #c9e1f3;padding: 15px 20px;' align='left' bgcolor='#c9e1f3' valign='top'>";
|
208 |
+
|
209 |
+
// Form Submission header content
|
210 |
+
$submissionHeader .= "<h3 style='color: #153d60;display: block;font-family: Helvetica, Arial, sans-serif;font-weight: bold;text-align: left;line-height: 1.3;word-break: normal;font-size: 16px;margin: 0;padding: 0;' align='left'>";
|
211 |
+
|
212 |
+
if ( $form_submission_type == "comment" )
|
213 |
+
{
|
214 |
+
$submissionHeader .= "Commented on " . $form_page_title . " on " . $form_submission_day . ' at ' . $form_submission_time;
|
215 |
+
}
|
216 |
+
else
|
217 |
+
{
|
218 |
+
$submissionHeader .= ( $confirmation_email ? "You filled out the subscription form on " : "Filled out a form on " ) . $form_page_title . " on " . $form_submission_day . ' at ' . $form_submission_time;
|
219 |
+
}
|
220 |
+
|
221 |
+
$submissionHeader .= "</h3>";
|
222 |
+
|
223 |
+
// Form Submission header close
|
224 |
+
$submissionHeader .= "</td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;border-bottom-color: #c9e1f3;border-bottom-style: solid;padding: 0;border-width: 0 0 1px;' align='left' valign='top'></td></tr></table>";
|
225 |
+
|
226 |
+
return $submissionHeader;
|
227 |
+
}
|
228 |
+
|
229 |
+
/**
|
230 |
+
* Builds a row containing a form field in the submission section for the lead email
|
231 |
+
* @param object $field
|
232 |
+
* @return string
|
233 |
+
*/
|
234 |
+
function build_submission_row ( $field )
|
235 |
+
{
|
236 |
+
$submissionRow = "\r\n";
|
237 |
+
|
238 |
+
// Form Submission Row open
|
239 |
+
$submissionRow .= "<table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr align='left' style='vertical-align: top; text-align: left; padding: 0;'><td align='left' valign='top' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;border-bottom-width: 1px;border-bottom-color: #c9e1f3;border-bottom-style: solid;padding: 10px 20px;'>";
|
240 |
+
|
241 |
+
// Form Submission Label
|
242 |
+
$submissionRow .= "<p class='form-field-label' style='color: #222222; display: block; font-family: Helvetica, Arial, sans-serif; font-weight: bold; text-align: left; line-height: 19px; font-size: 12px; margin: 0; padding: 0;' align='left'>" . $field['label'] . "</p>";
|
243 |
+
|
244 |
+
// Form Submission Value
|
245 |
+
$submissionRow .= "<p class='form-field' style='color: #222222; display: block; font-family: Helvetica, Arial, sans-serif; font-weight: normal; text-align: left; line-height: 19px; font-size: 14px; margin: 0; padding: 3px 0 0;' align='left'>" . ( $field['value'] ? $field['value'] : 'not provided' ) . "</p>";
|
246 |
+
|
247 |
+
// Form Submission Row close
|
248 |
+
$submissionRow .= "<td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;border-bottom-color: #c9e1f3;border-bottom-style: solid;padding: 0;border-width: 0 0 1px;' align='left' valign='top'></td></tr></table>";
|
249 |
+
|
250 |
+
return $submissionRow;
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Builds the orange session heading for the lead email
|
255 |
+
* @param object $session
|
256 |
+
* @return string
|
257 |
+
*/
|
258 |
+
function build_history_header ( $session )
|
259 |
+
{
|
260 |
+
// @EMAIL - Use these variables to construct the heading for a specfic session
|
261 |
+
$session_header = $session[0]->pageview_day;
|
262 |
+
$session_start_time = str_replace(array('PM', 'AM'), array('pm', 'am'), str_replace($session[0]->pageview_day . " ", "", $session[0]->pageview_date));
|
263 |
+
$session_end_time = str_replace(array('PM', 'AM'), array('pm', 'am'), str_replace($session[0]->pageview_day . " ", "", $session[count($session)-1]->pageview_date));
|
264 |
+
$session_num_pages = ( count($session) != 1 ? count($session) . ' pages' : '1 page' ); // Fix plural on page/pages
|
265 |
+
$session_time_string = $session_start_time;
|
266 |
+
$session_source = $session[0]->pageview_source;
|
267 |
+
|
268 |
+
// Append the end time if it doesn't match the start time
|
269 |
+
if ( $session_start_time != $session_end_time )
|
270 |
+
{
|
271 |
+
$session_time_string .= " - " . $session_end_time;
|
272 |
+
}
|
273 |
+
|
274 |
+
$historyHeader = "\r\n";
|
275 |
+
|
276 |
+
// History section header open
|
277 |
+
$historyHeader .= "<table class='twelve columns' style='border-spacing: 0; border-collapse: collapse; vertical-align: top; text-align: left; width: 580px; margin: 0 auto; padding: 0;'><tr style='vertical-align: top; text-align: left; padding: 0;' align='left'><td class='section-header' style='word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; vertical-align: top; text-align: left; border-bottom-width: 1px; border-bottom-style: solid; background: #fdd8c0; border-bottom-color: #fdd8c0; padding: 15px 20px;' align='left' bgcolor='#fdd8c0' valign='top'>";
|
278 |
+
|
279 |
+
// History section header content
|
280 |
+
$historyHeader .= "<h3 style='color: #a43700; display: block; font-family: Helvetica, Arial, sans-serif; font-weight: bold; text-align: left; line-height: 1.3; word-break: normal; font-size: 16px; margin: 0; padding: 0;' align='left'>Viewed " . $session_num_pages . " - " . $session_header . " " . $session_time_string . "</h3>";
|
281 |
+
|
282 |
+
// History section header close
|
283 |
+
$historyHeader .= "</td><td class='expander' style='word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; vertical-align: top; text-align: left; visibility: hidden; width: 0px; padding:0;' align='left' valign='top'></td></tr></table>";
|
284 |
+
|
285 |
+
// Source section open
|
286 |
+
$historyHeader .= "<table class='twelve columns' style='border-spacing: 0; border-collapse: collapse; vertical-align: top; text-align: left; width: 580px; margin: 0 auto; padding: 0;'><tr style='vertical-align: top; text-align: left; padding: 0;' align='left'><td style='word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; vertical-align: top; text-align: left; border-bottom-width: 1px; border-bottom-color: #fdd8c0; border-bottom-style: solid; padding: 10px 20px;' align='left' valign='top'>";
|
287 |
+
|
288 |
+
// Source section content
|
289 |
+
// If source isn't set, set it to direct
|
290 |
+
if ( $session_source )
|
291 |
+
{
|
292 |
+
$session_source_text = "<a href='" . $session_source . "' style='color: #2ba6cb; text-decoration: none !important;'>" . $session_source . "</a>";
|
293 |
+
}
|
294 |
+
else
|
295 |
+
{
|
296 |
+
$session_source_text = "Direct";
|
297 |
+
|
298 |
+
}
|
299 |
+
|
300 |
+
$historyHeader .= "<p class='form-field' style='color: #222222; display: block; font-family: Helvetica, Arial, sans-serif; font-weight: normal; text-align: left; line-height: 19px; font-size: 14px; margin: 0; padding: 3px 0 0;' align='left'><span class='traffic-source' style='font-weight: bold; color: #a43700;'>Traffic Source: </span>" . $session_source_text . "</p>";
|
301 |
+
|
302 |
+
// Source section close
|
303 |
+
$historyHeader .= "</td><td class='expander' style='word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; vertical-align: top; text-align: left; visibility: hidden; width: 0px; border-bottom-color: #fdd8c0; border-bottom-style: solid; padding: 0; border: 0;' align='left' valign='top'></td></tr></table>";
|
304 |
+
|
305 |
+
return $historyHeader;
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
* Builds a row containing a page view for the lead email
|
310 |
+
* @param object $pageview
|
311 |
+
* @return string
|
312 |
+
*/
|
313 |
+
function build_history_row ( $pageview )
|
314 |
+
{
|
315 |
+
$historyRow = "\r\n";
|
316 |
+
|
317 |
+
$historyRow .= "<table class='twelve columns' style='border-spacing: 0; border-collapse: collapse; vertical-align: top;text-align: left; width: 580px; margin: 0 auto; padding: 0;'>";
|
318 |
+
$historyRow .= "<tr style='vertical-align: top;text-align: left;padding: 0;' align='left'>";
|
319 |
+
$historyRow .= "<td align='left' valign='top' style='border-bottom-color: #fdd8c0; word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; vertical-align: top; text-align: left; border-bottom-width: 1px; border-bottom-style: solid; padding: 10px 20px;'>";
|
320 |
+
$historyRow .= "<a href='" . $pageview->pageview_url . "'>" . ( str_replace(' )','', trim($pageview->pageview_title)) ? $pageview->pageview_title : '(blank page title tag)' ) . "</a>";
|
321 |
+
$historyRow .= "</td>";
|
322 |
+
$historyRow .= "<td class='expander' style='word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; vertical-align: top; text-align: left; visibility: hidden; width: 0px; padding:0;' align='left' valign='top'></td>";
|
323 |
+
$historyRow .= "</tr>";
|
324 |
+
$historyRow .= "</table>";
|
325 |
+
|
326 |
+
return $historyRow;
|
327 |
+
}
|
328 |
+
|
329 |
+
/**
|
330 |
+
* Builds the View All Contacts button for the lead email
|
331 |
+
* @return string
|
332 |
+
*/
|
333 |
+
function build_button_row ( $lead_id )
|
334 |
+
{
|
335 |
+
$buttonRow = "\r\n";
|
336 |
+
$contactViewUrl = get_bloginfo('wpurl') . "/wp-admin/admin.php?page=leadin_contacts&action=view&lead=" . $lead_id;
|
337 |
+
|
338 |
+
$buttonRow .= "<table class='row section' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;display: block;margin-top: 20px;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 0 0px 0 0;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;padding: 10px 20px;' align='left' valign='top'><table class='button round' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;overflow: hidden;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;display: block;width: auto !important;font-weight: bold;text-decoration: none;font-family: Helvetica, Arial, sans-serif;color: white;font-size: 16px;-webkit-border-radius: 500px;-moz-border-radius: 500px;border-radius: 500px;background: #f88e4b;padding: 10px 20px;border: 1px solid #f6601d;' align='center' bgcolor='#f88e4b' valign='top'>";
|
339 |
+
$buttonRow .="<a href='" . $contactViewUrl . "' style='color: white !important; text-decoration: none !important; font-family: Helvetica, Arial, sans-serif;'>View Contact History</a>";
|
340 |
+
$buttonRow .= "</td></tr></table></td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;padding: 0;border: 0;' align='left' valign='top'></td></tr></table></td></tr></table>";
|
341 |
+
|
342 |
+
return $buttonRow;
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* Sends the subscription confirmation email
|
347 |
+
*
|
348 |
+
* @param object history from get_lead_history()
|
349 |
+
* @return bool $email_sent Whether the email contents were sent successfully. A true return value does not automatically mean that the user received the email successfully. It just only means that the method used was able to process the request without any errors.
|
350 |
+
*/
|
351 |
+
function send_subscriber_confirmation_email ( $history )
|
352 |
+
{
|
353 |
+
// Get email from plugin settings, if none set, use admin email
|
354 |
+
$options = get_option('leadin_options');
|
355 |
+
$leadin_email = ( $options['li_email'] ? $options['li_email'] : get_bloginfo('admin_email') ); // Get email from plugin settings, if none set, use admin email
|
356 |
+
$site_name = get_bloginfo('name');
|
357 |
+
$site_url = get_bloginfo('wpurl');
|
358 |
+
|
359 |
+
// @EMAIL - Use this variable to concatenate your HTML
|
360 |
+
$body = "";
|
361 |
+
|
362 |
+
// Email Base open
|
363 |
+
$body .= "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html xmlns='http://www.w3.org/1999/xhtml' xmlns='http://www.w3.org/1999/xhtml'><head><meta http-equiv='Content-Type' content='text/html;charset=utf-8'/><meta name='viewport' content='width=device-width'/></head><body style='width: 100% !important;-webkit-text-size-adjust: 100%;-ms-text-size-adjust: 100%;color: #222222;display: block;font-family: Helvetica, Arial, sans-serif;font-weight: normal;text-align: left;line-height: 19px;font-size: 14px;margin: 0;padding: 0;'><style type='text/css'>a:hover{color: #2795b6 !important;}a:active{color: #2795b6 !important;}a:visited{color: #2ba6cb !important;}h1 a:active{color: #2ba6cb !important;}h2 a:active{color: #2ba6cb !important;}h3 a:active{color: #2ba6cb !important;}h4 a:active{color: #2ba6cb !important;}h5 a:active{color: #2ba6cb !important;}h6 a:active{color: #2ba6cb !important;}h1 a:visited{color: #2ba6cb !important;}h2 a:visited{color: #2ba6cb !important;}h3 a:visited{color: #2ba6cb !important;}h4 a:visited{color: #2ba6cb !important;}h5 a:visited{color: #2ba6cb !important;}h6 a:visited{color: #2ba6cb !important;}.button:hover table td{background: #2795b6 !important;}.tiny-button:hover table td{background: #2795b6 !important;}.small-button:hover table td{background: #2795b6 !important;}.medium-button:hover table td{background: #2795b6 !important;}.large-button:hover table td{background: #2795b6 !important;}.button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.tiny-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.tiny-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.tiny-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.small-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.small-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.small-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.medium-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.medium-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.medium-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.large-button:hover{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.large-button:active{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.large-button:visited{color: white !important;font-family: Helvetica, Arial, sans-serif;text-decoration: none;}.secondary:hover table td{background: #d0d0d0 !important;}.success:hover table td{background: #457a1a !important;}.alert:hover table td{background: #970b0e !important;}@media only screen and (max-width: 600px){table[class='body'] img{width: auto !important;height: auto !important;}table[class='body'] .container{width: 95% !important;}table[class='body'] .row{width: 100% !important;display: block !important;}table[class='body'] .wrapper{display: block !important;padding-right: 0 !important;}table[class='body'] .columns{table-layout: fixed !important;float: none !important;width: 100% !important;padding-right: 0px !important;padding-left: 0px !important;display: block !important;}table[class='body'] .column{table-layout: fixed !important;float: none !important;width: 100% !important;padding-right: 0px !important;padding-left: 0px !important;display: block !important;}table[class='body'] .wrapper.first .columns{display: table !important;}table[class='body'] .wrapper.first .column{display: table !important;}table[class='body'] table.columns td{width: 100%;}table[class='body'] table.column td{width: 100%;}table[class='body'] td.offset-by-one{padding-left: 0 !important;}table[class='body'] td.offset-by-two{padding-left: 0 !important;}table[class='body'] td.offset-by-three{padding-left: 0 !important;}table[class='body'] td.offset-by-four{padding-left: 0 !important;}table[class='body'] td.offset-by-five{padding-left: 0 !important;}table[class='body'] td.offset-by-six{padding-left: 0 !important;}table[class='body'] td.offset-by-seven{padding-left: 0 !important;}table[class='body'] td.offset-by-eight{padding-left: 0 !important;}table[class='body'] td.offset-by-nine{padding-left: 0 !important;}table[class='body'] td.offset-by-ten{padding-left: 0 !important;}table[class='body'] td.offset-by-eleven{padding-left: 0 !important;}table[class='body'] .expander{width: 9999px !important;}table[class='body'] .hide-for-small{display: none !important;}table[class='body'] .show-for-desktop{display: none !important;}table[class='body'] .show-for-small{display: inherit !important;}table[class='body'] .hide-for-desktop{display: inherit !important;}table[class='body'] .container.main{width: 100% !important;}}</style><table class='body' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;height: 100%;width: 100%;padding: 0;'><tr align='left' style='vertical-align: top; text-align: left; padding: 0;'><td class='center' align='center' valign='top' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;padding: 0 0 20px;'><center style='width: 100%;'>";
|
364 |
+
|
365 |
+
// Email Header open
|
366 |
+
$body .= "<table class='row header' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='center' align='center' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;padding: 0;' valign='top'><center style='width: 100%;'><table class='container' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: inherit;width: 580px;margin:0 auto 10px auto; padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 10px 0px 0px;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='two sub-columns' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;width: 100% !important;padding: 0px 0px 10px 0px;' align='left' valign='top'>";
|
367 |
+
|
368 |
+
$body .= "<h1 class='lead-name' style='color: #222222; display: block; font-family: Helvetica, Arial, sans-serif; font-weight: bold; text-align: left; line-height: 1.3; word-break: normal; font-size: 20px; margin: 0; padding: 0;' align='left'>" . $site_name . "</h1>";
|
369 |
+
|
370 |
+
// Email Header close
|
371 |
+
$body .= "</td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;padding: 0;' align='left' valign='top'></td></tr></table></td></tr></table></center></td></tr></table>";
|
372 |
+
|
373 |
+
$body .= "<table class='row header' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='center' align='center' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;padding: 0;' valign='top'><center style='width: 100%;'><table class='container' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: inherit;width: 580px;margin:0 auto 10px auto; padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 10px 0px 0px;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'>";
|
374 |
+
|
375 |
+
$body .= "<tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td>";
|
376 |
+
$body .= "<td style='padding: 0px 0px 10px 0px;'>Your subscription to <i><a href='" . $site_url . "'>" . $site_name . "</a></i> has been confirmed.</td>";
|
377 |
+
$body .= "</tr>";
|
378 |
+
|
379 |
+
$body .= "<tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td>";
|
380 |
+
$body .= "<td style='padding: 10px 0px 20px 0px;'>Just so you have it, here is a copy of the information you submitted to us...</td>";
|
381 |
+
$body .= "</tr>";
|
382 |
+
|
383 |
+
$body .= "</table>";
|
384 |
+
|
385 |
+
// Main container open
|
386 |
+
$body .= "<table class='container main' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: inherit;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;padding: 0;' align='left' valign='top'>";
|
387 |
+
|
388 |
+
// Form Submission section open
|
389 |
+
$body .= "<table class='row section form-submission' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;display: block;background: #deedf8;padding: 0px;' bgcolor='#deedf8'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 0 0px 0 0;' align='left' valign='top'>";
|
390 |
+
|
391 |
+
// Form Submission section header
|
392 |
+
$body .= $this->build_submission_header($history->submission, TRUE);
|
393 |
+
|
394 |
+
// Form Submission Rows
|
395 |
+
$fields = json_decode(stripslashes($history->submission->form_fields), true);
|
396 |
+
|
397 |
+
foreach ( $fields as $field )
|
398 |
+
{
|
399 |
+
$body .= $this->build_submission_row($field);
|
400 |
+
}
|
401 |
+
|
402 |
+
// Form Submission Section Close
|
403 |
+
$body .= "</td></tr></table>";
|
404 |
+
|
405 |
+
// Build [you may contact us at:] row
|
406 |
+
$body .= "<table class='row section' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;display: block;margin-top: 20px;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 0 0px 0 0;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;padding: 0px;' align='left' valign='top'><table class='button round' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;overflow: hidden;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td>";
|
407 |
+
$body .="You may also contact us at:<br/><a href='mailto:" . $leadin_email . "'>" . $leadin_email . "</a>";
|
408 |
+
$body .= "</td></tr></table></td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;padding: 0;border: 0;' align='left' valign='top'></td></tr></table></td></tr></table>";
|
409 |
+
|
410 |
+
// Build Powered by LeadIn row
|
411 |
+
$body .= "<table class='row section' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;position: relative;display: block;margin-top: 20px;padding: 0px;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td class='wrapper last' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;position: relative;padding: 0 0px 0 0;' align='left' valign='top'><table class='twelve columns' style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 580px;margin: 0 auto;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='padding: 10px 20px;' align='left' valign='top'><table style='border-spacing: 0;border-collapse: collapse;vertical-align: top;text-align: left;width: 100%;overflow: hidden;padding: 0;'><tr style='vertical-align: top;text-align: left;padding: 0;' align='left'><td style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: center;display: block;width: auto !important;font-size: 16px;padding: 10px 20px;' align='center' valign='top'>";
|
412 |
+
$body .="<div style='font-size: 11px; color: #888; padding: 0 0 5px 0;'>Powered by</div><a href='http://leadin.com/wordpress-subscribe-widget/?utm_campaign=subscribe_widget&utm_medium=email&utm_source=" . $site_url . "'><img alt='LeadIn' height='20px' width='99px' src='http://leadin.com/wp-content/themes/LeadIn-WP-Theme/library/images/logos/Leadin_logo@2x.png' alt='leadin.com'/></a>";
|
413 |
+
$body .= "</td></tr></table></td><td class='expander' style='word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;border-collapse: collapse !important;vertical-align: top;text-align: left;visibility: hidden;width: 0px;padding: 0;border: 0;' align='left' valign='top'></td></tr></table></td></tr></table>";
|
414 |
+
|
415 |
+
// @EMAIL - end form section
|
416 |
+
|
417 |
+
// Email Base close
|
418 |
+
$body .= '</center></td></tr></table></body></html>';
|
419 |
+
|
420 |
+
// Each line in an email can only be 998 characters long, so lines need to be broken with a wordwrap
|
421 |
+
$body = wordwrap($body, 900, "\r\n");
|
422 |
+
|
423 |
+
$headers = "From: LeadIn <team@leadin.com>\r\n";
|
424 |
+
$headers.= "Reply-To: LeadIn <team@leadin.com>\r\n";
|
425 |
+
$headers.= "X-Mailer: PHP/" . phpversion()."\r\n";
|
426 |
+
$headers.= "MIME-Version: 1.0\r\n";
|
427 |
+
$headers.= "Content-type: text/html; charset=utf-8\r\n";
|
428 |
+
|
429 |
+
$subject = $site_name . ': Subscription Confirmed';
|
430 |
+
|
431 |
+
$email_sent = wp_mail($history->lead->lead_email, $subject, $body, $headers);
|
432 |
+
return $email_sent;
|
433 |
+
}
|
434 |
+
}
|
435 |
+
?>
|
trunk/inc/class-leadin-options.php
ADDED
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class LeadInOptions {
|
4 |
+
|
5 |
+
/*public static function get_option_names( $type = 'compact' ) {
|
6 |
+
switch ( $type ) {
|
7 |
+
case 'non-compact' :
|
8 |
+
case 'non_compact' :
|
9 |
+
return array(
|
10 |
+
'register',
|
11 |
+
'activated',
|
12 |
+
'active_modules',
|
13 |
+
'do_activate',
|
14 |
+
'log',
|
15 |
+
'publicize',
|
16 |
+
'widget_twitter',
|
17 |
+
'wpcc_options',
|
18 |
+
);
|
19 |
+
}
|
20 |
+
|
21 |
+
return array(
|
22 |
+
'id', // (int) The Client ID/WP.com Blog ID of this site.
|
23 |
+
'blog_token', // (string) The Client Secret/Blog Token of this site.
|
24 |
+
'user_token', // (string) The User Token of this site. (deprecated)
|
25 |
+
'publicize_connections', // (array) An array of Publicize connections from WordPress.com
|
26 |
+
'master_user', // (int) The local User ID of the user who connected this site to jetpack.wordpress.com.
|
27 |
+
'user_tokens', // (array) User Tokens for each user of this site who has connected to jetpack.wordpress.com.
|
28 |
+
'version', // (string) Used during upgrade procedure to auto-activate new modules. version:time
|
29 |
+
'old_version', // (string) Used to determine which modules are the most recently added. previous_version:time
|
30 |
+
'fallback_no_verify_ssl_certs', // (int) Flag for determining if this host must skip SSL Certificate verification due to misconfigured SSL.
|
31 |
+
'time_diff', // (int) Offset between Jetpack server's clocks and this server's clocks. Jetpack Server Time = time() + (int) Jetpack_Options::get_option( 'time_diff' )
|
32 |
+
'public', // (int|bool) If we think this site is public or not (1, 0), false if we haven't yet tried to figure it out.
|
33 |
+
'videopress', // (array) VideoPress options array.
|
34 |
+
'is_network_site', // (int|bool) If we think this site is a network or a single blog (1, 0), false if we haven't yet tried to figue it out.
|
35 |
+
'social_links', // (array) The specified links for each social networking site.
|
36 |
+
'identity_crisis_whitelist', // (array) An array of options, each having an array of the values whitelisted for it.
|
37 |
+
'gplus_authors', // (array) The Google+ authorship information for connected users.
|
38 |
+
'last_heartbeat', // (int) The timestamp of the last heartbeat that fired.
|
39 |
+
);
|
40 |
+
}*/
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Returns the requested option. Looks in jetpack_options or jetpack_$name as appropriate.
|
44 |
+
*
|
45 |
+
* @param string $name Option name
|
46 |
+
* @param mixed $default (optional)
|
47 |
+
*/
|
48 |
+
public static function get_option( $name, $default = false ) {
|
49 |
+
if ( in_array( $name, self::get_option_names( 'non_compact' ) ) ) {
|
50 |
+
return get_option( "jetpack_$name" );
|
51 |
+
} else if ( !in_array( $name, self::get_option_names() ) ) {
|
52 |
+
trigger_error( sprintf( 'Invalid Jetpack option name: %s', $name ), E_USER_WARNING );
|
53 |
+
return false;
|
54 |
+
}
|
55 |
+
|
56 |
+
$options = get_option( 'jetpack_options' );
|
57 |
+
if ( is_array( $options ) && isset( $options[$name] ) ) {
|
58 |
+
return $options[$name];
|
59 |
+
}
|
60 |
+
|
61 |
+
return $default;
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Updates the single given option. Updates jetpack_options or jetpack_$name as appropriate.
|
66 |
+
*
|
67 |
+
* @param string $name Option name
|
68 |
+
* @param mixed $value Option value
|
69 |
+
*/
|
70 |
+
public static function update_option( $name, $value ) {
|
71 |
+
if ( in_array( $name, self::get_option_names( 'non_compact' ) ) ) {
|
72 |
+
return update_option( "jetpack_$name", $value );
|
73 |
+
} else if ( !in_array( $name, self::get_option_names() ) ) {
|
74 |
+
trigger_error( sprintf( 'Invalid Jetpack option name: %s', $name ), E_USER_WARNING );
|
75 |
+
return false;
|
76 |
+
}
|
77 |
+
|
78 |
+
$options = get_option( 'jetpack_options' );
|
79 |
+
if ( !is_array( $options ) ) {
|
80 |
+
$options = array();
|
81 |
+
}
|
82 |
+
|
83 |
+
$options[$name] = $value;
|
84 |
+
|
85 |
+
return update_option( 'jetpack_options', $options );
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Updates the multiple given options. Updates jetpack_options and/or jetpack_$name as appropriate.
|
90 |
+
*
|
91 |
+
* @param array $array array( option name => option value, ... )
|
92 |
+
*/
|
93 |
+
public static function update_options( $array ) {
|
94 |
+
$names = array_keys( $array );
|
95 |
+
|
96 |
+
foreach ( array_diff( $names, self::get_option_names(), self::get_option_names( 'non_compact' ) ) as $unknown_name ) {
|
97 |
+
trigger_error( sprintf( 'Invalid Jetpack option name: %s', $unknown_name ), E_USER_WARNING );
|
98 |
+
unset( $array[$unknown_name] );
|
99 |
+
}
|
100 |
+
|
101 |
+
foreach ( array_intersect( $names, self::get_option_names( 'non_compact' ) ) as $name ) {
|
102 |
+
update_option( "jetpack_$name", $array[$name] );
|
103 |
+
unset( $array[$name] );
|
104 |
+
}
|
105 |
+
|
106 |
+
$options = get_option( 'jetpack_options' );
|
107 |
+
if ( !is_array( $options ) ) {
|
108 |
+
$options = array();
|
109 |
+
}
|
110 |
+
|
111 |
+
return update_option( 'jetpack_options', array_merge( $options, $array ) );
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Deletes the given option. May be passed multiple option names as an array.
|
116 |
+
* Updates jetpack_options and/or deletes jetpack_$name as appropriate.
|
117 |
+
*
|
118 |
+
* @param string|array $names
|
119 |
+
*/
|
120 |
+
public static function delete_option( $names ) {
|
121 |
+
$names = (array) $names;
|
122 |
+
|
123 |
+
foreach ( array_diff( $names, self::get_option_names(), self::get_option_names( 'non_compact' ) ) as $unknown_name ) {
|
124 |
+
trigger_error( sprintf( 'Invalid Jetpack option name: %s', $unknown_name ), E_USER_WARNING );
|
125 |
+
}
|
126 |
+
|
127 |
+
foreach ( array_intersect( $names, self::get_option_names( 'non_compact' ) ) as $name ) {
|
128 |
+
delete_option( "jetpack_$name" );
|
129 |
+
}
|
130 |
+
|
131 |
+
$options = get_option( 'jetpack_options' );
|
132 |
+
if ( !is_array( $options ) ) {
|
133 |
+
$options = array();
|
134 |
+
}
|
135 |
+
|
136 |
+
$to_delete = array_intersect( $names, self::get_option_names(), array_keys( $options ) );
|
137 |
+
if ( $to_delete ) {
|
138 |
+
foreach ( $to_delete as $name ) {
|
139 |
+
unset( $options[$name] );
|
140 |
+
}
|
141 |
+
|
142 |
+
return update_option( 'jetpack_options', $options );
|
143 |
+
}
|
144 |
+
|
145 |
+
return true;
|
146 |
+
}
|
147 |
+
|
148 |
+
}
|
149 |
+
|
trunk/inc/leadin-ajax-functions.php
ADDED
@@ -0,0 +1,324 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( !defined('LEADIN_PLUGIN_VERSION') )
|
4 |
+
{
|
5 |
+
header( 'HTTP/1.0 403 Forbidden' );
|
6 |
+
die;
|
7 |
+
}
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Check if the cookied hashkey has been merged with another contact
|
11 |
+
*
|
12 |
+
* @echo Hashkey from a merged_hashkeys row, FALSE if hashkey does not exist in a merged_hashkeys row
|
13 |
+
*/
|
14 |
+
function leadin_check_merged_contact ()
|
15 |
+
{
|
16 |
+
global $wpdb;
|
17 |
+
|
18 |
+
$stale_hash = $_POST['li_id'];
|
19 |
+
|
20 |
+
$q = $wpdb->prepare("SELECT hashkey, merged_hashkeys FROM li_leads WHERE merged_hashkeys LIKE '%%%s%%'", like_escape($stale_hash));
|
21 |
+
$row = $wpdb->get_row($q);
|
22 |
+
|
23 |
+
if ( isset($row->hashkey) )
|
24 |
+
{
|
25 |
+
// One final update to set all the previous pageviews to the new hashkey
|
26 |
+
$q = $wpdb->prepare("UPDATE li_pageviews SET lead_hashkey = %s WHERE lead_hashkey = %s", $row->hashkey, $stale_hash);
|
27 |
+
$wpdb->query($q);
|
28 |
+
|
29 |
+
// One final update to set all the previous submissions to the new hashkey
|
30 |
+
$q = $wpdb->prepare("UPDATE li_submissions SET lead_hashkey = %s WHERE lead_hashkey = %s", $row->hashkey, $stale_hash);
|
31 |
+
$wpdb->query($q);
|
32 |
+
|
33 |
+
// Remove the passed hash from the merged hashkeys for the row
|
34 |
+
$merged_hashkeys = explode(',', $row->merged_hashkeys);
|
35 |
+
$merged_hashkeys = leadin_array_delete($merged_hashkeys, "'" . $stale_hash . "'");
|
36 |
+
|
37 |
+
$q = $wpdb->prepare("UPDATE li_leads SET merged_hashkeys = %s WHERE hashkey = %s", implode(',', $merged_hashkeys), $row->hashkey);
|
38 |
+
$wpdb->query($q);
|
39 |
+
|
40 |
+
$q = $wpdb->prepare("DELETE FROM li_leads WHERE hashkey LIKE '%%%s%%'", like_escape($stale_hash));
|
41 |
+
$wpdb->query($q);
|
42 |
+
|
43 |
+
echo json_encode($row->hashkey);
|
44 |
+
die();
|
45 |
+
}
|
46 |
+
else
|
47 |
+
{
|
48 |
+
echo json_encode(FALSE);
|
49 |
+
die();
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
add_action('wp_ajax_leadin_check_merged_contact', 'leadin_check_merged_contact'); // Call when user logged in
|
54 |
+
add_action('wp_ajax_nopriv_leadin_check_merged_contact', 'leadin_check_merged_contact'); // Call when user is not logged in
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Inserts a new page view for a lead in li_pageviews
|
58 |
+
*
|
59 |
+
* @return int
|
60 |
+
*/
|
61 |
+
function leadin_log_pageview ()
|
62 |
+
{
|
63 |
+
global $wpdb;
|
64 |
+
|
65 |
+
$hash = $_POST['li_id'];
|
66 |
+
$title = htmlentities($_POST['li_title']);
|
67 |
+
$url = $_POST['li_url'];
|
68 |
+
$source = ( isset($_POST['li_referrer']) ? $_POST['li_referrer'] : '' );
|
69 |
+
$last_visit = ( isset($_POST['li_last_visit']) ? $_POST['li_last_visit'] : 0 );
|
70 |
+
|
71 |
+
$result = $wpdb->insert(
|
72 |
+
'li_pageviews',
|
73 |
+
array(
|
74 |
+
'lead_hashkey' => $hash,
|
75 |
+
'pageview_title' => $title,
|
76 |
+
'pageview_url' => $url,
|
77 |
+
'pageview_source' => $source,
|
78 |
+
'pageview_session_start' => ( !$last_visit ? 1 : 0 )
|
79 |
+
),
|
80 |
+
array(
|
81 |
+
'%s', '%s', '%s', '%s'
|
82 |
+
)
|
83 |
+
);
|
84 |
+
|
85 |
+
return $result;
|
86 |
+
}
|
87 |
+
|
88 |
+
add_action('wp_ajax_leadin_log_pageview', 'leadin_log_pageview'); // Call when user logged in
|
89 |
+
add_action('wp_ajax_nopriv_leadin_log_pageview', 'leadin_log_pageview'); // Call when user is not logged in
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Inserts a new lead into li_leads on first visit
|
93 |
+
*
|
94 |
+
* @return int
|
95 |
+
*/
|
96 |
+
function leadin_insert_lead ()
|
97 |
+
{
|
98 |
+
global $wpdb;
|
99 |
+
|
100 |
+
$hashkey = $_POST['li_id'];
|
101 |
+
$ipaddress = $_SERVER['REMOTE_ADDR'];
|
102 |
+
$source = ( isset($_POST['li_referrer']) ? $_POST['li_referrer'] : '' );
|
103 |
+
|
104 |
+
$result = $wpdb->insert(
|
105 |
+
'li_leads',
|
106 |
+
array(
|
107 |
+
'hashkey' => $hashkey,
|
108 |
+
'lead_ip' => $ipaddress,
|
109 |
+
'lead_source' => $source
|
110 |
+
),
|
111 |
+
array(
|
112 |
+
'%s', '%s', '%s'
|
113 |
+
)
|
114 |
+
);
|
115 |
+
|
116 |
+
return $result;
|
117 |
+
}
|
118 |
+
|
119 |
+
add_action('wp_ajax_leadin_insert_lead', 'leadin_insert_lead'); // Call when user logged in
|
120 |
+
add_action('wp_ajax_nopriv_leadin_insert_lead', 'leadin_insert_lead'); // Call when user is not logged in
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Inserts a new form submisison into the li_submissions table and ties to the submission to a row in li_leads
|
124 |
+
*
|
125 |
+
* @return int
|
126 |
+
*/
|
127 |
+
function leadin_insert_form_submission ()
|
128 |
+
{
|
129 |
+
global $wpdb;
|
130 |
+
|
131 |
+
$submission_hash = $_POST['li_submission_id'];
|
132 |
+
$hashkey = $_POST['li_id'];
|
133 |
+
$page_title = htmlentities($_POST['li_title']);
|
134 |
+
$page_url = $_POST['li_url'];
|
135 |
+
$form_json = $_POST['li_fields'];
|
136 |
+
$email = $_POST['li_email'];
|
137 |
+
$submission_type = $_POST['li_submission_type'];
|
138 |
+
$options = get_option('leadin_options');
|
139 |
+
$li_admin_email = ( $options['li_email'] ) ? $options['li_email'] : get_bloginfo('admin_email');
|
140 |
+
|
141 |
+
// Check to see if the form_hashkey exists, and if it does, don't run the insert or send the email
|
142 |
+
$q = $wpdb->prepare("SELECT form_hashkey FROM li_submissions WHERE form_hashkey = %s", $submission_hash);
|
143 |
+
$submission_hash_exists = $wpdb->get_var($q);
|
144 |
+
|
145 |
+
if ( $submission_hash_exists )
|
146 |
+
{
|
147 |
+
return 1;
|
148 |
+
exit;
|
149 |
+
}
|
150 |
+
|
151 |
+
// Don't send the lead email when an administrator is leaving a comment or when the commenter's email is the same as the leadin email
|
152 |
+
if ( !(current_user_can('administrator') && $submission_type == 'comment') && !(strstr($li_admin_email, $email) && $submission_type == 'comment') )
|
153 |
+
{
|
154 |
+
$q = $wpdb->prepare("SELECT * FROM li_leads WHERE hashkey = %s", $hashkey);
|
155 |
+
$contact = $wpdb->get_row($q);
|
156 |
+
|
157 |
+
// Check for existing contacts based on whether the email is present in the contacts table
|
158 |
+
$q = $wpdb->prepare("SELECT lead_email, hashkey, merged_hashkeys, lead_status FROM li_leads WHERE lead_email = %s AND hashkey != %s", $email, $hashkey);
|
159 |
+
$existing_contacts = $wpdb->get_results($q);
|
160 |
+
|
161 |
+
$existing_contact_status = 'lead';
|
162 |
+
|
163 |
+
// Setup the string for the existing hashkeys
|
164 |
+
$existing_contact_hashkeys = $contact->merged_hashkeys;
|
165 |
+
if ( $contact->merged_hashkeys )
|
166 |
+
$existing_contact_hashkeys .= ',';
|
167 |
+
|
168 |
+
// Do some merging if the email exists already in the contact table
|
169 |
+
if ( count($existing_contacts) )
|
170 |
+
{
|
171 |
+
for ( $i = 0; $i < count($existing_contacts); $i++ )
|
172 |
+
{
|
173 |
+
// Start with the existing contact's hashkeys and create a string containg comma-deliminated hashes
|
174 |
+
$existing_contact_hashkeys .= "'" . $existing_contacts[$i]->hashkey . "'";
|
175 |
+
|
176 |
+
if ( $existing_contacts[$i]->merged_hashkeys )
|
177 |
+
$existing_contact_hashkeys .= "," . $existing_contacts[$i]->merged_hashkeys;
|
178 |
+
|
179 |
+
if ( $i != count($existing_contacts)-1 )
|
180 |
+
$existing_contact_hashkeys .= ",";
|
181 |
+
|
182 |
+
// Check on each existing lead if the lead_status is comment. If it is, save the status to override the new lead's status
|
183 |
+
if ( $existing_contacts[$i]->lead_status == 'comment' && $existing_contact_status == 'lead' )
|
184 |
+
$existing_contact_status = 'comment';
|
185 |
+
|
186 |
+
// Check on each existing lead if the lead_status is subscribe. If it is, save the status to override the new lead's status
|
187 |
+
if ( $existing_contacts[$i]->lead_status == 'subscribe' && ($existing_contact_status == 'lead' || $existing_contact_status == 'comment') )
|
188 |
+
$existing_contact_status = 'subscribe';
|
189 |
+
}
|
190 |
+
|
191 |
+
// Update all the previous pageviews to the new hashkey
|
192 |
+
$q = $wpdb->prepare("UPDATE li_pageviews SET lead_hashkey = %s WHERE lead_hashkey IN ( $existing_contact_hashkeys )", $hashkey);
|
193 |
+
$wpdb->query($q);
|
194 |
+
|
195 |
+
// Update all the previous submissions to the new hashkey
|
196 |
+
$q = $wpdb->prepare("UPDATE li_submissions SET lead_hashkey = %s WHERE lead_hashkey IN ( $existing_contact_hashkeys )", $hashkey);
|
197 |
+
$wpdb->query($q);
|
198 |
+
}
|
199 |
+
|
200 |
+
// Prevent duplicates by deleting existing submission if it didn't finish the process before the web page refreshed
|
201 |
+
$q = $wpdb->prepare("DELETE FROM li_submissions WHERE form_hashkey = %s", $submission_hash);
|
202 |
+
$wpdb->query($q);
|
203 |
+
|
204 |
+
// Insert the form fields and hash into the submissions table
|
205 |
+
$result = $wpdb->insert(
|
206 |
+
'li_submissions',
|
207 |
+
array(
|
208 |
+
'form_hashkey' => $submission_hash,
|
209 |
+
'lead_hashkey' => $hashkey,
|
210 |
+
'form_page_title' => $page_title,
|
211 |
+
'form_page_url' => $page_url,
|
212 |
+
'form_fields' => $form_json,
|
213 |
+
'form_type' => $submission_type
|
214 |
+
),
|
215 |
+
array(
|
216 |
+
'%s', '%s', '%s', '%s', '%s', '%s'
|
217 |
+
)
|
218 |
+
);
|
219 |
+
|
220 |
+
$contact_status = $submission_type;
|
221 |
+
|
222 |
+
// Override the status because comment is further down the funnel than lead
|
223 |
+
if ( $contact->lead_status == 'comment' && $submission_type == 'lead' )
|
224 |
+
$contact_status = 'comment';
|
225 |
+
// Override the status because subscribe is further down the funnel than lead and comment
|
226 |
+
else if ( $contact->lead_status == 'subscribe' && ($submission_type == 'lead' || $submission_type == 'comment') )
|
227 |
+
$contact_status = 'subscribe';
|
228 |
+
|
229 |
+
// Override the status with the merged contacts status if the children have a status further down the funnel
|
230 |
+
if ( $existing_contact_status == 'comment' && $submission_type == 'lead' )
|
231 |
+
$contact_status = 'comment';
|
232 |
+
else if ( $existing_contact_status == 'subscribe' && ($submission_type == 'lead' || $submission_type == 'comment') )
|
233 |
+
$contact_status = 'subscribe';
|
234 |
+
|
235 |
+
// Update the contact with the new email, status and merged hashkeys
|
236 |
+
$q = $wpdb->prepare("UPDATE li_leads SET lead_email = %s, lead_status = %s, merged_hashkeys = %s WHERE hashkey = %s", $email, $contact_status, $existing_contact_hashkeys, $hashkey);
|
237 |
+
$rows_updated = $wpdb->query($q);
|
238 |
+
|
239 |
+
// Hit ESP APIs if power-up activated
|
240 |
+
if ( $contact_status == 'subscribe' )
|
241 |
+
{
|
242 |
+
$active_power_ups = array_unique(unserialize(get_option('leadin_active_power_ups')));
|
243 |
+
|
244 |
+
if ( in_array('mailchimp_list_sync', $active_power_ups) )
|
245 |
+
{
|
246 |
+
global $leadin_mailchimp_list_sync_wp;
|
247 |
+
$leadin_mailchimp_list_sync_wp->push_mailchimp_subscriber_to_list($email);
|
248 |
+
}
|
249 |
+
}
|
250 |
+
|
251 |
+
// Send the contact email
|
252 |
+
$li_emailer = new LI_Emailer();
|
253 |
+
$li_emailer->send_new_lead_email($hashkey);
|
254 |
+
|
255 |
+
return $rows_updated;
|
256 |
+
}
|
257 |
+
}
|
258 |
+
|
259 |
+
add_action('wp_ajax_leadin_insert_form_submission', 'leadin_insert_form_submission'); // Call when user logged in
|
260 |
+
add_action('wp_ajax_nopriv_leadin_insert_form_submission', 'leadin_insert_form_submission'); // Call when user is not logged in
|
261 |
+
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Checks the lead status of the current visitor
|
265 |
+
*
|
266 |
+
*/
|
267 |
+
function leadin_check_visitor_status ()
|
268 |
+
{
|
269 |
+
global $wpdb;
|
270 |
+
|
271 |
+
$hash = $_POST['li_id'];
|
272 |
+
|
273 |
+
$q = $wpdb->prepare("SELECT lead_status FROM li_leads WHERE hashkey = %s", $hash);
|
274 |
+
$lead_status = $wpdb->get_var($q);
|
275 |
+
|
276 |
+
if ( isset($lead_status) )
|
277 |
+
{
|
278 |
+
echo json_encode($lead_status);
|
279 |
+
die();
|
280 |
+
}
|
281 |
+
else
|
282 |
+
{
|
283 |
+
echo json_encode(FALSE);
|
284 |
+
die();
|
285 |
+
}
|
286 |
+
}
|
287 |
+
|
288 |
+
add_action('wp_ajax_leadin_check_visitor_status', 'leadin_check_visitor_status'); // Call when user logged in
|
289 |
+
add_action('wp_ajax_nopriv_leadin_check_visitor_status', 'leadin_check_visitor_status'); // Call when user is not logged in
|
290 |
+
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Grabs the heading for the subscribe widget from the options
|
294 |
+
*
|
295 |
+
*/
|
296 |
+
function leadin_subscribe_show ()
|
297 |
+
{
|
298 |
+
leadin_track_plugin_activity('widget shown');
|
299 |
+
die();
|
300 |
+
|
301 |
+
/*global $wpdb;
|
302 |
+
|
303 |
+
$hash = $_POST['li_id'];
|
304 |
+
|
305 |
+
$q = $wpdb->prepare("SELECT lead_status FROM li_leads WHERE hashkey = %s", $hash);
|
306 |
+
$lead_status = $wpdb->get_var($q);
|
307 |
+
|
308 |
+
if ( isset($lead_status) )
|
309 |
+
{
|
310 |
+
echo json_encode($lead_status);
|
311 |
+
die();
|
312 |
+
}
|
313 |
+
else
|
314 |
+
{
|
315 |
+
echo json_encode(FALSE);
|
316 |
+
die();
|
317 |
+
}*/
|
318 |
+
|
319 |
+
|
320 |
+
}
|
321 |
+
|
322 |
+
add_action('wp_ajax_leadin_subscribe_show', 'leadin_subscribe_show'); // Call when user logged in
|
323 |
+
add_action('wp_ajax_nopriv_leadin_subscribe_show', 'leadin_subscribe_show'); // Call when user is not logged in
|
324 |
+
?>
|
trunk/inc/leadin-functions.php
ADDED
@@ -0,0 +1,250 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( !defined('LEADIN_PLUGIN_VERSION') )
|
4 |
+
{
|
5 |
+
header('HTTP/1.0 403 Forbidden');
|
6 |
+
die;
|
7 |
+
}
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Looks for a GET/POST value and echos if present. If nothing is set, echos blank
|
11 |
+
*
|
12 |
+
* @param string
|
13 |
+
* @return null
|
14 |
+
*/
|
15 |
+
function print_submission_val ( $url_param )
|
16 |
+
{
|
17 |
+
if ( isset($_GET[$url_param]) )
|
18 |
+
{
|
19 |
+
return $_GET[$url_param];
|
20 |
+
}
|
21 |
+
|
22 |
+
if ( isset($_POST[$url_param]) )
|
23 |
+
{
|
24 |
+
return $_POST[$url_param];
|
25 |
+
}
|
26 |
+
|
27 |
+
return '';
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Updates an option in the multi-dimensional option array
|
32 |
+
*
|
33 |
+
* @param string $option option_name in wp_options
|
34 |
+
* @param string $option_key key for array
|
35 |
+
* @param string $option new value for array
|
36 |
+
*
|
37 |
+
* @return bool True if option value has changed, false if not or if update failed.
|
38 |
+
*/
|
39 |
+
function leadin_update_option ( $option, $option_key, $new_value )
|
40 |
+
{
|
41 |
+
$options_array = get_option($option);
|
42 |
+
|
43 |
+
if ( isset($options_array[$option_key]) )
|
44 |
+
{
|
45 |
+
if ( $options_array[$option_key] == $new_value )
|
46 |
+
return false; // Don't update an option if it already is set to the value
|
47 |
+
}
|
48 |
+
|
49 |
+
if ( !is_array( $options_array ) ) {
|
50 |
+
$options_array = array();
|
51 |
+
}
|
52 |
+
|
53 |
+
$options_array[$option_key] = $new_value;
|
54 |
+
|
55 |
+
return update_option($option, $options_array);
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Prints a number with a singular or plural label depending on number
|
60 |
+
*
|
61 |
+
* @param int
|
62 |
+
* @param string
|
63 |
+
* @param string
|
64 |
+
* @return string
|
65 |
+
*/
|
66 |
+
function leadin_single_plural_label ( $number, $singular_label, $plural_label )
|
67 |
+
{
|
68 |
+
//Set number = 0 when the variable is blank
|
69 |
+
$number = ( !is_numeric($number) ? 0 : $number );
|
70 |
+
|
71 |
+
return ( $number != 1 ? $number . " $plural_label" : $number . " $singular_label" );
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Get LeadIn user
|
76 |
+
*
|
77 |
+
* @return array
|
78 |
+
*/
|
79 |
+
function leadin_get_current_user ()
|
80 |
+
{
|
81 |
+
global $wp_version;
|
82 |
+
global $current_user;
|
83 |
+
|
84 |
+
get_currentuserinfo();
|
85 |
+
$li_user_id = md5(get_bloginfo('wpurl'));
|
86 |
+
|
87 |
+
$li_options = get_option('leadin_options');
|
88 |
+
|
89 |
+
if ( isset($li_options['li_email']) ) {
|
90 |
+
$li_user_email = $li_options['li_email'];
|
91 |
+
}
|
92 |
+
else {
|
93 |
+
$li_user_email = $current_user->user_email;
|
94 |
+
}
|
95 |
+
|
96 |
+
$leadin_user = array(
|
97 |
+
'user_id' => $li_user_id,
|
98 |
+
'email' => $li_user_email,
|
99 |
+
'alias' => $current_user->display_name,
|
100 |
+
'wp_url' => get_bloginfo('wpurl'),
|
101 |
+
'li_version' => LEADIN_PLUGIN_VERSION,
|
102 |
+
'wp_version' => $wp_version
|
103 |
+
);
|
104 |
+
|
105 |
+
return $leadin_user;
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Register LeadIn user
|
110 |
+
*
|
111 |
+
* @return bool
|
112 |
+
*/
|
113 |
+
function leadin_register_user ()
|
114 |
+
{
|
115 |
+
$leadin_user = leadin_get_current_user();
|
116 |
+
$mp = Mixpanel::getInstance(MIXPANEL_PROJECT_TOKEN);
|
117 |
+
|
118 |
+
// @push mixpanel event for updated email
|
119 |
+
$mp->identify($leadin_user['user_id']);
|
120 |
+
$mp->createAlias( $leadin_user['user_id'], $leadin_user['alias']);
|
121 |
+
$mp->people->set( $leadin_user['user_id'], array(
|
122 |
+
'$email' => $leadin_user['email'],
|
123 |
+
'$wp-url' => $leadin_user['wp_url'],
|
124 |
+
'$wp-version' => $leadin_user['wp_version'],
|
125 |
+
'$li-version' => $leadin_user['li_version']
|
126 |
+
));
|
127 |
+
|
128 |
+
// @push contact to HubSpot
|
129 |
+
|
130 |
+
$hs_context = array(
|
131 |
+
'pageName' => 'Plugin Settings'
|
132 |
+
);
|
133 |
+
|
134 |
+
$hs_context_json = json_encode($hs_context);
|
135 |
+
|
136 |
+
//Need to populate these varilables with values from the form.
|
137 |
+
$str_post = "email=" . urlencode($leadin_user['email'])
|
138 |
+
. "&li_version=" . urlencode($leadin_user['li_version'])
|
139 |
+
. "&leadin_stage=Activated"
|
140 |
+
. "&li_user_id=" . urlencode($leadin_user['user_id'])
|
141 |
+
. "&website=" . urlencode($leadin_user['wp_url'])
|
142 |
+
. "&wp_version=" . urlencode($leadin_user['wp_version'])
|
143 |
+
. "&hs_context=" . urlencode($hs_context_json);
|
144 |
+
|
145 |
+
$endpoint = 'https://forms.hubspot.com/uploads/form/v2/324680/d93719d5-e892-4137-98b0-913efffae204';
|
146 |
+
|
147 |
+
$ch = @curl_init();
|
148 |
+
@curl_setopt($ch, CURLOPT_POST, true);
|
149 |
+
@curl_setopt($ch, CURLOPT_POSTFIELDS, $str_post);
|
150 |
+
@curl_setopt($ch, CURLOPT_URL, $endpoint);
|
151 |
+
@curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
|
152 |
+
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
153 |
+
$response = @curl_exec($ch); //Log the response from HubSpot as needed.
|
154 |
+
@curl_close($ch);
|
155 |
+
echo $response;
|
156 |
+
|
157 |
+
return true;
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Send Mixpanel event when plugin is activated/deactivated
|
162 |
+
*
|
163 |
+
* @param bool
|
164 |
+
*
|
165 |
+
* @return bool
|
166 |
+
*/
|
167 |
+
function leadin_track_plugin_registration_hook ( $activated )
|
168 |
+
{
|
169 |
+
if ($activated) {
|
170 |
+
leadin_register_user();
|
171 |
+
leadin_track_plugin_activity("Activated Plugin");
|
172 |
+
}
|
173 |
+
else {
|
174 |
+
leadin_track_plugin_activity("Deactivated Plugin");
|
175 |
+
}
|
176 |
+
|
177 |
+
return true;
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Track plugin activity in MixPanel
|
182 |
+
*
|
183 |
+
* @param string
|
184 |
+
*
|
185 |
+
* @return array
|
186 |
+
*/
|
187 |
+
function leadin_track_plugin_activity ( $activity_desc )
|
188 |
+
{
|
189 |
+
$leadin_user = leadin_get_current_user();
|
190 |
+
|
191 |
+
global $wp_version;
|
192 |
+
global $current_user;
|
193 |
+
get_currentuserinfo();
|
194 |
+
$user_id = md5(get_bloginfo('wpurl'));
|
195 |
+
|
196 |
+
$mp = Mixpanel::getInstance(MIXPANEL_PROJECT_TOKEN);
|
197 |
+
$mp->track($activity_desc, array("distinct_id" => $user_id, '$wp-url' => get_bloginfo('wpurl'), '$wp-version' => $wp_version, '$li-version' => LEADIN_PLUGIN_VERSION));
|
198 |
+
|
199 |
+
return true;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Logs a debug statement to /wp-content/debug.log
|
204 |
+
*
|
205 |
+
* @param string
|
206 |
+
*/
|
207 |
+
function leadin_log_debug ( $message )
|
208 |
+
{
|
209 |
+
if ( WP_DEBUG === TRUE )
|
210 |
+
{
|
211 |
+
if ( is_array($message) || is_object($message) )
|
212 |
+
error_log(print_r($message, TRUE));
|
213 |
+
else
|
214 |
+
error_log($message);
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Deletes an element or elements from an array
|
220 |
+
*
|
221 |
+
* @param array
|
222 |
+
* @param wildcard
|
223 |
+
* @return array
|
224 |
+
*/
|
225 |
+
function leadin_array_delete ( $array, $element )
|
226 |
+
{
|
227 |
+
if ( !is_array($element) )
|
228 |
+
$element = array($element);
|
229 |
+
|
230 |
+
return array_diff($array, $element);
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Deletes an element or elements from an array
|
235 |
+
*
|
236 |
+
* @param array
|
237 |
+
* @param wildcard
|
238 |
+
* @return array
|
239 |
+
*/
|
240 |
+
function leadin_get_value_by_key ( $key_value, $array )
|
241 |
+
{
|
242 |
+
foreach ( $array as $key => $value )
|
243 |
+
{
|
244 |
+
if ( is_array($value) && $value['label'] == $key_value )
|
245 |
+
return $value['value'];
|
246 |
+
}
|
247 |
+
|
248 |
+
return null;
|
249 |
+
}
|
250 |
+
?>
|
trunk/leadin.php
ADDED
@@ -0,0 +1,488 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
Plugin Name: LeadIn
|
4 |
+
Plugin URI: http://leadin.com
|
5 |
+
Description: LeadIn is an easy-to-use marketing automation and lead tracking plugin for WordPress that helps you better understand your web site visitors.
|
6 |
+
Version: 0.7.1
|
7 |
+
Author: Andy Cook, Nelson Joyce
|
8 |
+
Author URI: http://leadin.com
|
9 |
+
License: GPL2
|
10 |
+
*/
|
11 |
+
|
12 |
+
//=============================================
|
13 |
+
// Define Constants
|
14 |
+
//=============================================
|
15 |
+
|
16 |
+
if ( !defined('LEADIN_PATH') )
|
17 |
+
define('LEADIN_PATH', untrailingslashit(plugins_url('', __FILE__ )));
|
18 |
+
|
19 |
+
if ( !defined('LEADIN_PLUGIN_DIR') )
|
20 |
+
define('LEADIN_PLUGIN_DIR', untrailingslashit(dirname( __FILE__ )));
|
21 |
+
|
22 |
+
if ( !defined('LEADIN_PLUGIN_SLUG') )
|
23 |
+
define('LEADIN_PLUGIN_SLUG', basename(dirname(__FILE__)));
|
24 |
+
|
25 |
+
if ( !defined('LEADIN_DB_VERSION') )
|
26 |
+
define('LEADIN_DB_VERSION', '0.6.2');
|
27 |
+
|
28 |
+
if ( !defined('LEADIN_PLUGIN_VERSION') )
|
29 |
+
define('LEADIN_PLUGIN_VERSION', '0.7.1');
|
30 |
+
|
31 |
+
if ( !defined('MIXPANEL_PROJECT_TOKEN') )
|
32 |
+
define('MIXPANEL_PROJECT_TOKEN', 'a9615503ec58a6bce2c646a58390eac1');
|
33 |
+
|
34 |
+
|
35 |
+
//=============================================
|
36 |
+
// Include Needed Files
|
37 |
+
//=============================================
|
38 |
+
|
39 |
+
require_once(LEADIN_PLUGIN_DIR . '/admin/leadin-admin.php');
|
40 |
+
require_once(LEADIN_PLUGIN_DIR . '/inc/class-emailer.php');
|
41 |
+
require_once(LEADIN_PLUGIN_DIR . '/inc/leadin-ajax-functions.php');
|
42 |
+
require_once(LEADIN_PLUGIN_DIR . '/inc/leadin-functions.php');
|
43 |
+
require_once(LEADIN_PLUGIN_DIR . '/power-ups/subscribe-widget.php');
|
44 |
+
require_once(LEADIN_PLUGIN_DIR . '/power-ups/contacts.php');
|
45 |
+
require_once(LEADIN_PLUGIN_DIR . '/power-ups/mailchimp-list-sync.php');
|
46 |
+
require_once(LEADIN_PLUGIN_DIR . '/lib/mixpanel/Mixpanel.php');
|
47 |
+
|
48 |
+
//=============================================
|
49 |
+
// WPLeadIn Class
|
50 |
+
//=============================================
|
51 |
+
class WPLeadIn {
|
52 |
+
|
53 |
+
var $power_ups;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Class constructor
|
57 |
+
*/
|
58 |
+
function __construct ()
|
59 |
+
{
|
60 |
+
//=============================================
|
61 |
+
// Hooks & Filters
|
62 |
+
//=============================================
|
63 |
+
|
64 |
+
// Activate + install LeadIn
|
65 |
+
register_activation_hook( __FILE__, array(&$this, 'add_leadin_defaults'));
|
66 |
+
|
67 |
+
// Deactivate LeadIn
|
68 |
+
register_deactivation_hook( __FILE__, array(&$this, 'deactivate_leadin'));
|
69 |
+
|
70 |
+
$this->power_ups = $this->get_available_power_ups();
|
71 |
+
|
72 |
+
add_action('plugins_loaded', array($this, 'leadin_update_check'));
|
73 |
+
add_filter('init', array($this, 'add_leadin_frontend_scripts'));
|
74 |
+
|
75 |
+
add_filter('plugin_action_links_' . plugin_basename(__FILE__), array(&$li_wp_admin, 'leadin_plugin_settings_link'));
|
76 |
+
add_action( 'admin_bar_menu', array($this, 'add_leadin_link_to_admin_bar'), 999 );
|
77 |
+
|
78 |
+
$li_wp_admin = new WPLeadInAdmin($this->power_ups);
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Activate the plugin
|
83 |
+
*/
|
84 |
+
function add_leadin_defaults ()
|
85 |
+
{
|
86 |
+
$li_options = get_option('leadin_options');
|
87 |
+
|
88 |
+
if ( ($li_options['li_installed'] != 1) || (!is_array($li_options)) )
|
89 |
+
{
|
90 |
+
$opt = array(
|
91 |
+
'li_installed' => 1,
|
92 |
+
'li_db_version' => LEADIN_DB_VERSION,
|
93 |
+
'li_email' => get_bloginfo('admin_email'),
|
94 |
+
'onboarding_complete' => 0,
|
95 |
+
'ignore_settings_popup' => 0
|
96 |
+
);
|
97 |
+
|
98 |
+
update_option('leadin_options', $opt);
|
99 |
+
$this->leadin_db_install();
|
100 |
+
}
|
101 |
+
|
102 |
+
$leadin_active_power_ups = get_option('leadin_active_power_ups');
|
103 |
+
|
104 |
+
if ( !$leadin_active_power_ups )
|
105 |
+
{
|
106 |
+
$auto_activate = array(
|
107 |
+
'contacts'
|
108 |
+
);
|
109 |
+
|
110 |
+
update_option('leadin_active_power_ups', serialize($auto_activate));
|
111 |
+
}
|
112 |
+
|
113 |
+
// 0.4.0 upgrade - Delete legacy db option version 0.4.0 (remove after beta testers upgrade)
|
114 |
+
if ( get_option('leadin_db_version') )
|
115 |
+
delete_option('leadin_db_version');
|
116 |
+
|
117 |
+
// 0.4.0 upgrade - Delete legacy options version 0.4.0 (remove after beta testers upgrade)
|
118 |
+
if ( $li_legacy_options = get_option('leadin_plugin_options') )
|
119 |
+
{
|
120 |
+
leadin_update_option('leadin_options', 'li_email', $li_legacy_options['li_email']);
|
121 |
+
delete_option('leadin_plugin_options');
|
122 |
+
}
|
123 |
+
|
124 |
+
leadin_track_plugin_registration_hook(TRUE);
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Deactivate LeadIn plugin hook
|
129 |
+
*/
|
130 |
+
function deactivate_leadin ()
|
131 |
+
{
|
132 |
+
leadin_track_plugin_registration_hook(FALSE);
|
133 |
+
}
|
134 |
+
|
135 |
+
//=============================================
|
136 |
+
// Database update
|
137 |
+
//=============================================
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Creates or updates the LeadIn tables
|
141 |
+
*/
|
142 |
+
function leadin_db_install ()
|
143 |
+
{
|
144 |
+
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
145 |
+
|
146 |
+
$sql = "
|
147 |
+
CREATE TABLE `li_leads` (
|
148 |
+
`lead_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
149 |
+
`lead_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
150 |
+
`hashkey` varchar(16) DEFAULT NULL,
|
151 |
+
`lead_ip` varchar(40) DEFAULT NULL,
|
152 |
+
`lead_source` text,
|
153 |
+
`lead_email` varchar(255) DEFAULT NULL,
|
154 |
+
`lead_status` set('lead','comment','subscribe') NOT NULL DEFAULT 'lead',
|
155 |
+
`merged_hashkeys` text,
|
156 |
+
PRIMARY KEY (`lead_id`),
|
157 |
+
KEY `hashkey` (`hashkey`)
|
158 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
|
159 |
+
|
160 |
+
CREATE TABLE `li_pageviews` (
|
161 |
+
`pageview_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
162 |
+
`pageview_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
163 |
+
`lead_hashkey` varchar(16) NOT NULL,
|
164 |
+
`pageview_title` varchar(255) NOT NULL,
|
165 |
+
`pageview_url` text NOT NULL,
|
166 |
+
`pageview_source` text NOT NULL,
|
167 |
+
`pageview_session_start` int(1) NOT NULL,
|
168 |
+
PRIMARY KEY (`pageview_id`),
|
169 |
+
KEY `lead_hashkey` (`lead_hashkey`)
|
170 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=692 ;
|
171 |
+
|
172 |
+
CREATE TABLE `li_submissions` (
|
173 |
+
`form_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
174 |
+
`form_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
175 |
+
`lead_hashkey` varchar(16) NOT NULL,
|
176 |
+
`form_page_title` varchar(255) NOT NULL,
|
177 |
+
`form_page_url` text NOT NULL,
|
178 |
+
`form_fields` text NOT NULL,
|
179 |
+
`form_type` set('lead','comment','subscribe') NOT NULL DEFAULT 'lead',
|
180 |
+
`form_hashkey` varchar(16) NOT NULL,
|
181 |
+
PRIMARY KEY (`form_id`),
|
182 |
+
KEY `lead_hashkey` (`lead_hashkey`)
|
183 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=85 ;";
|
184 |
+
|
185 |
+
dbDelta($sql);
|
186 |
+
|
187 |
+
leadin_update_option('leadin_options', 'li_db_version', LEADIN_DB_VERSION);
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Checks the stored database version against the current data version + updates if needed
|
192 |
+
*/
|
193 |
+
function leadin_update_check ()
|
194 |
+
{
|
195 |
+
global $wpdb;
|
196 |
+
$li_options = get_option('leadin_options');
|
197 |
+
|
198 |
+
// 0.4.0 upgrade - Delete legacy db option version 0.4.0 (remove after beta is launched)
|
199 |
+
if ( get_option('leadin_db_version') )
|
200 |
+
delete_option('leadin_db_version');
|
201 |
+
|
202 |
+
// 0.4.0 upgrade - Delete legacy options version 0.4.0 (remove after beta is launched)
|
203 |
+
if ( $li_legacy_options = get_option('leadin_plugin_options') )
|
204 |
+
{
|
205 |
+
leadin_update_option('leadin_options', 'li_email', $li_legacy_options['li_email']);
|
206 |
+
delete_option('leadin_plugin_options');
|
207 |
+
}
|
208 |
+
|
209 |
+
// 0.5.1 upgrade - Create active power-ups option if it doesn't exist
|
210 |
+
$leadin_active_power_ups = get_option('leadin_active_power_ups');
|
211 |
+
|
212 |
+
if ( !$leadin_active_power_ups )
|
213 |
+
{
|
214 |
+
$auto_activate = array(
|
215 |
+
'contacts'
|
216 |
+
);
|
217 |
+
|
218 |
+
update_option('leadin_active_power_ups', serialize($auto_activate));
|
219 |
+
}
|
220 |
+
|
221 |
+
// Set the database version if it doesn't exist
|
222 |
+
if ( isset($li_options['li_db_version']) )
|
223 |
+
{
|
224 |
+
if ( $li_options['li_db_version'] != LEADIN_DB_VERSION ) {
|
225 |
+
$this->leadin_db_install();
|
226 |
+
|
227 |
+
// 0.4.2 upgrade - After the DB installation converts the set structure from contact to lead, update all the blank contacts = leads
|
228 |
+
$q = $wpdb->prepare("UPDATE li_leads SET lead_status = 'lead' WHERE lead_status = 'contact' OR lead_status = ''", "");
|
229 |
+
$wpdb->query($q);
|
230 |
+
|
231 |
+
// 0.4.2 upgrade - After the DB installation converts the set structure from contact to lead, update all the blank form_type = leads
|
232 |
+
$q = $wpdb->prepare("UPDATE li_submissions SET form_type = 'lead' WHERE form_type = 'contact' OR form_type = ''", "");
|
233 |
+
$wpdb->query($q);
|
234 |
+
}
|
235 |
+
}
|
236 |
+
else
|
237 |
+
{
|
238 |
+
$this->leadin_db_install();
|
239 |
+
}
|
240 |
+
}
|
241 |
+
|
242 |
+
//=============================================
|
243 |
+
// Scripts & Styles
|
244 |
+
//=============================================
|
245 |
+
|
246 |
+
/**
|
247 |
+
* Adds front end javascript + initializes ajax object
|
248 |
+
*/
|
249 |
+
function add_leadin_frontend_scripts ()
|
250 |
+
{
|
251 |
+
if ( !is_admin() )
|
252 |
+
{
|
253 |
+
wp_register_script('leadin', LEADIN_PATH . '/frontend/js/leadin.js', array ('jquery'), false, true);
|
254 |
+
wp_register_script('jquery.cookie', LEADIN_PATH . '/frontend/js/jquery.cookie.js', array ('jquery'), false, true);
|
255 |
+
|
256 |
+
wp_enqueue_script('leadin');
|
257 |
+
wp_enqueue_script('jquery.cookie');
|
258 |
+
|
259 |
+
wp_localize_script('leadin', 'li_ajax', array('ajax_url' => admin_url('admin-ajax.php')));
|
260 |
+
}
|
261 |
+
}
|
262 |
+
|
263 |
+
function add_leadin_link_to_admin_bar( $wp_admin_bar ) {
|
264 |
+
$args = array(
|
265 |
+
'id' => 'leadin-admin-menu', // id of the existing child node (New > Post)
|
266 |
+
'title' => '<span class="ab-icon"><img src="/wp-content/plugins/leadin/images/leadin-svg-icon.svg" style="height:16px; width:16px;"></span><span class="ab-label">LeadIn</span>', // alter the title of existing node
|
267 |
+
'parent' => false, // set parent to false to make it a top level (parent) node
|
268 |
+
'href' => get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_contacts',
|
269 |
+
'meta' => array('title' => 'LeadIn')
|
270 |
+
);
|
271 |
+
|
272 |
+
$wp_admin_bar->add_node( $args );
|
273 |
+
}
|
274 |
+
|
275 |
+
/**
|
276 |
+
* List available power-ups
|
277 |
+
*/
|
278 |
+
public static function get_available_power_ups( $min_version = false, $max_version = false ) {
|
279 |
+
static $power_ups = null;
|
280 |
+
|
281 |
+
if ( ! isset( $power_ups ) ) {
|
282 |
+
$files = WPLeadIn::glob_php( LEADIN_PLUGIN_DIR . '/power-ups' );
|
283 |
+
|
284 |
+
$power_ups = array();
|
285 |
+
|
286 |
+
foreach ( $files as $file ) {
|
287 |
+
|
288 |
+
if ( ! $headers = WPLeadIn::get_power_up($file) ) {
|
289 |
+
continue;
|
290 |
+
}
|
291 |
+
|
292 |
+
$power_up = new $headers['class']($headers['activated']);
|
293 |
+
$power_up->power_up_name = $headers['name'];
|
294 |
+
$power_up->menu_text = $headers['menu_text'];
|
295 |
+
$power_up->menu_link = $headers['menu_link'];
|
296 |
+
$power_up->slug = $headers['slug'];
|
297 |
+
$power_up->link_uri = $headers['uri'];
|
298 |
+
$power_up->description = $headers['description'];
|
299 |
+
$power_up->icon = $headers['icon'];
|
300 |
+
$power_up->icon_small = $headers['icon_small'];
|
301 |
+
$power_up->permanent = $headers['permanent'];
|
302 |
+
$power_up->auto_activate = $headers['auto_activate'];
|
303 |
+
$power_up->activated = $headers['activated'];
|
304 |
+
|
305 |
+
array_push($power_ups, $power_up);
|
306 |
+
}
|
307 |
+
}
|
308 |
+
|
309 |
+
return $power_ups;
|
310 |
+
}
|
311 |
+
|
312 |
+
/**
|
313 |
+
* Extract a power-up's slug from its full path.
|
314 |
+
*/
|
315 |
+
public static function get_power_up_slug ( $file ) {
|
316 |
+
return str_replace( '.php', '', basename( $file ) );
|
317 |
+
}
|
318 |
+
|
319 |
+
/**
|
320 |
+
* Generate a power-up's path from its slug.
|
321 |
+
*/
|
322 |
+
public static function get_power_up_path ( $slug ) {
|
323 |
+
return LEADIN_PLUGIN_DIR . "/power-ups/$slug.php";
|
324 |
+
}
|
325 |
+
|
326 |
+
/**
|
327 |
+
* Load power-up data from power-up file. Headers differ from WordPress
|
328 |
+
* plugin headers to avoid them being identified as standalone
|
329 |
+
* plugins on the WordPress plugins page.
|
330 |
+
*
|
331 |
+
* @param $power_up The file path for the power-up
|
332 |
+
* @return $pu array of power-up attributes
|
333 |
+
*/
|
334 |
+
public static function get_power_up ( $power_up )
|
335 |
+
{
|
336 |
+
$headers = array(
|
337 |
+
'name' => 'Power-up Name',
|
338 |
+
'class' => 'Power-up Class',
|
339 |
+
'menu_text' => 'Power-up Menu Text',
|
340 |
+
'menu_link' => 'Power-up Menu Link',
|
341 |
+
'slug' => 'Power-up Slug',
|
342 |
+
'uri' => 'Power-up URI',
|
343 |
+
'description' => 'Power-up Description',
|
344 |
+
'icon' => 'Power-up Icon',
|
345 |
+
'icon_small' => 'Power-up Icon Small',
|
346 |
+
'introduced' => 'First Introduced',
|
347 |
+
'auto_activate' => 'Auto Activate',
|
348 |
+
'permanent' => 'Permanently Enabled',
|
349 |
+
'power_up_tags' => 'Power-up Tags'
|
350 |
+
);
|
351 |
+
|
352 |
+
$file = WPLeadIn::get_power_up_path( WPLeadIn::get_power_up_slug( $power_up ) );
|
353 |
+
if ( ! file_exists( $file ) )
|
354 |
+
return false;
|
355 |
+
|
356 |
+
$pu = get_file_data( $file, $headers );
|
357 |
+
|
358 |
+
if ( empty( $pu['name'] ) )
|
359 |
+
return false;
|
360 |
+
|
361 |
+
$pu['activated'] = self::is_power_up_active($pu['slug']);
|
362 |
+
|
363 |
+
return $pu;
|
364 |
+
}
|
365 |
+
|
366 |
+
/**
|
367 |
+
* Returns an array of all PHP files in the specified absolute path.
|
368 |
+
* Equivalent to glob( "$absolute_path/*.php" ).
|
369 |
+
*
|
370 |
+
* @param string $absolute_path The absolute path of the directory to search.
|
371 |
+
* @return array Array of absolute paths to the PHP files.
|
372 |
+
*/
|
373 |
+
public static function glob_php( $absolute_path ) {
|
374 |
+
$absolute_path = untrailingslashit( $absolute_path );
|
375 |
+
$files = array();
|
376 |
+
if ( ! $dir = @opendir( $absolute_path ) ) {
|
377 |
+
return $files;
|
378 |
+
}
|
379 |
+
|
380 |
+
while ( false !== $file = readdir( $dir ) ) {
|
381 |
+
if ( '.' == substr( $file, 0, 1 ) || '.php' != substr( $file, -4 ) ) {
|
382 |
+
continue;
|
383 |
+
}
|
384 |
+
|
385 |
+
$file = "$absolute_path/$file";
|
386 |
+
|
387 |
+
if ( ! is_file( $file ) ) {
|
388 |
+
continue;
|
389 |
+
}
|
390 |
+
|
391 |
+
$files[] = $file;
|
392 |
+
}
|
393 |
+
|
394 |
+
closedir( $dir );
|
395 |
+
|
396 |
+
return $files;
|
397 |
+
}
|
398 |
+
|
399 |
+
/**
|
400 |
+
* Check whether or not a LeadIn power-up is active.
|
401 |
+
*
|
402 |
+
* @param string $power_up The slug of a Jetpack module.
|
403 |
+
* @return bool
|
404 |
+
*
|
405 |
+
* @static
|
406 |
+
*/
|
407 |
+
public static function is_power_up_active( $power_up_slug )
|
408 |
+
{
|
409 |
+
return in_array($power_up_slug, self::get_active_power_ups());
|
410 |
+
}
|
411 |
+
|
412 |
+
/**
|
413 |
+
* Get a list of activated modules as an array of module slugs.
|
414 |
+
*/
|
415 |
+
public static function get_active_power_ups ()
|
416 |
+
{
|
417 |
+
$activated_power_ups = get_option('leadin_active_power_ups');
|
418 |
+
if ( $activated_power_ups )
|
419 |
+
return array_unique(unserialize($activated_power_ups));
|
420 |
+
else
|
421 |
+
return array();
|
422 |
+
}
|
423 |
+
|
424 |
+
public static function activate_power_up( $power_up_slug, $exit = TRUE )
|
425 |
+
{
|
426 |
+
if ( ! strlen( $power_up_slug ) )
|
427 |
+
return false;
|
428 |
+
|
429 |
+
// If it's already active, then don't do it again
|
430 |
+
$active = self::is_power_up_active($power_up_slug);
|
431 |
+
if ( $active )
|
432 |
+
return true;
|
433 |
+
|
434 |
+
$activated_power_ups = get_option('leadin_active_power_ups');
|
435 |
+
|
436 |
+
if ( $activated_power_ups )
|
437 |
+
{
|
438 |
+
$activated_power_ups = unserialize($activated_power_ups);
|
439 |
+
$activated_power_ups[] = $power_up_slug;
|
440 |
+
}
|
441 |
+
else
|
442 |
+
{
|
443 |
+
$activated_power_ups = array($power_up_slug);
|
444 |
+
}
|
445 |
+
|
446 |
+
update_option('leadin_active_power_ups', serialize($activated_power_ups));
|
447 |
+
|
448 |
+
|
449 |
+
if ( $exit )
|
450 |
+
{
|
451 |
+
exit;
|
452 |
+
}
|
453 |
+
|
454 |
+
}
|
455 |
+
|
456 |
+
public static function deactivate_power_up( $power_up_slug, $exit = TRUE )
|
457 |
+
{
|
458 |
+
if ( ! strlen( $power_up_slug ) )
|
459 |
+
return false;
|
460 |
+
|
461 |
+
// If it's already active, then don't do it again
|
462 |
+
$active = self::is_power_up_active($power_up_slug);
|
463 |
+
if ( ! $active )
|
464 |
+
return true;
|
465 |
+
|
466 |
+
$activated_power_ups = get_option('leadin_active_power_ups');
|
467 |
+
|
468 |
+
$power_ups_left = leadin_array_delete(unserialize($activated_power_ups), $power_up_slug);
|
469 |
+
update_option('leadin_active_power_ups', serialize($power_ups_left));
|
470 |
+
|
471 |
+
if ( $exit )
|
472 |
+
{
|
473 |
+
exit;
|
474 |
+
}
|
475 |
+
|
476 |
+
}
|
477 |
+
}
|
478 |
+
|
479 |
+
//=============================================
|
480 |
+
// LeadIn Init
|
481 |
+
//=============================================
|
482 |
+
|
483 |
+
global $leadin_wp;
|
484 |
+
global $li_wp_admin;
|
485 |
+
$leadin_wp = new WPLeadIn();
|
486 |
+
|
487 |
+
|
488 |
+
?>
|
trunk/lib/mixpanel/Base/MixpanelBase.php
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* This a Base class which all Mixpanel classes extend from to provide some very basic
|
5 |
+
* debugging and logging functionality. It also serves to persist $_options across the library.
|
6 |
+
*
|
7 |
+
*/
|
8 |
+
class Base_MixpanelBase {
|
9 |
+
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Default options that can be overridden via the $options constructor arg
|
13 |
+
* @var array
|
14 |
+
*/
|
15 |
+
private $_defaults = array(
|
16 |
+
"max_batch_size" => 50, // the max batch size Mixpanel will accept is 50,
|
17 |
+
"max_queue_size" => 1000, // the max num of items to hold in memory before flushing
|
18 |
+
"debug" => false, // enable/disable debug mode
|
19 |
+
"consumer" => "curl", // which consumer to use
|
20 |
+
"host" => "api.mixpanel.com", // the host name for api calls
|
21 |
+
"events_endpoint" => "/track", // host relative endpoint for events
|
22 |
+
"people_endpoint" => "/engage", // host relative endpoint for people updates
|
23 |
+
"use_ssl" => true, // use ssl when available
|
24 |
+
"error_callback" => null // callback to use on consumption failures
|
25 |
+
);
|
26 |
+
|
27 |
+
|
28 |
+
/**
|
29 |
+
* An array of options to be used by the Mixpanel library.
|
30 |
+
* @var array
|
31 |
+
*/
|
32 |
+
protected $_options = array();
|
33 |
+
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Construct a new MixpanelBase object and merge custom options with defaults
|
37 |
+
* @param array $options
|
38 |
+
*/
|
39 |
+
public function __construct($options = array()) {
|
40 |
+
$options = array_merge($this->_defaults, $options);
|
41 |
+
$this->_options = $options;
|
42 |
+
}
|
43 |
+
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Log a message to PHP's error log
|
47 |
+
* @param $msg
|
48 |
+
*/
|
49 |
+
protected function _log($msg) {
|
50 |
+
$arr = debug_backtrace();
|
51 |
+
$class = $arr[0]['class'];
|
52 |
+
$line = $arr[0]['line'];
|
53 |
+
error_log ( "[ $class - line $line ] : " . $msg );
|
54 |
+
}
|
55 |
+
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Returns true if in debug mode, false if in production mode
|
59 |
+
* @return bool
|
60 |
+
*/
|
61 |
+
protected function _debug() {
|
62 |
+
return array_key_exists("debug", $this->_options) && $this->_options["debug"] == true;
|
63 |
+
}
|
64 |
+
|
65 |
+
}
|
trunk/lib/mixpanel/ConsumerStrategies/AbstractConsumer.php
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once(dirname(__FILE__) . "/../Base/MixpanelBase.php");
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Provides some base methods for use by a Consumer implementation
|
6 |
+
*/
|
7 |
+
abstract class ConsumerStrategies_AbstractConsumer extends Base_MixpanelBase {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Creates a new AbstractConsumer
|
11 |
+
* @param array $options
|
12 |
+
*/
|
13 |
+
function __construct($options = array()) {
|
14 |
+
|
15 |
+
parent::__construct($options);
|
16 |
+
|
17 |
+
if ($this->_debug()) {
|
18 |
+
$this->_log("Instantiated new Consumer");
|
19 |
+
}
|
20 |
+
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Encode an array to be persisted
|
25 |
+
* @param array $params
|
26 |
+
* @return string
|
27 |
+
*/
|
28 |
+
protected function _encode($params) {
|
29 |
+
return base64_encode(json_encode($params));
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Handles errors that occur in a consumer
|
34 |
+
* @param $code
|
35 |
+
* @param $msg
|
36 |
+
*/
|
37 |
+
protected function _handleError($code, $msg) {
|
38 |
+
if (isset($this->_options['error_callback'])) {
|
39 |
+
$handler = $this->_options['error_callback'];
|
40 |
+
call_user_func($handler, $code, $msg);
|
41 |
+
}
|
42 |
+
|
43 |
+
if ($this->_debug()) {
|
44 |
+
$arr = debug_backtrace();
|
45 |
+
$class = get_class($arr[0]['object']);
|
46 |
+
$line = $arr[0]['line'];
|
47 |
+
error_log ( "[ $class - line $line ] : " . print_r($msg, true) );
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Persist a batch of messages in whatever way the implementer sees fit
|
53 |
+
* @param array $batch an array of messages to consume
|
54 |
+
* @return boolean success or fail
|
55 |
+
*/
|
56 |
+
abstract function persist($batch);
|
57 |
+
}
|
trunk/lib/mixpanel/ConsumerStrategies/CurlConsumer.php
ADDED
@@ -0,0 +1,221 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once(dirname(__FILE__) . "/AbstractConsumer.php");
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Consumes messages and sends them to a host/endpoint using cURL
|
6 |
+
*/
|
7 |
+
class ConsumerStrategies_CurlConsumer extends ConsumerStrategies_AbstractConsumer {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* @var string the host to connect to (e.g. api.mixpanel.com)
|
11 |
+
*/
|
12 |
+
protected $_host;
|
13 |
+
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @var string the host-relative endpoint to write to (e.g. /engage)
|
17 |
+
*/
|
18 |
+
protected $_endpoint;
|
19 |
+
|
20 |
+
|
21 |
+
/**
|
22 |
+
* @var int connect_timeout The number of seconds to wait while trying to connect. Default is 5 seconds.
|
23 |
+
*/
|
24 |
+
protected $_connect_timeout;
|
25 |
+
|
26 |
+
|
27 |
+
/**
|
28 |
+
* @var int timeout The maximum number of seconds to allow cURL call to execute. Default is 30 seconds.
|
29 |
+
*/
|
30 |
+
protected $_timeout;
|
31 |
+
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @var string the protocol to use for the cURL connection
|
35 |
+
*/
|
36 |
+
protected $_protocol;
|
37 |
+
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @var bool|null true to fork the cURL process (using exec) or false to use PHP's cURL extension. false by default
|
41 |
+
*/
|
42 |
+
protected $_fork = null;
|
43 |
+
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Creates a new CurlConsumer and assigns properties from the $options array
|
47 |
+
* @param array $options
|
48 |
+
* @throws Exception
|
49 |
+
*/
|
50 |
+
function __construct($options) {
|
51 |
+
parent::__construct($options);
|
52 |
+
|
53 |
+
$this->_host = $options['host'];
|
54 |
+
$this->_endpoint = $options['endpoint'];
|
55 |
+
$this->_connect_timeout = array_key_exists('connect_timeout', $options) ? $options['connect_timeout'] : 5;
|
56 |
+
$this->_timeout = array_key_exists('timeout', $options) ? $options['timeout'] : 30;
|
57 |
+
$this->_protocol = array_key_exists('use_ssl', $options) && $options['use_ssl'] == true ? "https" : "http";
|
58 |
+
$this->_fork = array_key_exists('fork', $options) ? ($options['fork'] == true) : false;
|
59 |
+
|
60 |
+
// ensure the environment is workable for the given settings
|
61 |
+
if ($this->_fork == true) {
|
62 |
+
$exists = function_exists('exec');
|
63 |
+
if (!$exists) {
|
64 |
+
throw new Exception('The "exec" function must exist to use the cURL consumer in "fork" mode. Try setting fork = false or use another consumer.');
|
65 |
+
}
|
66 |
+
$disabled = explode(', ', ini_get('disable_functions'));
|
67 |
+
$enabled = !in_array('exec', $disabled);
|
68 |
+
if (!$enabled) {
|
69 |
+
throw new Exception('The "exec" function must be enabled to use the cURL consumer in "fork" mode. Try setting fork = false or use another consumer.');
|
70 |
+
}
|
71 |
+
} else {
|
72 |
+
if (!function_exists('curl_init')) {
|
73 |
+
throw new Exception('The cURL PHP extension is required to use the cURL consumer with fork = false. Try setting fork = true or use another consumer.');
|
74 |
+
}
|
75 |
+
}
|
76 |
+
}
|
77 |
+
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Write to the given host/endpoint using either a forked cURL process or using PHP's cURL extension
|
81 |
+
* @param array $batch
|
82 |
+
* @return bool
|
83 |
+
*/
|
84 |
+
public function persist($batch) {
|
85 |
+
if (count($batch) > 0) {
|
86 |
+
$data = "data=" . $this->_encode($batch);
|
87 |
+
$url = $this->_protocol . "://" . $this->_host . $this->_endpoint;
|
88 |
+
if ($this->_fork) {
|
89 |
+
return $this->_execute_forked($url, $data);
|
90 |
+
} else {
|
91 |
+
return $this->_execute($url, $data);
|
92 |
+
}
|
93 |
+
} else {
|
94 |
+
return true;
|
95 |
+
}
|
96 |
+
}
|
97 |
+
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Write using the cURL php extension
|
101 |
+
* @param $url
|
102 |
+
* @param $data
|
103 |
+
* @return bool
|
104 |
+
*/
|
105 |
+
protected function _execute($url, $data) {
|
106 |
+
if ($this->_debug()) {
|
107 |
+
$this->_log("Making blocking cURL call to $url");
|
108 |
+
}
|
109 |
+
|
110 |
+
$ch = curl_init();
|
111 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
112 |
+
curl_setopt($ch, CURLOPT_HEADER, 0);
|
113 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->_connect_timeout);
|
114 |
+
curl_setopt($ch, CURLOPT_TIMEOUT, $this->_timeout);
|
115 |
+
curl_setopt($ch, CURLOPT_POST, 1);
|
116 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
117 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
|
118 |
+
$response = curl_exec($ch);
|
119 |
+
if (false === $response) {
|
120 |
+
$curl_error = curl_error($ch);
|
121 |
+
$curl_errno = curl_errno($ch);
|
122 |
+
curl_close($ch);
|
123 |
+
$this->_handleError($curl_errno, $curl_error);
|
124 |
+
return false;
|
125 |
+
} else {
|
126 |
+
curl_close($ch);
|
127 |
+
if (trim($response) == "1") {
|
128 |
+
return true;
|
129 |
+
} else {
|
130 |
+
$this->_handleError(0, $response);
|
131 |
+
return false;
|
132 |
+
}
|
133 |
+
}
|
134 |
+
}
|
135 |
+
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Write using a forked cURL process
|
139 |
+
* @param $url
|
140 |
+
* @param $data
|
141 |
+
* @return bool
|
142 |
+
*/
|
143 |
+
protected function _execute_forked($url, $data) {
|
144 |
+
|
145 |
+
if ($this->_debug()) {
|
146 |
+
$this->_log("Making forked cURL call to $url");
|
147 |
+
}
|
148 |
+
|
149 |
+
$exec = 'curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d ' . $data . ' "' . $url . '"';
|
150 |
+
|
151 |
+
if(!$this->_debug()) {
|
152 |
+
$exec .= " >/dev/null 2>&1 &";
|
153 |
+
}
|
154 |
+
|
155 |
+
exec($exec, $output, $return_var);
|
156 |
+
|
157 |
+
if ($return_var != 0) {
|
158 |
+
$this->_handleError($return_var, $output);
|
159 |
+
}
|
160 |
+
|
161 |
+
return $return_var == 0;
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* @return int
|
166 |
+
*/
|
167 |
+
public function getConnectTimeout()
|
168 |
+
{
|
169 |
+
return $this->_connect_timeout;
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* @return string
|
174 |
+
*/
|
175 |
+
public function getEndpoint()
|
176 |
+
{
|
177 |
+
return $this->_endpoint;
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* @return bool|null
|
182 |
+
*/
|
183 |
+
public function getFork()
|
184 |
+
{
|
185 |
+
return $this->_fork;
|
186 |
+
}
|
187 |
+
|
188 |
+
/**
|
189 |
+
* @return string
|
190 |
+
*/
|
191 |
+
public function getHost()
|
192 |
+
{
|
193 |
+
return $this->_host;
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* @return array
|
198 |
+
*/
|
199 |
+
public function getOptions()
|
200 |
+
{
|
201 |
+
return $this->_options;
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* @return string
|
206 |
+
*/
|
207 |
+
public function getProtocol()
|
208 |
+
{
|
209 |
+
return $this->_protocol;
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* @return int
|
214 |
+
*/
|
215 |
+
public function getTimeout()
|
216 |
+
{
|
217 |
+
return $this->_timeout;
|
218 |
+
}
|
219 |
+
|
220 |
+
|
221 |
+
}
|
trunk/lib/mixpanel/ConsumerStrategies/FileConsumer.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once(dirname(__FILE__) . "/AbstractConsumer.php");
|
3 |
+
/**
|
4 |
+
* Consumes messages and writes them to a file
|
5 |
+
*/
|
6 |
+
class ConsumerStrategies_FileConsumer extends ConsumerStrategies_AbstractConsumer {
|
7 |
+
|
8 |
+
/**
|
9 |
+
* @var string path to a file that we want to write the messages to
|
10 |
+
*/
|
11 |
+
private $_file;
|
12 |
+
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Creates a new FileConsumer and assigns properties from the $options array
|
16 |
+
* @param array $options
|
17 |
+
*/
|
18 |
+
function __construct($options) {
|
19 |
+
parent::__construct($options);
|
20 |
+
|
21 |
+
// what file to write to?
|
22 |
+
$this->_file = array_key_exists("file", $options) ? $options['file'] : dirname(__FILE__)."/../../messages.txt";
|
23 |
+
}
|
24 |
+
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Append $batch to a file
|
28 |
+
* @param array $batch
|
29 |
+
* @return bool
|
30 |
+
*/
|
31 |
+
public function persist($batch) {
|
32 |
+
if (count($batch) > 0) {
|
33 |
+
return file_put_contents($this->_file, json_encode($batch)."\n", FILE_APPEND | LOCK_EX) !== false;
|
34 |
+
} else {
|
35 |
+
return true;
|
36 |
+
}
|
37 |
+
}
|
38 |
+
}
|
trunk/lib/mixpanel/ConsumerStrategies/SocketConsumer.php
ADDED
@@ -0,0 +1,308 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Portions of this class were borrowed from
|
4 |
+
* https://github.com/segmentio/analytics-php/blob/master/lib/Analytics/Consumer/Socket.php.
|
5 |
+
* Thanks for the work!
|
6 |
+
*
|
7 |
+
* WWWWWW||WWWWWW
|
8 |
+
* W W W||W W W
|
9 |
+
* ||
|
10 |
+
* ( OO )__________
|
11 |
+
* / | \
|
12 |
+
* /o o| MIT \
|
13 |
+
* \___/||_||__||_|| *
|
14 |
+
* || || || ||
|
15 |
+
* _||_|| _||_||
|
16 |
+
* (__|__|(__|__|
|
17 |
+
* (The MIT License)
|
18 |
+
*
|
19 |
+
* Copyright (c) 2013 Segment.io Inc. friends@segment.io
|
20 |
+
*
|
21 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
22 |
+
* documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the
|
23 |
+
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
24 |
+
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
25 |
+
*
|
26 |
+
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
27 |
+
* Software.
|
28 |
+
*
|
29 |
+
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
30 |
+
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
31 |
+
* OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
32 |
+
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
33 |
+
*/
|
34 |
+
require_once(dirname(__FILE__) . "/AbstractConsumer.php");
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Consumes messages and writes them to host/endpoint using a persistent socket
|
38 |
+
*/
|
39 |
+
class ConsumerStrategies_SocketConsumer extends ConsumerStrategies_AbstractConsumer {
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @var string the host to connect to (e.g. api.mixpanel.com)
|
43 |
+
*/
|
44 |
+
private $_host;
|
45 |
+
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @var string the host-relative endpoint to write to (e.g. /engage)
|
49 |
+
*/
|
50 |
+
private $_endpoint;
|
51 |
+
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @var int connect_timeout the socket connection timeout in seconds
|
55 |
+
*/
|
56 |
+
private $_connect_timeout;
|
57 |
+
|
58 |
+
|
59 |
+
/**
|
60 |
+
* @var string the protocol to use for the socket connection
|
61 |
+
*/
|
62 |
+
private $_protocol;
|
63 |
+
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @var resource holds the socket resource
|
67 |
+
*/
|
68 |
+
private $_socket;
|
69 |
+
|
70 |
+
/**
|
71 |
+
* @var bool whether or not to wait for a response
|
72 |
+
*/
|
73 |
+
private $_async;
|
74 |
+
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Creates a new SocketConsumer and assigns properties from the $options array
|
78 |
+
* @param array $options
|
79 |
+
*/
|
80 |
+
public function __construct($options = array()) {
|
81 |
+
parent::__construct($options);
|
82 |
+
|
83 |
+
|
84 |
+
$this->_host = $options['host'];
|
85 |
+
$this->_endpoint = $options['endpoint'];
|
86 |
+
$this->_connect_timeout = array_key_exists('connect_timeout', $options) ? $options['connect_timeout'] : 5;
|
87 |
+
$this->_async = array_key_exists('async', $options) && $options['async'] === false ? false : true;
|
88 |
+
|
89 |
+
if (array_key_exists('use_ssl', $options) && $options['use_ssl'] == true) {
|
90 |
+
$this->_protocol = "ssl";
|
91 |
+
$this->_port = 443;
|
92 |
+
} else {
|
93 |
+
$this->_protocol = "tcp";
|
94 |
+
$this->_port = 80;
|
95 |
+
}
|
96 |
+
}
|
97 |
+
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Write using a persistent socket connection.
|
101 |
+
* @param array $batch
|
102 |
+
* @return bool
|
103 |
+
*/
|
104 |
+
public function persist($batch) {
|
105 |
+
|
106 |
+
$socket = $this->_getSocket();
|
107 |
+
if (!is_resource($socket)) {
|
108 |
+
return false;
|
109 |
+
}
|
110 |
+
|
111 |
+
$data = "data=".$this->_encode($batch);
|
112 |
+
|
113 |
+
$body = "";
|
114 |
+
$body.= "POST ".$this->_endpoint." HTTP/1.1\r\n";
|
115 |
+
$body.= "Host: " . $this->_host . "\r\n";
|
116 |
+
$body.= "Content-Type: application/x-www-form-urlencoded\r\n";
|
117 |
+
$body.= "Accept: application/json\r\n";
|
118 |
+
$body.= "Content-length: " . strlen($data) . "\r\n";
|
119 |
+
$body.= "\r\n";
|
120 |
+
$body.= $data;
|
121 |
+
|
122 |
+
return $this->_write($socket, $body);
|
123 |
+
}
|
124 |
+
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Return cached socket if open or create a new persistent socket
|
128 |
+
* @return bool|resource
|
129 |
+
*/
|
130 |
+
private function _getSocket() {
|
131 |
+
if(is_resource($this->_socket)) {
|
132 |
+
|
133 |
+
if ($this->_debug()) {
|
134 |
+
$this->_log("Using existing socket");
|
135 |
+
}
|
136 |
+
|
137 |
+
return $this->_socket;
|
138 |
+
} else {
|
139 |
+
|
140 |
+
if ($this->_debug()) {
|
141 |
+
$this->_log("Creating new socket at ".time());
|
142 |
+
}
|
143 |
+
|
144 |
+
return $this->_createSocket();
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Attempt to open a new socket connection, cache it, and return the resource
|
150 |
+
* @param bool $retry
|
151 |
+
* @return bool|resource
|
152 |
+
*/
|
153 |
+
private function _createSocket($retry = true) {
|
154 |
+
try {
|
155 |
+
$socket = pfsockopen($this->_protocol . "://" . $this->_host, $this->_port, $err_no, $err_msg, $this->_connect_timeout);
|
156 |
+
|
157 |
+
if ($this->_debug()) {
|
158 |
+
$this->_log("Opening socket connection to " . $this->_protocol . "://" . $this->_host . ":" . $this->_port);
|
159 |
+
}
|
160 |
+
|
161 |
+
if ($err_no != 0) {
|
162 |
+
$this->_handleError($err_no, $err_msg);
|
163 |
+
return $retry == true ? $this->_createSocket(false) : false;
|
164 |
+
} else {
|
165 |
+
// cache the socket
|
166 |
+
$this->_socket = $socket;
|
167 |
+
return $socket;
|
168 |
+
}
|
169 |
+
|
170 |
+
} catch (Exception $e) {
|
171 |
+
$this->_handleError($e->getCode(), $e->getMessage());
|
172 |
+
return $retry == true ? $this->_createSocket(false) : false;
|
173 |
+
}
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* Attempt to close and dereference a socket resource
|
178 |
+
*/
|
179 |
+
private function _destroySocket() {
|
180 |
+
$socket = $this->_socket;
|
181 |
+
$this->_socket = null;
|
182 |
+
fclose($socket);
|
183 |
+
}
|
184 |
+
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Write $data through the given $socket
|
188 |
+
* @param $socket
|
189 |
+
* @param $data
|
190 |
+
* @param bool $retry
|
191 |
+
* @return bool
|
192 |
+
*/
|
193 |
+
private function _write($socket, $data, $retry = true) {
|
194 |
+
|
195 |
+
$bytes_sent = 0;
|
196 |
+
$bytes_total = strlen($data);
|
197 |
+
$socket_closed = false;
|
198 |
+
$success = true;
|
199 |
+
$max_bytes_per_write = 8192;
|
200 |
+
|
201 |
+
// if we have no data to write just return true
|
202 |
+
if ($bytes_total == 0) {
|
203 |
+
return true;
|
204 |
+
}
|
205 |
+
|
206 |
+
// try to write the data
|
207 |
+
while (!$socket_closed && $bytes_sent < $bytes_total) {
|
208 |
+
|
209 |
+
try {
|
210 |
+
$bytes = fwrite($socket, $data, $max_bytes_per_write);
|
211 |
+
|
212 |
+
if ($this->_debug()) {
|
213 |
+
$this->_log("Socket wrote ".$bytes." bytes");
|
214 |
+
}
|
215 |
+
|
216 |
+
// if we actually wrote data, then remove the written portion from $data left to write
|
217 |
+
if ($bytes > 0) {
|
218 |
+
$data = substr($data, $max_bytes_per_write);
|
219 |
+
}
|
220 |
+
|
221 |
+
} catch (Exception $e) {
|
222 |
+
$this->_handleError($e->getCode(), $e->getMessage());
|
223 |
+
$socket_closed = true;
|
224 |
+
}
|
225 |
+
|
226 |
+
if (isset($bytes) && $bytes) {
|
227 |
+
$bytes_sent += $bytes;
|
228 |
+
} else {
|
229 |
+
$socket_closed = true;
|
230 |
+
}
|
231 |
+
}
|
232 |
+
|
233 |
+
// create a new socket if the current one is closed and retry the message
|
234 |
+
if ($socket_closed) {
|
235 |
+
|
236 |
+
$this->_destroySocket();
|
237 |
+
|
238 |
+
if ($retry) {
|
239 |
+
if ($this->_debug()) {
|
240 |
+
$this->_log("Retrying socket write...");
|
241 |
+
}
|
242 |
+
$socket = $this->_getSocket();
|
243 |
+
if ($socket) return $this->_write($socket, $data, false);
|
244 |
+
}
|
245 |
+
|
246 |
+
return false;
|
247 |
+
}
|
248 |
+
|
249 |
+
|
250 |
+
// only wait for the response in debug mode or if we explicitly want to be synchronous
|
251 |
+
if ($this->_debug() || !$this->_async) {
|
252 |
+
$res = $this->handleResponse(fread($socket, 2048));
|
253 |
+
if ($res["status"] != "200") {
|
254 |
+
$this->_handleError($res["status"], $res["body"]);
|
255 |
+
$success = false;
|
256 |
+
}
|
257 |
+
}
|
258 |
+
|
259 |
+
return $success;
|
260 |
+
}
|
261 |
+
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Parse the response from a socket write (only used for debugging)
|
265 |
+
* @param $response
|
266 |
+
* @return array
|
267 |
+
*/
|
268 |
+
private function handleResponse($response) {
|
269 |
+
|
270 |
+
$lines = explode("\n", $response);
|
271 |
+
|
272 |
+
// extract headers
|
273 |
+
$headers = array();
|
274 |
+
foreach($lines as $line) {
|
275 |
+
$kvsplit = explode(":", $line);
|
276 |
+
if (count($kvsplit) == 2) {
|
277 |
+
$header = $kvsplit[0];
|
278 |
+
$value = $kvsplit[1];
|
279 |
+
$headers[$header] = trim($value);
|
280 |
+
}
|
281 |
+
|
282 |
+
}
|
283 |
+
|
284 |
+
// extract status
|
285 |
+
$line_one_exploded = explode(" ", $lines[0]);
|
286 |
+
$status = $line_one_exploded[1];
|
287 |
+
|
288 |
+
// extract body
|
289 |
+
$body = $lines[count($lines) - 1];
|
290 |
+
|
291 |
+
// if the connection has been closed lets kill the socket
|
292 |
+
if ($headers['Connection'] == "close") {
|
293 |
+
$this->_destroySocket();
|
294 |
+
if ($this->_debug()) {
|
295 |
+
$this->_log("Server told us connection closed so lets destroy the socket so it'll reconnect on next call");
|
296 |
+
}
|
297 |
+
}
|
298 |
+
|
299 |
+
$ret = array(
|
300 |
+
"status" => $status,
|
301 |
+
"body" => $body,
|
302 |
+
);
|
303 |
+
|
304 |
+
return $ret;
|
305 |
+
}
|
306 |
+
|
307 |
+
|
308 |
+
}
|
trunk/lib/mixpanel/Mixpanel.php
ADDED
@@ -0,0 +1,302 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once(dirname(__FILE__) . "/Base/MixpanelBase.php");
|
4 |
+
require_once(dirname(__FILE__) . "/Producers/MixpanelPeople.php");
|
5 |
+
require_once(dirname(__FILE__) . "/Producers/MixpanelEvents.php");
|
6 |
+
|
7 |
+
/**
|
8 |
+
* This is the main class for the Mixpanel PHP Library which provides all of the methods you need to track events and
|
9 |
+
* create/update profiles.
|
10 |
+
*
|
11 |
+
* Architecture
|
12 |
+
* -------------
|
13 |
+
*
|
14 |
+
* This library is built such that all messages are buffered in an in-memory "queue"
|
15 |
+
* The queue will be automatically flushed at the end of every request. Alternatively, you can call "flush()" manually
|
16 |
+
* at any time. Flushed messages will be passed to a Consumer's "persist" method. The library comes with a handful of
|
17 |
+
* Consumers. The "CurlConsumer" is used by default which will send the messages to Mixpanel using forked cURL processes.
|
18 |
+
* You can implement your own custom Consumer to customize how a message is sent to Mixpanel. This can be useful when
|
19 |
+
* you want to put messages onto a distributed queue (such as ActiveMQ or Kestrel) instead of writing to Mixpanel in
|
20 |
+
* the user thread.
|
21 |
+
*
|
22 |
+
* Options
|
23 |
+
* -------------
|
24 |
+
*
|
25 |
+
* <table width="100%" cellpadding="5">
|
26 |
+
* <tr>
|
27 |
+
* <th>Option</th>
|
28 |
+
* <th>Description</th>
|
29 |
+
* <th>Default</th>
|
30 |
+
* </tr>
|
31 |
+
* <tr>
|
32 |
+
* <td>max_queue_size</td>
|
33 |
+
* <td>The maximum number of items to buffer in memory before flushing</td>
|
34 |
+
* <td>1000</td>
|
35 |
+
* </tr>
|
36 |
+
* <tr>
|
37 |
+
* <td>debug</td>
|
38 |
+
* <td>Enable/disable debug mode</td>
|
39 |
+
* <td>false</td>
|
40 |
+
* </tr>
|
41 |
+
* <tr>
|
42 |
+
* <td>consumer</td>
|
43 |
+
* <td>The consumer to use for writing messages</td>
|
44 |
+
* <td>curl</td>
|
45 |
+
* </tr>
|
46 |
+
* <tr>
|
47 |
+
* <td>consumers</td>
|
48 |
+
* <td>An array of custom consumers in the format array(consumer_key => class_name)</td>
|
49 |
+
* <td>null</td>
|
50 |
+
* </tr>
|
51 |
+
* <tr>
|
52 |
+
* <td>host</td>
|
53 |
+
* <td>The host name for api calls (used by some consumers)</td>
|
54 |
+
* <td>api.mixpanel.com</td>
|
55 |
+
* </tr>
|
56 |
+
* <tr>
|
57 |
+
* <td>events_endpoint</td>
|
58 |
+
* <td>The endpoint for tracking events (relative to the host)</td>
|
59 |
+
* <td>/events</td>
|
60 |
+
* </tr>
|
61 |
+
* <tr>
|
62 |
+
* <td>people_endpoint</td>
|
63 |
+
* <td>The endpoint for making people updates (relative to the host)</td>
|
64 |
+
* <td>/engage</td>
|
65 |
+
* </tr>
|
66 |
+
* <tr>
|
67 |
+
* <td>use_ssl</td>
|
68 |
+
* <td>Tell the consumer whether or not to use ssl (when available)</td>
|
69 |
+
* <td>true</td>
|
70 |
+
* </tr>
|
71 |
+
* <tr>
|
72 |
+
* <td>error_callback</td>
|
73 |
+
* <td>The name of a function to be called on consumption failures</td>
|
74 |
+
* <td>null</td>
|
75 |
+
* </tr>
|
76 |
+
* <tr>
|
77 |
+
* <td>connect_timeout</td>
|
78 |
+
* <td>In both the SocketConsumer and CurlConsumer, this is used for the connection timeout (i.e. How long it has take to actually make a connection).
|
79 |
+
* <td>5</td>
|
80 |
+
* </tr>
|
81 |
+
* <tr>
|
82 |
+
* <td>timeout</td>
|
83 |
+
* <td>In the CurlConsumer (non-forked), it is used to determine how long the cURL call has to execute.
|
84 |
+
* <td>30</td>
|
85 |
+
* </tr>
|
86 |
+
* </table>
|
87 |
+
*
|
88 |
+
* Example: Tracking an Event
|
89 |
+
* -------------
|
90 |
+
*
|
91 |
+
* $mp = Mixpanel::getInstance("MY_TOKEN");
|
92 |
+
*
|
93 |
+
* $mp->track("My Event");
|
94 |
+
*
|
95 |
+
* Example: Setting Profile Properties
|
96 |
+
* -------------
|
97 |
+
*
|
98 |
+
* $mp = Mixpanel::getInstance("MY_TOKEN", array("use_ssl" => false));
|
99 |
+
*
|
100 |
+
* $mp->people->set(12345, array(
|
101 |
+
* '$first_name' => "John",
|
102 |
+
* '$last_name' => "Doe",
|
103 |
+
* '$email' => "john.doe@example.com",
|
104 |
+
* '$phone' => "5555555555",
|
105 |
+
* 'Favorite Color' => "red"
|
106 |
+
* ));
|
107 |
+
*
|
108 |
+
*/
|
109 |
+
class Mixpanel extends Base_MixpanelBase {
|
110 |
+
|
111 |
+
|
112 |
+
/**
|
113 |
+
* An instance of the MixpanelPeople class (used to create/update profiles)
|
114 |
+
* @var MixpanelPeople
|
115 |
+
*/
|
116 |
+
public $people;
|
117 |
+
|
118 |
+
|
119 |
+
/**
|
120 |
+
* An instance of the MixpanelEvents class
|
121 |
+
* @var Producers_MixpanelEvents
|
122 |
+
*/
|
123 |
+
private $_events;
|
124 |
+
|
125 |
+
|
126 |
+
/**
|
127 |
+
* An instance of the Mixpanel class (for singleton use)
|
128 |
+
* @var Mixpanel
|
129 |
+
*/
|
130 |
+
private static $_instance;
|
131 |
+
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Instantiates a new Mixpanel instance.
|
135 |
+
* @param $token
|
136 |
+
* @param array $options
|
137 |
+
*/
|
138 |
+
public function __construct($token, $options = array()) {
|
139 |
+
parent::__construct($options);
|
140 |
+
$this->people = new Producers_MixpanelPeople($token, $options);
|
141 |
+
$this->_events = new Producers_MixpanelEvents($token, $options);
|
142 |
+
}
|
143 |
+
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Returns a singleton instance of Mixpanel
|
147 |
+
* @param $token
|
148 |
+
* @param array $options
|
149 |
+
* @return Mixpanel
|
150 |
+
*/
|
151 |
+
public static function getInstance($token, $options = array()) {
|
152 |
+
if(!isset(self::$_instance)) {
|
153 |
+
self::$_instance = new Mixpanel($token, $options);
|
154 |
+
}
|
155 |
+
return self::$_instance;
|
156 |
+
}
|
157 |
+
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Add an array representing a message to be sent to Mixpanel to the in-memory queue.
|
161 |
+
* @param array $message
|
162 |
+
*/
|
163 |
+
public function enqueue($message = array()) {
|
164 |
+
$this->_events->enqueue($message);
|
165 |
+
}
|
166 |
+
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Add an array representing a list of messages to be sent to Mixpanel to a queue.
|
170 |
+
* @param array $messages
|
171 |
+
*/
|
172 |
+
public function enqueueAll($messages = array()) {
|
173 |
+
$this->_events->enqueueAll($messages);
|
174 |
+
}
|
175 |
+
|
176 |
+
|
177 |
+
/**
|
178 |
+
* Flush the events queue
|
179 |
+
* @param int $desired_batch_size
|
180 |
+
*/
|
181 |
+
public function flush($desired_batch_size = 50) {
|
182 |
+
$this->_events->flush($desired_batch_size);
|
183 |
+
}
|
184 |
+
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Empty the events queue
|
188 |
+
*/
|
189 |
+
public function reset() {
|
190 |
+
$this->_events->reset();
|
191 |
+
}
|
192 |
+
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Identify the user you want to associate to tracked events
|
196 |
+
* @param string|int $user_id
|
197 |
+
*/
|
198 |
+
public function identify($user_id) {
|
199 |
+
$this->_events->identify($user_id);
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Track an event defined by $event associated with metadata defined by $properties
|
204 |
+
* @param string $event
|
205 |
+
* @param array $properties
|
206 |
+
*/
|
207 |
+
public function track($event, $properties = array()) {
|
208 |
+
$this->_events->track($event, $properties);
|
209 |
+
}
|
210 |
+
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Register a property to be sent with every event.
|
214 |
+
*
|
215 |
+
* If the property has already been registered, it will be
|
216 |
+
* overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class instance.
|
217 |
+
* @param string $property
|
218 |
+
* @param mixed $value
|
219 |
+
*/
|
220 |
+
public function register($property, $value) {
|
221 |
+
$this->_events->register($property, $value);
|
222 |
+
}
|
223 |
+
|
224 |
+
|
225 |
+
/**
|
226 |
+
* Register multiple properties to be sent with every event.
|
227 |
+
*
|
228 |
+
* If any of the properties have already been registered,
|
229 |
+
* they will be overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class
|
230 |
+
* instance.
|
231 |
+
* @param array $props_and_vals
|
232 |
+
*/
|
233 |
+
public function registerAll($props_and_vals = array()) {
|
234 |
+
$this->_events->registerAll($props_and_vals);
|
235 |
+
}
|
236 |
+
|
237 |
+
|
238 |
+
/**
|
239 |
+
* Register a property to be sent with every event.
|
240 |
+
*
|
241 |
+
* If the property has already been registered, it will NOT be
|
242 |
+
* overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class instance.
|
243 |
+
* @param $property
|
244 |
+
* @param $value
|
245 |
+
*/
|
246 |
+
public function registerOnce($property, $value) {
|
247 |
+
$this->_events->registerOnce($property, $value);
|
248 |
+
}
|
249 |
+
|
250 |
+
|
251 |
+
/**
|
252 |
+
* Register multiple properties to be sent with every event.
|
253 |
+
*
|
254 |
+
* If any of the properties have already been registered,
|
255 |
+
* they will NOT be overwritten. NOTE: Registered properties are only persisted for the life of the Mixpanel class
|
256 |
+
* instance.
|
257 |
+
* @param array $props_and_vals
|
258 |
+
*/
|
259 |
+
public function registerAllOnce($props_and_vals = array()) {
|
260 |
+
$this->_events->registerAllOnce($props_and_vals);
|
261 |
+
}
|
262 |
+
|
263 |
+
|
264 |
+
/**
|
265 |
+
* Un-register an property to be sent with every event.
|
266 |
+
* @param string $property
|
267 |
+
*/
|
268 |
+
public function unregister($property) {
|
269 |
+
$this->_events->unregister($property);
|
270 |
+
}
|
271 |
+
|
272 |
+
|
273 |
+
/**
|
274 |
+
* Un-register a list of properties to be sent with every event.
|
275 |
+
* @param array $properties
|
276 |
+
*/
|
277 |
+
public function unregisterAll($properties) {
|
278 |
+
$this->_events->unregisterAll($properties);
|
279 |
+
}
|
280 |
+
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Get a property that is set to be sent with every event
|
284 |
+
* @param string $property
|
285 |
+
* @return mixed
|
286 |
+
*/
|
287 |
+
public function getProperty($property)
|
288 |
+
{
|
289 |
+
return $this->_events->getProperty($property);
|
290 |
+
}
|
291 |
+
|
292 |
+
|
293 |
+
/**
|
294 |
+
* Alias an existing id with a different unique id. This is helpful when you want to associate a generated id
|
295 |
+
* (such as a session id) to a user id or username.
|
296 |
+
* @param string|int $original_id
|
297 |
+
* @param string|int $new_id
|
298 |
+
*/
|
299 |
+
public function createAlias($original_id, $new_id) {
|
300 |
+
$this->_events->createAlias($original_id, $new_id);
|
301 |
+
}
|
302 |
+
}
|
trunk/lib/mixpanel/Producers/MixpanelBaseProducer.php
ADDED
@@ -0,0 +1,229 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once(dirname(__FILE__) . "/../Base/MixpanelBase.php");
|
3 |
+
require_once(dirname(__FILE__) . "/../ConsumerStrategies/FileConsumer.php");
|
4 |
+
require_once(dirname(__FILE__) . "/../ConsumerStrategies/CurlConsumer.php");
|
5 |
+
require_once(dirname(__FILE__) . "/../ConsumerStrategies/SocketConsumer.php");
|
6 |
+
|
7 |
+
if (!function_exists('json_encode')) {
|
8 |
+
throw new Exception('The JSON PHP extension is required.');
|
9 |
+
}
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Provides some base methods for use by a message Producer
|
13 |
+
*/
|
14 |
+
abstract class Producers_MixpanelBaseProducer extends Base_MixpanelBase {
|
15 |
+
|
16 |
+
|
17 |
+
/**
|
18 |
+
* @var string a token associated to a Mixpanel project
|
19 |
+
*/
|
20 |
+
protected $_token;
|
21 |
+
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @var array a queue to hold messages in memory before flushing in batches
|
25 |
+
*/
|
26 |
+
private $_queue = array();
|
27 |
+
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @var ConsumerStrategies_AbstractConsumer the consumer to use when flushing messages
|
31 |
+
*/
|
32 |
+
private $_consumer = null;
|
33 |
+
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @var array The list of available consumers
|
37 |
+
*/
|
38 |
+
private $_consumers = array(
|
39 |
+
"file" => "ConsumerStrategies_FileConsumer",
|
40 |
+
"curl" => "ConsumerStrategies_CurlConsumer",
|
41 |
+
"socket" => "ConsumerStrategies_SocketConsumer"
|
42 |
+
);
|
43 |
+
|
44 |
+
|
45 |
+
/**
|
46 |
+
* If the queue reaches this size we'll auto-flush to prevent out of memory errors
|
47 |
+
* @var int
|
48 |
+
*/
|
49 |
+
protected $_max_queue_size = 1000;
|
50 |
+
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Creates a new MixpanelBaseProducer, assings Mixpanel project token, registers custom Consumers, and instantiates
|
54 |
+
* the desired consumer
|
55 |
+
* @param $token
|
56 |
+
* @param array $options
|
57 |
+
*/
|
58 |
+
public function __construct($token, $options = array()) {
|
59 |
+
|
60 |
+
parent::__construct($options);
|
61 |
+
|
62 |
+
// register any customer consumers
|
63 |
+
if (array_key_exists("consumers", $options)) {
|
64 |
+
$this->_consumers = array_merge($this->_consumers, $options['consumers']);
|
65 |
+
}
|
66 |
+
|
67 |
+
// set max queue size
|
68 |
+
if (array_key_exists("max_queue_size", $options)) {
|
69 |
+
$this->_max_queue_size = $options['max_queue_size'];
|
70 |
+
}
|
71 |
+
|
72 |
+
// associate token
|
73 |
+
$this->_token = $token;
|
74 |
+
|
75 |
+
if ($this->_debug()) {
|
76 |
+
$this->_log("Using token: ".$this->_token);
|
77 |
+
}
|
78 |
+
|
79 |
+
// instantiate the chosen consumer
|
80 |
+
$this->_consumer = $this->_getConsumer();
|
81 |
+
|
82 |
+
}
|
83 |
+
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Flush the queue when we destruct the client with retries
|
87 |
+
*/
|
88 |
+
public function __destruct() {
|
89 |
+
$attempts = 0;
|
90 |
+
$max_attempts = 10;
|
91 |
+
$success = false;
|
92 |
+
while (!$success && $attempts < $max_attempts) {
|
93 |
+
if ($this->_debug()) {
|
94 |
+
$this->_log("destruct flush attempt #".($attempts+1));
|
95 |
+
}
|
96 |
+
$success = $this->flush();
|
97 |
+
$attempts++;
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
|
102 |
+
/**
|
103 |
+
* Iterate the queue and write in batches using the instantiated Consumer Strategy
|
104 |
+
* @param int $desired_batch_size
|
105 |
+
* @return bool whether or not the flush was successful
|
106 |
+
*/
|
107 |
+
public function flush($desired_batch_size = 50) {
|
108 |
+
$queue_size = count($this->_queue);
|
109 |
+
$succeeded = true;
|
110 |
+
if ($this->_debug()) {
|
111 |
+
$this->_log("Flush called - queue size: ".$queue_size);
|
112 |
+
}
|
113 |
+
|
114 |
+
while($queue_size > 0 && $succeeded) {
|
115 |
+
$batch_size = min(array($queue_size, $desired_batch_size, $this->_options['max_batch_size']));
|
116 |
+
$batch = array_splice($this->_queue, 0, $batch_size);
|
117 |
+
$succeeded = $this->_persist($batch);
|
118 |
+
|
119 |
+
if (!$succeeded) {
|
120 |
+
if ($this->_debug()) {
|
121 |
+
$this->_log("Batch consumption failed!");
|
122 |
+
}
|
123 |
+
$this->_queue = array_merge($batch, $this->_queue);
|
124 |
+
|
125 |
+
if ($this->_debug()) {
|
126 |
+
$this->_log("added batch back to queue, queue size is now $queue_size");
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
$queue_size = count($this->_queue);
|
131 |
+
|
132 |
+
if ($this->_debug()) {
|
133 |
+
$this->_log("Batch of $batch_size consumed, queue size is now $queue_size");
|
134 |
+
}
|
135 |
+
}
|
136 |
+
return $succeeded;
|
137 |
+
}
|
138 |
+
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Empties the queue without persisting any of the messages
|
142 |
+
*/
|
143 |
+
public function reset() {
|
144 |
+
$this->_queue = array();
|
145 |
+
}
|
146 |
+
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Returns the in-memory queue
|
150 |
+
* @return array
|
151 |
+
*/
|
152 |
+
public function getQueue() {
|
153 |
+
return $this->_queue;
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Returns the current Mixpanel project token
|
158 |
+
* @return string
|
159 |
+
*/
|
160 |
+
public function getToken() {
|
161 |
+
return $this->_token;
|
162 |
+
}
|
163 |
+
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Given a strategy type, return a new PersistenceStrategy object
|
167 |
+
* @return ConsumerStrategies_AbstractConsumer
|
168 |
+
*/
|
169 |
+
protected function _getConsumer() {
|
170 |
+
$key = $this->_options['consumer'];
|
171 |
+
$Strategy = $this->_consumers[$key];
|
172 |
+
if ($this->_debug()) {
|
173 |
+
$this->_log("Using consumer: " . $key . " -> " . $Strategy);
|
174 |
+
}
|
175 |
+
$this->_options['endpoint'] = $this->_getEndpoint();
|
176 |
+
|
177 |
+
return new $Strategy($this->_options);
|
178 |
+
}
|
179 |
+
|
180 |
+
|
181 |
+
/**
|
182 |
+
* Add an array representing a message to be sent to Mixpanel to a queue.
|
183 |
+
* @param array $message
|
184 |
+
*/
|
185 |
+
public function enqueue($message = array()) {
|
186 |
+
array_push($this->_queue, $message);
|
187 |
+
|
188 |
+
// force a flush if we've reached our threshold
|
189 |
+
if (count($this->_queue) > $this->_max_queue_size) {
|
190 |
+
$this->flush();
|
191 |
+
}
|
192 |
+
|
193 |
+
if ($this->_debug()) {
|
194 |
+
$this->_log("Queued message: ".json_encode($message));
|
195 |
+
}
|
196 |
+
}
|
197 |
+
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Add an array representing a list of messages to be sent to Mixpanel to a queue.
|
201 |
+
* @param array $messages
|
202 |
+
*/
|
203 |
+
public function enqueueAll($messages = array()) {
|
204 |
+
foreach($messages as $message) {
|
205 |
+
$this->enqueue($message);
|
206 |
+
}
|
207 |
+
|
208 |
+
}
|
209 |
+
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Given an array of messages, persist it with the instantiated Persistence Strategy
|
213 |
+
* @param $message
|
214 |
+
* @return mixed
|
215 |
+
*/
|
216 |
+
protected function _persist($message) {
|
217 |
+
return $this->_consumer->persist($message);
|
218 |
+
}
|
219 |
+
|
220 |
+
|
221 |
+
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Return the endpoint that should be used by a consumer that consumes messages produced by this producer.
|
225 |
+
* @return string
|
226 |
+
*/
|
227 |
+
abstract function _getEndpoint();
|
228 |
+
|
229 |
+
}
|
trunk/lib/mixpanel/Producers/MixpanelEvents.php
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once(dirname(__FILE__) . "/MixpanelBaseProducer.php");
|
3 |
+
require_once(dirname(__FILE__) . "/MixpanelPeople.php");
|
4 |
+
require_once(dirname(__FILE__) . "/../ConsumerStrategies/CurlConsumer.php");
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Provides an API to track events on Mixpanel
|
8 |
+
*/
|
9 |
+
class Producers_MixpanelEvents extends Producers_MixpanelBaseProducer {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* An array of properties to attach to every tracked event
|
13 |
+
* @var array
|
14 |
+
*/
|
15 |
+
private $_super_properties = array("mp_lib" => "php");
|
16 |
+
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Track an event defined by $event associated with metadata defined by $properties
|
20 |
+
* @param string $event
|
21 |
+
* @param array $properties
|
22 |
+
*/
|
23 |
+
public function track($event, $properties = array()) {
|
24 |
+
|
25 |
+
// if no token is passed in, use current token
|
26 |
+
if (!array_key_exists("token", $properties)) $properties['token'] = $this->_token;
|
27 |
+
|
28 |
+
// if no time is passed in, use the current time
|
29 |
+
if (!array_key_exists('time', $properties)) $properties['time'] = time();
|
30 |
+
|
31 |
+
$params['event'] = $event;
|
32 |
+
$params['properties'] = array_merge($this->_super_properties, $properties);
|
33 |
+
|
34 |
+
$this->enqueue($params);
|
35 |
+
}
|
36 |
+
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Register a property to be sent with every event. If the property has already been registered, it will be
|
40 |
+
* overwritten.
|
41 |
+
* @param string $property
|
42 |
+
* @param mixed $value
|
43 |
+
*/
|
44 |
+
public function register($property, $value) {
|
45 |
+
$this->_super_properties[$property] = $value;
|
46 |
+
}
|
47 |
+
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Register multiple properties to be sent with every event. If any of the properties have already been registered,
|
51 |
+
* they will be overwritten.
|
52 |
+
* @param array $props_and_vals
|
53 |
+
*/
|
54 |
+
public function registerAll($props_and_vals = array()) {
|
55 |
+
foreach($props_and_vals as $property => $value) {
|
56 |
+
$this->register($property, $value);
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Register a property to be sent with every event. If the property has already been registered, it will NOT be
|
63 |
+
* overwritten.
|
64 |
+
* @param $property
|
65 |
+
* @param $value
|
66 |
+
*/
|
67 |
+
public function registerOnce($property, $value) {
|
68 |
+
if (!isset($this->_super_properties[$property])) {
|
69 |
+
$this->register($property, $value);
|
70 |
+
}
|
71 |
+
}
|
72 |
+
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Register multiple properties to be sent with every event. If any of the properties have already been registered,
|
76 |
+
* they will NOT be overwritten.
|
77 |
+
* @param array $props_and_vals
|
78 |
+
*/
|
79 |
+
public function registerAllOnce($props_and_vals = array()) {
|
80 |
+
foreach($props_and_vals as $property => $value) {
|
81 |
+
if (!isset($this->_super_properties[$property])) {
|
82 |
+
$this->register($property, $value);
|
83 |
+
}
|
84 |
+
}
|
85 |
+
}
|
86 |
+
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Un-register an property to be sent with every event.
|
90 |
+
* @param string $property
|
91 |
+
*/
|
92 |
+
public function unregister($property) {
|
93 |
+
unset($this->_super_properties[$property]);
|
94 |
+
}
|
95 |
+
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Un-register a list of properties to be sent with every event.
|
99 |
+
* @param array $properties
|
100 |
+
*/
|
101 |
+
public function unregisterAll($properties) {
|
102 |
+
foreach($properties as $property) {
|
103 |
+
$this->unregister($property);
|
104 |
+
}
|
105 |
+
}
|
106 |
+
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Get a property that is set to be sent with every event
|
110 |
+
* @param string $property
|
111 |
+
* @return mixed
|
112 |
+
*/
|
113 |
+
public function getProperty($property) {
|
114 |
+
return $this->_super_properties[$property];
|
115 |
+
}
|
116 |
+
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Identify the user you want to associate to tracked events
|
120 |
+
* @param string|int $user_id
|
121 |
+
*/
|
122 |
+
public function identify($user_id) {
|
123 |
+
$this->register("distinct_id", $user_id);
|
124 |
+
}
|
125 |
+
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Alias an existing id with a different unique id. This is helpful when you want to associate a generated id to
|
129 |
+
* a username or e-mail address.
|
130 |
+
*
|
131 |
+
* Because aliasing can be extremely vulnerable to race conditions and ordering issues, we'll make a synchronous
|
132 |
+
* call directly to Mixpanel when this method is called. If it fails we'll throw an Exception as subsequent
|
133 |
+
* events are likely to be incorrectly tracked.
|
134 |
+
* @param string|int $original_id
|
135 |
+
* @param string|int $new_id
|
136 |
+
* @return array $msg
|
137 |
+
* @throws Exception
|
138 |
+
*/
|
139 |
+
public function createAlias($original_id, $new_id) {
|
140 |
+
$msg = array(
|
141 |
+
"event" => '$create_alias',
|
142 |
+
"properties" => array("distinct_id" => $original_id, "alias" => $new_id, "token" => $this->_token)
|
143 |
+
);
|
144 |
+
|
145 |
+
$options = array_merge($this->_options, array("endpoint" => $this->_getEndpoint(), "fork" => false));
|
146 |
+
$curlConsumer = new ConsumerStrategies_CurlConsumer($options);
|
147 |
+
$success = $curlConsumer->persist(array($msg));
|
148 |
+
if (!$success) {
|
149 |
+
//error_log("Creating Mixpanel Alias (original id: $original_id, new id: $new_id) failed");
|
150 |
+
//throw new Exception("Tried to create an alias but the call was not successful");
|
151 |
+
} else {
|
152 |
+
return $msg;
|
153 |
+
}
|
154 |
+
}
|
155 |
+
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Returns the "events" endpoint
|
159 |
+
* @return string
|
160 |
+
*/
|
161 |
+
function _getEndpoint() {
|
162 |
+
return $this->_options['events_endpoint'];
|
163 |
+
}
|
164 |
+
}
|
trunk/lib/mixpanel/Producers/MixpanelPeople.php
ADDED
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once(dirname(__FILE__) . "/MixpanelBaseProducer.php");
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Provides an API to create/update profiles on Mixpanel
|
6 |
+
*/
|
7 |
+
class Producers_MixpanelPeople extends Producers_MixpanelBaseProducer {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Internal method to prepare a message given the message data
|
11 |
+
* @param $distinct_id
|
12 |
+
* @param $operation
|
13 |
+
* @param $value
|
14 |
+
* @param null $ip
|
15 |
+
* @return array
|
16 |
+
*/
|
17 |
+
private function _constructPayload($distinct_id, $operation, $value, $ip = null) {
|
18 |
+
$payload = array(
|
19 |
+
'$token' => $this->_token,
|
20 |
+
'$distinct_id' => $distinct_id,
|
21 |
+
$operation => $value
|
22 |
+
);
|
23 |
+
if ($ip !== null) $payload['$ip'] = $ip;
|
24 |
+
return $payload;
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Set properties on a user record. If the profile does not exist, it creates it with these properties.
|
29 |
+
* If it does exist, it sets the properties to these values, overwriting existing values.
|
30 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
31 |
+
* @param array $props associative array of properties to set on the profile
|
32 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
33 |
+
*/
|
34 |
+
public function set($distinct_id, $props, $ip = null) {
|
35 |
+
$payload = $this->_constructPayload($distinct_id, '$set', $props, $ip);
|
36 |
+
$this->enqueue($payload);
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Set properties on a user record. If the profile does not exist, it creates it with these properties.
|
41 |
+
* If it does exist, it sets the properties to these values but WILL NOT overwrite existing values.
|
42 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
43 |
+
* @param array $props associative array of properties to set on the profile
|
44 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
45 |
+
*/
|
46 |
+
public function setOnce($distinct_id, $props, $ip = null) {
|
47 |
+
$payload = $this->_constructPayload($distinct_id, '$set_once', $props, $ip);
|
48 |
+
$this->enqueue($payload);
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Unset properties on a user record. If the profile does not exist, it creates it with no properties.
|
53 |
+
* If it does exist, it unsets these properties. NOTE: In other libraries we use 'unset' which is
|
54 |
+
* a reserved word in PHP.
|
55 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
56 |
+
* @param array $props associative array of properties to unset on the profile
|
57 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
58 |
+
*/
|
59 |
+
public function remove($distinct_id, $props, $ip = null) {
|
60 |
+
$payload = $this->_constructPayload($distinct_id, '$unset', $props, $ip);
|
61 |
+
$this->enqueue($payload);
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Increments the value of a property on a user record. If the profile does not exist, it creates it and sets the
|
66 |
+
* property to the increment value.
|
67 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
68 |
+
* @param $prop string the property to increment
|
69 |
+
* @param int $val the amount to increment the property by
|
70 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
71 |
+
*/
|
72 |
+
public function increment($distinct_id, $prop, $val, $ip = null) {
|
73 |
+
$payload = $this->_constructPayload($distinct_id, '$add', array("$prop" => $val), $ip);
|
74 |
+
$this->enqueue($payload);
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Adds $val to a list located at $prop. If the property does not exist, it will be created. If $val is a string
|
79 |
+
* and the list is empty or does not exist, a new list with one value will be created.
|
80 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
81 |
+
* @param string $prop the property that holds the list
|
82 |
+
* @param string|array $val items to add to the list
|
83 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
84 |
+
*/
|
85 |
+
public function append($distinct_id, $prop, $val, $ip = null) {
|
86 |
+
$operation = gettype($val) == "array" ? '$union' : '$append';
|
87 |
+
$payload = $this->_constructPayload($distinct_id, $operation, array("$prop" => $val), $ip);
|
88 |
+
$this->enqueue($payload);
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Adds a transaction to the user's profile for revenue tracking
|
93 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
94 |
+
* @param string $amount the transaction amount e.g. "20.50"
|
95 |
+
* @param null $timestamp the timestamp of when the transaction occurred (default to current timestamp)
|
96 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
97 |
+
*/
|
98 |
+
public function trackCharge($distinct_id, $amount, $timestamp = null, $ip = null) {
|
99 |
+
$timestamp = $timestamp == null ? time() : $timestamp;
|
100 |
+
$date_iso = date("c", $timestamp);
|
101 |
+
$transaction = array(
|
102 |
+
'$time' => $date_iso,
|
103 |
+
'$amount' => $amount
|
104 |
+
);
|
105 |
+
$val = array('$transactions' => $transaction);
|
106 |
+
$payload = $this->_constructPayload($distinct_id, '$append', $val, $ip);
|
107 |
+
$this->enqueue($payload);
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Clear all transactions stored on a user's profile
|
112 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
113 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
114 |
+
*/
|
115 |
+
public function clearCharges($distinct_id, $ip = null) {
|
116 |
+
$payload = $this->_constructPayload($distinct_id, '$set', array('$transactions' => array()), $ip);
|
117 |
+
$this->enqueue($payload);
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* Delete this profile from Mixpanel
|
122 |
+
* @param string|int $distinct_id the distinct_id or alias of a user
|
123 |
+
* @param string|null $ip the ip address of the client (used for geo-location)
|
124 |
+
*/
|
125 |
+
public function deleteUser($distinct_id, $ip = null) {
|
126 |
+
$payload = $this->_constructPayload($distinct_id, '$delete', "", $ip);
|
127 |
+
$this->enqueue($payload);
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Returns the "engage" endpoint
|
132 |
+
* @return string
|
133 |
+
*/
|
134 |
+
function _getEndpoint() {
|
135 |
+
return $this->_options['people_endpoint'];
|
136 |
+
}
|
137 |
+
|
138 |
+
}
|
trunk/power-ups/contacts.php
ADDED
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Power-up Name: Visitor Tracking
|
4 |
+
* Power-up Class: WPLeadInContacts
|
5 |
+
* Power-up Menu Text: Contacts
|
6 |
+
* Power-up Menu Link: contacts
|
7 |
+
* Power-up Slug: contacts
|
8 |
+
* Power-up URI: http://leadin.com/
|
9 |
+
* Power-up Description: Get an in-depth history of each contact in your database.
|
10 |
+
* Power-up Icon: powerup-icon-leads
|
11 |
+
* Power-up Icon Small: powerup-icon-leads
|
12 |
+
* First Introduced: 0.4.7
|
13 |
+
* Power-up Tags: Lead Tracking
|
14 |
+
* Auto Activate: Yes
|
15 |
+
* Permanently Enabled: Yes
|
16 |
+
*/
|
17 |
+
|
18 |
+
//=============================================
|
19 |
+
// Define Constants
|
20 |
+
//=============================================
|
21 |
+
|
22 |
+
if ( !defined('LEADIN_CONTACTS_PATH') )
|
23 |
+
define('LEADIN_CONTACTS_PATH', LEADIN_PATH . '/power-ups/contacts');
|
24 |
+
|
25 |
+
if ( !defined('LEADIN_CONTACTS_PLUGIN_DIR') )
|
26 |
+
define('LEADIN_CONTACTS_PLUGIN_DIR', LEADIN_PLUGIN_DIR . '/power-ups/contacts');
|
27 |
+
|
28 |
+
if ( !defined('LEADIN_CONTACTS_PLUGIN_SLUG') )
|
29 |
+
define('LEADIN_CONTACTS_PLUGIN_SLUG', basename(dirname(__FILE__)));
|
30 |
+
|
31 |
+
//=============================================
|
32 |
+
// Include Needed Files
|
33 |
+
//=============================================
|
34 |
+
|
35 |
+
require_once(LEADIN_CONTACTS_PLUGIN_DIR . '/admin/contacts-admin.php');
|
36 |
+
|
37 |
+
//=============================================
|
38 |
+
// WPLeadIn Class
|
39 |
+
//=============================================
|
40 |
+
class WPLeadInContacts extends WPLeadIn {
|
41 |
+
|
42 |
+
var $admin;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Class constructor
|
46 |
+
*/
|
47 |
+
function __construct ( $activated )
|
48 |
+
{
|
49 |
+
//=============================================
|
50 |
+
// Hooks & Filters
|
51 |
+
//=============================================
|
52 |
+
|
53 |
+
if ( ! $activated )
|
54 |
+
return false;
|
55 |
+
|
56 |
+
add_action('admin_print_scripts', array(&$this, 'add_leadin_contacts_admin_scripts'));
|
57 |
+
}
|
58 |
+
|
59 |
+
public function admin_init ( )
|
60 |
+
{
|
61 |
+
$admin_class = get_class($this) . 'Admin';
|
62 |
+
$this->admin = new $admin_class();
|
63 |
+
}
|
64 |
+
|
65 |
+
function power_up_setup_callback ( )
|
66 |
+
{
|
67 |
+
$this->admin->power_up_setup_callback();
|
68 |
+
}
|
69 |
+
|
70 |
+
//=============================================
|
71 |
+
// Scripts & Styles
|
72 |
+
//=============================================
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Adds admin javascript
|
76 |
+
*/
|
77 |
+
function add_leadin_contacts_admin_scripts ()
|
78 |
+
{
|
79 |
+
global $pagenow;
|
80 |
+
|
81 |
+
if ( $pagenow == 'admin.php' && isset($_GET['page']) && strstr($_GET['page'], "leadin") )
|
82 |
+
{
|
83 |
+
wp_register_script('leadin-contacts-admin-js', LEADIN_CONTACTS_PATH . '/admin/js/leadin-contacts-admin.js', array ( 'jquery' ), FALSE, TRUE);
|
84 |
+
wp_enqueue_script('leadin-contacts-admin-js');
|
85 |
+
}
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
//=============================================
|
90 |
+
// LeadIn Init
|
91 |
+
//=============================================
|
92 |
+
|
93 |
+
global $leadin_contacts;
|
94 |
+
//$leadin_contacts = new WPLeadInContacts();
|
95 |
+
|
96 |
+
?>
|
trunk/power-ups/contacts/admin/contacts-admin.php
ADDED
@@ -0,0 +1,385 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
//=============================================
|
4 |
+
// Include Needed Files
|
5 |
+
//=============================================
|
6 |
+
|
7 |
+
|
8 |
+
//=============================================
|
9 |
+
// WPLeadInAdmin Class
|
10 |
+
//=============================================
|
11 |
+
class WPLeadInContactsAdmin extends WPLeadInAdmin {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Class constructor
|
15 |
+
*/
|
16 |
+
function __construct ()
|
17 |
+
{
|
18 |
+
//=============================================
|
19 |
+
// Hooks & Filters
|
20 |
+
//=============================================
|
21 |
+
|
22 |
+
if ( is_admin() )
|
23 |
+
{
|
24 |
+
add_action('admin_print_scripts', array(&$this, 'add_leadin_admin_scripts'));
|
25 |
+
}
|
26 |
+
}
|
27 |
+
|
28 |
+
//=============================================
|
29 |
+
// Settings Page
|
30 |
+
//=============================================
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Creates settings page
|
34 |
+
*/
|
35 |
+
function power_up_setup_callback ()
|
36 |
+
{
|
37 |
+
WPLeadInContactsAdmin::leadin_contacts_page();
|
38 |
+
}
|
39 |
+
|
40 |
+
|
41 |
+
//=============================================
|
42 |
+
// Contacts Page
|
43 |
+
//=============================================
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Shared functionality between contact views
|
47 |
+
*/
|
48 |
+
function leadin_contacts_page ()
|
49 |
+
{
|
50 |
+
global $wp_version;
|
51 |
+
|
52 |
+
$action = $this->leadin_current_action();
|
53 |
+
if ( $action == 'delete' )
|
54 |
+
{
|
55 |
+
$lead_id = ( isset($_GET['lead']) ? absint($_GET['lead']) : FALSE );
|
56 |
+
$this->delete_lead($lead_id);
|
57 |
+
}
|
58 |
+
|
59 |
+
echo '<div id="leadin" class="wrap '. ( $wp_version < 3.8 && !is_plugin_active('mp6/mp6.php') ? 'pre-mp6' : ''). '">';
|
60 |
+
|
61 |
+
if ( $action != 'view' ) {
|
62 |
+
leadin_track_plugin_activity("Loaded Contact List Page");
|
63 |
+
$this->leadin_render_list_page();
|
64 |
+
}
|
65 |
+
else {
|
66 |
+
leadin_track_plugin_activity("Loaded Contact Detail Page");
|
67 |
+
$this->leadin_render_contact_detail($_GET['lead']);
|
68 |
+
}
|
69 |
+
|
70 |
+
$this->leadin_footer();
|
71 |
+
|
72 |
+
echo '</div>';
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* GET and set url actions into readable strings
|
77 |
+
* @return string if actions are set, bool if no actions set
|
78 |
+
*/
|
79 |
+
function leadin_current_action ()
|
80 |
+
{
|
81 |
+
if ( isset($_REQUEST['action']) && -1 != $_REQUEST['action'] )
|
82 |
+
return $_REQUEST['action'];
|
83 |
+
|
84 |
+
if ( isset($_REQUEST['action2']) && -1 != $_REQUEST['action2'] )
|
85 |
+
return $_REQUEST['action2'];
|
86 |
+
|
87 |
+
return FALSE;
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Creates view a contact's deteails + timeline history
|
92 |
+
*
|
93 |
+
* @param int
|
94 |
+
*/
|
95 |
+
function leadin_render_contact_detail ( $lead_id )
|
96 |
+
{
|
97 |
+
$li_contact = new LI_Contact();
|
98 |
+
$li_contact->set_hashkey_by_id($lead_id);
|
99 |
+
$li_contact->get_contact_history();
|
100 |
+
|
101 |
+
$lead_email = $li_contact->history->lead->lead_email;
|
102 |
+
|
103 |
+
echo '<a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=leadin_contacts">← All Contacts</a>';
|
104 |
+
|
105 |
+
echo '<div class="header-wrap">';
|
106 |
+
echo '<img height="40px" width="40px" src="https://app.getsignals.com/avatar/image/?emails=' . $lead_email . '" />';
|
107 |
+
echo '<h1 class="contact-name">' . $lead_email . '</h1>';
|
108 |
+
echo '</div>';
|
109 |
+
|
110 |
+
echo '<div id="col-container">';
|
111 |
+
|
112 |
+
echo '<div id="col-right">';
|
113 |
+
echo '<h2>Contact History</h2>';
|
114 |
+
echo '<div class="col-wrap contact-history">';
|
115 |
+
echo '<ul class="sessions">';
|
116 |
+
$sessions = array_reverse($li_contact->history->sessions);
|
117 |
+
foreach ( $sessions as &$session )
|
118 |
+
{
|
119 |
+
$first_event = array_values($session['events']);
|
120 |
+
$first_event_date = $first_event[0]['activities'][0]['event_date'];
|
121 |
+
$session_date = date('M j', strtotime($first_event_date));
|
122 |
+
$session_start_time = date('g:i a', strtotime($first_event_date));
|
123 |
+
|
124 |
+
$last_event = end($session['events']);
|
125 |
+
$last_activity = end($last_event['activities']);
|
126 |
+
$session_end_time = date('g:i a', strtotime($last_activity['event_date']));
|
127 |
+
|
128 |
+
if ( $session_end_time != $session_start_time )
|
129 |
+
$session_time_range = $session_start_time . ' - ' . $session_end_time;
|
130 |
+
else
|
131 |
+
$session_time_range = $session_start_time;
|
132 |
+
|
133 |
+
echo '<li class="session">';
|
134 |
+
echo '<h3 class="session-date">' . $session_date . '<span class="event-time-range">' . $session_time_range . '</span></h3>';
|
135 |
+
|
136 |
+
echo '<ul class="events">';
|
137 |
+
|
138 |
+
$events = $session['events'];
|
139 |
+
foreach ( $events as &$event )
|
140 |
+
{
|
141 |
+
if ( $event['event_type'] == 'pageview' )
|
142 |
+
{
|
143 |
+
$pageview = $event['activities'][0];
|
144 |
+
|
145 |
+
if ( $pageview['event_date'] == $first_event_date )
|
146 |
+
{
|
147 |
+
echo '<li class="event source">';
|
148 |
+
echo '<p class="event-title">Traffic Source: ' . ( $pageview['pageview_source'] ? '<a href="' . $pageview['pageview_source'] . '">' . $pageview['pageview_source'] : 'Direct' ) . '</a></p>';
|
149 |
+
echo '</li>';
|
150 |
+
}
|
151 |
+
|
152 |
+
|
153 |
+
echo '<li class="event pageview">';
|
154 |
+
echo '<p class="event-title">' . $pageview['pageview_title'] . '<span class="event-time-range">' . date('g:ia', strtotime($pageview['event_date'])) . '</span></p>';
|
155 |
+
echo '<a class="pageview-url" href="' . $pageview['pageview_url'] . '">' . $pageview['pageview_url'] . '</a>';
|
156 |
+
echo '</li>';
|
157 |
+
}
|
158 |
+
else if ( $event['event_type'] == 'form' )
|
159 |
+
{
|
160 |
+
$submission = $event['activities'][0];
|
161 |
+
|
162 |
+
$form_fields = json_decode(stripslashes($submission['form_fields']));
|
163 |
+
$num_form_fieds = count($form_fields);
|
164 |
+
|
165 |
+
echo '<li class="event form-submission">';
|
166 |
+
echo '<p class="event-title">Filled out form on page <a href="' . $submission['form_page_url'] . '">' . $submission['form_page_title'] . '</a><span class="event-time-range">' . date('g:ia', strtotime($submission['event_date'])) . '</span></p>';
|
167 |
+
echo '<ul class="event-detail fields">';
|
168 |
+
foreach ( $form_fields as $field )
|
169 |
+
{
|
170 |
+
echo '<li class="field">';
|
171 |
+
echo '<label class="field-label">' . $field->label . ':</label>';
|
172 |
+
echo '<p class="field-value">' . $field->value . '</p>';
|
173 |
+
echo '</li>';
|
174 |
+
}
|
175 |
+
echo '</ul>';
|
176 |
+
echo '</li>';
|
177 |
+
}
|
178 |
+
}
|
179 |
+
echo '</ul>';
|
180 |
+
echo '</li>';
|
181 |
+
}
|
182 |
+
echo '</ul>';
|
183 |
+
echo '</div>';
|
184 |
+
echo '</div>';
|
185 |
+
|
186 |
+
echo '<div id="col-left" class="metabox-holder">';
|
187 |
+
echo '<div class="col-wrap">';
|
188 |
+
echo '<div class="contact-info postbox">';
|
189 |
+
echo '<h3>Contact Information</h3>';
|
190 |
+
echo '<div class="inside">';
|
191 |
+
echo '<p><label>Email:</label> <a href="mailto:' . $lead_email . '">' . $lead_email . '</a></p>';
|
192 |
+
echo '<p><label>Status:</label> ' . $li_contact->history->lead->lead_status . '</p>';
|
193 |
+
echo '<p><label>Original referrer:</label> <a href="' . $li_contact->history->lead->lead_source . '">' . $li_contact->history->lead->lead_source . '</a></p>';
|
194 |
+
echo '<p><label>First visit:</label> ' . self::date_format_contact_stat($li_contact->history->lead->first_visit) . '</p>';
|
195 |
+
echo '<p><label>Last Visit:</label> ' . self::date_format_contact_stat($li_contact->history->lead->last_visit) . '</p>';
|
196 |
+
echo '<p><label>Total Visits:</label> ' . $li_contact->history->lead->total_visits . '</p>';
|
197 |
+
echo '<p><label>Total Pageviews:</label> ' . $li_contact->history->lead->total_pageviews . '</p>';
|
198 |
+
echo '<p><label>First submission:</label> ' . self::date_format_contact_stat($li_contact->history->lead->first_submission) . '</p>';
|
199 |
+
echo '<p><label>Last submission:</label> ' . self::date_format_contact_stat($li_contact->history->lead->last_submission) . '</p>';
|
200 |
+
echo '<p><label>Total submissions:</label> ' . $li_contact->history->lead->total_submissions . '</p>';
|
201 |
+
echo '</div>';
|
202 |
+
echo '</div>';
|
203 |
+
echo '</div>';
|
204 |
+
echo '</div>';
|
205 |
+
|
206 |
+
echo '</div>';
|
207 |
+
}
|
208 |
+
|
209 |
+
|
210 |
+
/**
|
211 |
+
* Creates list table for Contacts page
|
212 |
+
*
|
213 |
+
*/
|
214 |
+
function leadin_render_list_page ()
|
215 |
+
{
|
216 |
+
global $wp_version;
|
217 |
+
|
218 |
+
//Create an instance of our package class...
|
219 |
+
$leadinListTable = new LI_List_table();
|
220 |
+
|
221 |
+
//Fetch, prepare, sort, and filter our data...
|
222 |
+
$leadinListTable->data = $leadinListTable->get_leads();
|
223 |
+
$leadinListTable->prepare_items();
|
224 |
+
|
225 |
+
?>
|
226 |
+
|
227 |
+
<?php
|
228 |
+
$this->leadin_header('LeadIn Contacts');
|
229 |
+
|
230 |
+
$current_view = $leadinListTable->get_view();
|
231 |
+
|
232 |
+
if ( $current_view == 'lead' )
|
233 |
+
$view_label = 'Leads';
|
234 |
+
else if ( $current_view == 'comment' )
|
235 |
+
$view_label = 'Commenters';
|
236 |
+
else if ( $current_view == 'subscribe' )
|
237 |
+
$view_label = 'Subscribers';
|
238 |
+
else
|
239 |
+
$view_label = 'Contacts';
|
240 |
+
?>
|
241 |
+
|
242 |
+
<!-- Forms are NOT created automatically, so you need to wrap the table in one to use features like bulk actions -->
|
243 |
+
<form id="leadin-contacts" method="GET">
|
244 |
+
<?php $leadinListTable->views(); ?>
|
245 |
+
|
246 |
+
<!-- For plugins, we also need to ensure that the form posts back to our current page -->
|
247 |
+
<input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
|
248 |
+
|
249 |
+
<!-- Now we can render the completed list table -->
|
250 |
+
<?php $leadinListTable->display() ?>
|
251 |
+
</form>
|
252 |
+
|
253 |
+
<form id="export-form" name="export-form" method="POST">
|
254 |
+
<p class="submit">
|
255 |
+
<?php if ( !isset($_GET['contact_type']) ) : ?>
|
256 |
+
<input type="submit" value="<?php esc_attr_e('Export All Contacts'); ?>" name="export-all" id="leadin-export-leads" class="button button-primary">
|
257 |
+
<?php endif; ?>
|
258 |
+
<input type="submit" value="<?php esc_attr_e('Export Selected ' . $view_label ); ?>" name="export-selected" id="leadin-export-selected-leads" class="button button-primary" disabled>
|
259 |
+
<input type="hidden" id="leadin-selected-contacts" name="leadin-selected-contacts" value=""/>
|
260 |
+
</p>
|
261 |
+
</form>
|
262 |
+
|
263 |
+
<?php
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Deletes all rows from li_leads, li_pageviews and li_submissions for a given lead
|
268 |
+
*
|
269 |
+
* @param int
|
270 |
+
* @return bool
|
271 |
+
*/
|
272 |
+
function delete_lead ( $lead_id )
|
273 |
+
{
|
274 |
+
global $wpdb;
|
275 |
+
|
276 |
+
$q = $wpdb->prepare("SELECT hashkey FROM li_leads WHERE lead_id = %d", $lead_id);
|
277 |
+
$lead_hash = $wpdb->get_var($q);
|
278 |
+
|
279 |
+
$q = $wpdb->prepare("DELETE FROM li_pageviews WHERE lead_hashkey = %s", $lead_hash);
|
280 |
+
$delete_pageviews = $wpdb->query($q);
|
281 |
+
|
282 |
+
$q = $wpdb->prepare("DELETE FROM li_submissions WHERE lead_hashkey = %s", $lead_hash);
|
283 |
+
$delete_submissions = $wpdb->query($q);
|
284 |
+
|
285 |
+
$q = $wpdb->prepare("DELETE FROM li_leads WHERE lead_id = %d", $lead_id);
|
286 |
+
$delete_lead = $wpdb->query($q);
|
287 |
+
|
288 |
+
return $delete_lead;
|
289 |
+
}
|
290 |
+
|
291 |
+
|
292 |
+
//=============================================
|
293 |
+
// Admin Styles & Scripts
|
294 |
+
//=============================================
|
295 |
+
|
296 |
+
/**
|
297 |
+
* Adds admin javascript
|
298 |
+
*/
|
299 |
+
function add_leadin_admin_scripts ()
|
300 |
+
{
|
301 |
+
global $pagenow;
|
302 |
+
|
303 |
+
if ( $pagenow == 'admin.php' && isset($_GET['page']) && strstr($_GET['page'], "leadin") )
|
304 |
+
{
|
305 |
+
wp_register_script('leadin-admin-js', LEADIN_PATH . '/admin/js/leadin-admin.js', array ( 'jquery' ), FALSE, TRUE);
|
306 |
+
wp_enqueue_script('leadin-admin-js');
|
307 |
+
}
|
308 |
+
}
|
309 |
+
|
310 |
+
/**
|
311 |
+
* Formats any timestamp to format like Feb 4 8:43pm
|
312 |
+
*
|
313 |
+
* @param string
|
314 |
+
* @return string
|
315 |
+
*/
|
316 |
+
function date_format_contact_stat ( $timestamp )
|
317 |
+
{
|
318 |
+
return date('M j, Y g:i:a', strtotime($timestamp));
|
319 |
+
}
|
320 |
+
|
321 |
+
}
|
322 |
+
|
323 |
+
/** Export functionality for the contacts list */
|
324 |
+
if ( isset($_POST['export-all']) || isset($_POST['export-selected']) )
|
325 |
+
{
|
326 |
+
global $wpdb;
|
327 |
+
|
328 |
+
$sitename = sanitize_key(get_bloginfo('name'));
|
329 |
+
|
330 |
+
if ( ! empty($sitename) )
|
331 |
+
$sitename .= '.';
|
332 |
+
|
333 |
+
$filename = $sitename . '.contacts.' . date('Y-m-d-H-i-s') . '.csv';
|
334 |
+
|
335 |
+
header('Content-Description: File Transfer');
|
336 |
+
header('Content-Disposition: attachment; filename=' . $filename);
|
337 |
+
header('Content-Type: text/csv; charset=' . get_option('blog_charset'), TRUE);
|
338 |
+
|
339 |
+
$column_headers = array(
|
340 |
+
'Email', 'Original source', 'Status', 'Visits', 'Page views', 'Forms', 'Last visit', 'Created on'
|
341 |
+
);
|
342 |
+
|
343 |
+
$fields = array(
|
344 |
+
'lead_email', 'lead_source', 'lead_status', 'lead_visits', 'lead_pageviews', 'lead_form_submissions', 'last_visit', 'lead_date'
|
345 |
+
);
|
346 |
+
|
347 |
+
$headers = array();
|
348 |
+
foreach ( $column_headers as $key => $field )
|
349 |
+
{
|
350 |
+
$headers[] = '"' . $field . '"';
|
351 |
+
}
|
352 |
+
echo implode(',', $headers) . "\n";
|
353 |
+
|
354 |
+
$q = $wpdb->prepare("
|
355 |
+
SELECT
|
356 |
+
l.lead_id, LOWER(DATE_FORMAT(l.lead_date, %s)) AS lead_date, l.lead_ip, l.lead_source, l.lead_email, l.lead_status,
|
357 |
+
COUNT(DISTINCT s.form_id) AS lead_form_submissions,
|
358 |
+
COUNT(DISTINCT p.pageview_id) AS lead_pageviews,
|
359 |
+
(SELECT COUNT(DISTINCT p.pageview_id) FROM li_pageviews p WHERE l.hashkey = p.lead_hashkey AND p.pageview_session_start = 1) AS lead_visits,
|
360 |
+
LOWER(DATE_FORMAT(MAX(p.pageview_date), %s)) AS last_visit
|
361 |
+
FROM li_leads l
|
362 |
+
LEFT JOIN li_submissions s ON l.hashkey = s.lead_hashkey
|
363 |
+
LEFT JOIN li_pageviews p ON l.hashkey = p.lead_hashkey
|
364 |
+
WHERE l.lead_email != '' " .
|
365 |
+
( isset ($_POST['export-selected']) ? " AND l.lead_id IN ( " . $_POST['leadin-selected-contacts'] . " ) " : "" ) .
|
366 |
+
"GROUP BY l.lead_email ORDER BY l.lead_date DESC", '%Y/%m/%d %l:%i%p', '%Y/%m/%d %l:%i%p');
|
367 |
+
|
368 |
+
$leads = $wpdb->get_results($q);
|
369 |
+
|
370 |
+
foreach ( $leads as $contacts )
|
371 |
+
{
|
372 |
+
$data = array();
|
373 |
+
foreach ( $fields as $field )
|
374 |
+
{
|
375 |
+
$value = ( isset($contacts->{$field}) ? $contacts->{$field} : '' );
|
376 |
+
$value = ( is_array($value) ? serialize($value) : $value );
|
377 |
+
$data[] = '"' . str_replace('"', '""', $value) . '"';
|
378 |
+
}
|
379 |
+
echo implode(',', $data) . "\n";
|
380 |
+
}
|
381 |
+
|
382 |
+
exit;
|
383 |
+
}
|
384 |
+
|
385 |
+
?>
|
trunk/power-ups/contacts/admin/css/leadin-contacts-admin.css
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#leadin-subscribe-preview{
|
2 |
+
height: 300px;
|
3 |
+
border-radius: 5px 0 0 0;
|
4 |
+
font-family: "Helvetica Neue", sans-serif;
|
5 |
+
background: #f0f0f0;
|
6 |
+
color: #444444;
|
7 |
+
padding: 1em;
|
8 |
+
max-width: 100%;
|
9 |
+
width: 450px;
|
10 |
+
font-size: 1.1em;
|
11 |
+
line-height: 1.5em;
|
12 |
+
}
|
trunk/power-ups/contacts/admin/js/leadin-contacts-admin.js
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
jQuery(document).ready( function ( $ ) {
|
2 |
+
$('#leadin-contacts input:checkbox').not('thead input:checkbox, tfoot input:checkbox').bind('change', function ( e ){
|
3 |
+
var cb_count = 0;
|
4 |
+
var selected_vals = '';
|
5 |
+
var $btn_selected = $('#leadin-export-selected-leads');
|
6 |
+
var $input_selected_vals = $('#leadin-selected-contacts');
|
7 |
+
var $cb_selected = $('#leadin-contacts input:checkbox:checked').not('thead input:checkbox, tfoot input:checkbox');
|
8 |
+
|
9 |
+
if ( $cb_selected.length > 0 )
|
10 |
+
{
|
11 |
+
$btn_selected.attr('disabled', false);
|
12 |
+
}
|
13 |
+
else
|
14 |
+
{
|
15 |
+
$btn_selected.attr('disabled', true);
|
16 |
+
}
|
17 |
+
|
18 |
+
$cb_selected.each( function ( e ) {
|
19 |
+
selected_vals += $(this).val();
|
20 |
+
|
21 |
+
if ( cb_count != ($cb_selected.length-1) )
|
22 |
+
selected_vals += ',';
|
23 |
+
|
24 |
+
cb_count++;
|
25 |
+
});
|
26 |
+
|
27 |
+
$input_selected_vals.val(selected_vals);
|
28 |
+
});
|
29 |
+
|
30 |
+
$('#cb-select-all-1, #cb-select-all-2').bind('change', function ( e ) {
|
31 |
+
var cb_count = 0;
|
32 |
+
var selected_vals = '';
|
33 |
+
var $this = $(this);
|
34 |
+
var $btn_selected = $('#leadin-export-selected-leads');
|
35 |
+
var $cb_selected = $('#leadin-contacts input:checkbox').not('thead input:checkbox, tfoot input:checkbox');
|
36 |
+
var $input_selected_vals = $('#leadin-selected-contacts');
|
37 |
+
|
38 |
+
$cb_selected.each( function ( e ) {
|
39 |
+
selected_vals += $(this).val();
|
40 |
+
|
41 |
+
if ( cb_count != ($cb_selected.length-1) )
|
42 |
+
selected_vals += ',';
|
43 |
+
|
44 |
+
cb_count++;
|
45 |
+
});
|
46 |
+
|
47 |
+
$input_selected_vals.val(selected_vals);
|
48 |
+
|
49 |
+
if ( !$this.is(':checked') )
|
50 |
+
{
|
51 |
+
$btn_selected.attr('disabled', true);
|
52 |
+
}
|
53 |
+
else
|
54 |
+
{
|
55 |
+
$btn_selected.attr('disabled', false);
|
56 |
+
}
|
57 |
+
});
|
58 |
+
|
59 |
+
$('.postbox .handlediv').bind('click', function ( e ) {
|
60 |
+
var $postbox = $(this).parent();
|
61 |
+
|
62 |
+
if ( $postbox.hasClass('closed') )
|
63 |
+
{
|
64 |
+
$postbox.removeClass('closed');
|
65 |
+
}
|
66 |
+
else
|
67 |
+
{
|
68 |
+
$postbox.addClass('closed');
|
69 |
+
}
|
70 |
+
|
71 |
+
});
|
72 |
+
});
|
trunk/power-ups/contacts/images/powerup-icon-contacts@2x.png
ADDED
Binary file
|
trunk/power-ups/mailchimp-list-sync.php
ADDED
@@ -0,0 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Power-up Name: MailChimp List Sync
|
4 |
+
* Power-up Class: WPMailChimpListSync
|
5 |
+
* Power-up Menu Text:
|
6 |
+
* Power-up Slug: mailchimp_list_sync
|
7 |
+
* Power-up Menu Link: settings
|
8 |
+
* Power-up URI: http://leadin.com/mailchimp-list-sync
|
9 |
+
* Power-up Description: Sync your subscribers to a MailChimp email list.
|
10 |
+
* Power-up Icon: power-up-icon-mailchimp-list-sync
|
11 |
+
* Power-up Icon Small: power-up-icon-mailchimp-list-sync_small
|
12 |
+
* First Introduced: 0.7.0
|
13 |
+
* Power-up Tags: Newsletter, Email
|
14 |
+
* Auto Activate: No
|
15 |
+
*/
|
16 |
+
|
17 |
+
//=============================================
|
18 |
+
// Define Constants
|
19 |
+
//=============================================
|
20 |
+
|
21 |
+
if ( !defined('LEADIN_MAILCHIMP_LIST_SYNC_PATH') )
|
22 |
+
define('LEADIN_MAILCHIMP_LIST_SYNC_PATH', LEADIN_PATH . '/power-ups/mailchimp-list-sync');
|
23 |
+
|
24 |
+
if ( !defined('LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR') )
|
25 |
+
define('LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR', LEADIN_PLUGIN_DIR . '/power-ups/mailchimp-list-sync');
|
26 |
+
|
27 |
+
if ( !defined('LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_SLUG') )
|
28 |
+
define('LEADIN_MAILCHIMP_LIST_SYNC_SLUG', basename(dirname(__FILE__)));
|
29 |
+
|
30 |
+
//=============================================
|
31 |
+
// Include Needed Files
|
32 |
+
//=============================================
|
33 |
+
require_once(LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR . '/admin/mailchimp-list-sync-admin.php');
|
34 |
+
require_once(LEADIN_MAILCHIMP_LIST_SYNC_PLUGIN_DIR . '/inc/MailChimp-API.php');
|
35 |
+
|
36 |
+
//=============================================
|
37 |
+
// WPLeadIn Class
|
38 |
+
//=============================================
|
39 |
+
class WPMailChimpListSync extends WPLeadIn {
|
40 |
+
|
41 |
+
var $admin;
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Class constructor
|
45 |
+
*/
|
46 |
+
function __construct ( $activated )
|
47 |
+
{
|
48 |
+
//=============================================
|
49 |
+
// Hooks & Filters
|
50 |
+
//=============================================
|
51 |
+
|
52 |
+
if ( ! $activated )
|
53 |
+
return false;
|
54 |
+
|
55 |
+
global $leadin_mailchimp_list_sync_wp;
|
56 |
+
$leadin_mailchimp_list_sync_wp = $this;
|
57 |
+
|
58 |
+
}
|
59 |
+
|
60 |
+
public function admin_init ( )
|
61 |
+
{
|
62 |
+
$admin_class = get_class($this) . 'Admin';
|
63 |
+
$this->admin = new $admin_class($this->icon_small);
|
64 |
+
}
|
65 |
+
|
66 |
+
function power_up_setup_callback ( )
|
67 |
+
{
|
68 |
+
$this->admin->power_up_setup_callback();
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Activate the power-up
|
73 |
+
*/
|
74 |
+
function add_leadin_subscribe_defaults ()
|
75 |
+
{
|
76 |
+
$lis_options = get_option('leadin_subscribe_options');
|
77 |
+
|
78 |
+
if ( ($lis_options['li_susbscibe_installed'] != 1) || (!is_array($lis_options)) )
|
79 |
+
{
|
80 |
+
$opt = array(
|
81 |
+
'li_susbscibe_installed' => '1',
|
82 |
+
'li_subscribe_heading' => 'Sign up for my newsletter to get new posts by email'
|
83 |
+
);
|
84 |
+
|
85 |
+
update_option('leadin_subscribe_options', $opt);
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
function push_mailchimp_subscriber_to_list ( $email = '', $first_name = '', $last_name = '', $phone = '' )
|
90 |
+
{
|
91 |
+
$options = get_option('leadin_mls_options');
|
92 |
+
|
93 |
+
if ( isset($options['li_mls_api_key']) && $options['li_mls_api_key'] && isset($options['li_mls_subscribers_to_list']) && $options['li_mls_subscribers_to_list'] )
|
94 |
+
{
|
95 |
+
$MailChimp = new MailChimp($options['li_mls_api_key']);
|
96 |
+
|
97 |
+
$subscribe = $MailChimp->call("lists/subscribe", array(
|
98 |
+
"id" => $options['li_mls_subscribers_to_list'],
|
99 |
+
"email" => array( 'email' => $email),
|
100 |
+
"send_welcome" => FALSE,
|
101 |
+
"email_type" => 'html',
|
102 |
+
"update_existing" => TRUE,
|
103 |
+
'replace_interests' => FALSE,
|
104 |
+
'double_optin' => FALSE,
|
105 |
+
"merge_vars" => array(
|
106 |
+
'EMAIL' => $email,
|
107 |
+
'FNAME' => $first_name,
|
108 |
+
'LNAME' => $last_name,
|
109 |
+
'PHONE' => $phone
|
110 |
+
)
|
111 |
+
));
|
112 |
+
}
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
//=============================================
|
117 |
+
// Subscribe Widget Init
|
118 |
+
//=============================================
|
119 |
+
|
120 |
+
global $leadin_mailchimp_list_sync_wp;
|
121 |
+
|
122 |
+
?>
|
trunk/power-ups/mailchimp-list-sync/admin/mailchimp-list-sync-admin.php
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
//=============================================
|
3 |
+
// WPLeadInAdmin Class
|
4 |
+
//=============================================
|
5 |
+
class WPMailChimpListSyncAdmin extends WPLeadInAdmin {
|
6 |
+
|
7 |
+
var $power_up_settings_section = 'leadin_mls_options_section';
|
8 |
+
var $power_up_icon;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Class constructor
|
12 |
+
*/
|
13 |
+
function __construct ( $small_icon )
|
14 |
+
{
|
15 |
+
//=============================================
|
16 |
+
// Hooks & Filters
|
17 |
+
//=============================================
|
18 |
+
|
19 |
+
if ( is_admin() )
|
20 |
+
{
|
21 |
+
$this->power_up_icon = '<img src="' . LEADIN_PATH . '/images/' . $small_icon . '.png" class="power-up-settings-icon"/>';
|
22 |
+
add_action('admin_init', array($this, 'leadin_mls_build_settings_page'));
|
23 |
+
}
|
24 |
+
}
|
25 |
+
|
26 |
+
//=============================================
|
27 |
+
// Settings Page
|
28 |
+
//=============================================
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Creates settings options
|
32 |
+
*/
|
33 |
+
function leadin_mls_build_settings_page ()
|
34 |
+
{
|
35 |
+
$options = get_option('leadin_mls_options');
|
36 |
+
|
37 |
+
register_setting('leadin_settings_options', 'leadin_mls_options', array($this, 'sanitize'));
|
38 |
+
add_settings_section($this->power_up_settings_section, $this->power_up_icon . "MailChimp", '', LEADIN_ADMIN_PATH);
|
39 |
+
add_settings_field('li_mls_api_key', 'API key', array($this, 'li_mls_api_key_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
40 |
+
|
41 |
+
if ( isset($options['li_mls_api_key']) && $options['li_mls_api_key'] )
|
42 |
+
add_settings_field('li_mls_subscribers_to_list', 'Add subscribers to list', array($this, 'li_mls_subscribers_to_list_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Sanitize each setting field as needed
|
47 |
+
*
|
48 |
+
* @param array $input Contains all settings fields as array keys
|
49 |
+
*/
|
50 |
+
public function sanitize ( $input )
|
51 |
+
{
|
52 |
+
$new_input = array();
|
53 |
+
|
54 |
+
if( isset( $input['li_mls_api_key'] ) )
|
55 |
+
$new_input['li_mls_api_key'] = sanitize_text_field( $input['li_mls_api_key'] );
|
56 |
+
|
57 |
+
if( isset( $input['li_mls_subscribers_to_list'] ) )
|
58 |
+
$new_input['li_mls_subscribers_to_list'] = sanitize_text_field( $input['li_mls_subscribers_to_list'] );
|
59 |
+
|
60 |
+
return $new_input;
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Prints email input for settings page
|
65 |
+
*/
|
66 |
+
function li_mls_api_key_callback ()
|
67 |
+
{
|
68 |
+
$options = get_option('leadin_mls_options');
|
69 |
+
$li_mls_api_key = ( $options['li_mls_api_key'] ? $options['li_mls_api_key'] : '' ); // Get header from options, or show default
|
70 |
+
|
71 |
+
printf(
|
72 |
+
'<input id="li_mls_api_key" type="text" id="title" name="leadin_mls_options[li_mls_api_key]" value="%s" size="50"/>',
|
73 |
+
$li_mls_api_key
|
74 |
+
);
|
75 |
+
|
76 |
+
echo '<p><a href="http://admin.mailchimp.com/account/api/" target="_blank">Get an API key from MailChimp.com</a></p>';
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Prints email input for settings page
|
81 |
+
*/
|
82 |
+
function li_mls_subscribers_to_list_callback ()
|
83 |
+
{
|
84 |
+
$options = get_option('leadin_mls_options');
|
85 |
+
$li_mls_subscribers_to_list = ( isset($options['li_mls_subscribers_to_list']) ? $options['li_mls_subscribers_to_list'] : '' ); // Get header from options, or show default
|
86 |
+
|
87 |
+
$lists = $this->li_mls_get_mailchimp_lists($options['li_mls_api_key']);
|
88 |
+
|
89 |
+
echo '<select id="li_mls_subscribers_to_list" name="leadin_mls_options[li_mls_subscribers_to_list]" ' . ( ! count($lists['data']) ? 'disabled' : '' ) . '>';
|
90 |
+
|
91 |
+
if ( count($lists['data']) )
|
92 |
+
{
|
93 |
+
foreach ( $lists['data'] as $list )
|
94 |
+
{
|
95 |
+
$list_set = FALSE;
|
96 |
+
if ( $list['id'] == $li_mls_subscribers_to_list && !$list_set )
|
97 |
+
$list_set = TRUE;
|
98 |
+
|
99 |
+
echo '<option ' . ( $list['id'] == $li_mls_subscribers_to_list ? 'selected' : '' ) . ' value="' . $list['id'] . '">' . $list['name'] . '</option>';
|
100 |
+
|
101 |
+
if ( !$list_set )
|
102 |
+
echo '<option selected value="">No list set...</option>';
|
103 |
+
}
|
104 |
+
}
|
105 |
+
else
|
106 |
+
{
|
107 |
+
echo '<option value="No lists...">No lists...</option>';
|
108 |
+
}
|
109 |
+
|
110 |
+
echo '</select>';
|
111 |
+
|
112 |
+
echo '<p><a href="http://admin.mailchimp.com/lists/new-list/" target="_blank">Create a new list on MailChimp.com</a></p>';
|
113 |
+
}
|
114 |
+
|
115 |
+
function li_mls_get_mailchimp_lists ( $api_key )
|
116 |
+
{
|
117 |
+
$MailChimp = new MailChimp($api_key);
|
118 |
+
|
119 |
+
$lists = $MailChimp->call("lists/list", array(
|
120 |
+
"start" => 0, // optional, control paging of lists, start results at this list #, defaults to 1st page of data (page 0)
|
121 |
+
"limit" => 25, // optional, control paging of lists, number of lists to return with each call, defaults to 25 (max=100)
|
122 |
+
"sort_field" => "created", // optional, "created" (the created date, default) or "web" (the display order in the web app). Invalid values will fall back on "created" - case insensitive.
|
123 |
+
"sort_dir" => "DESC" // optional, "DESC" for descending (default), "ASC" for Ascending. Invalid values will fall back on "created" - case insensitive. Note: to get the exact display order as the web app you'd use "web" and "ASC"
|
124 |
+
));
|
125 |
+
|
126 |
+
return $lists;
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
?>
|
trunk/power-ups/mailchimp-list-sync/inc/MailChimp-API.php
ADDED
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Super-simple, minimum abstraction MailChimp API v2 wrapper
|
6 |
+
*
|
7 |
+
* Uses curl if available, falls back to file_get_contents and HTTP stream.
|
8 |
+
* This probably has more comments than code.
|
9 |
+
*
|
10 |
+
* Contributors:
|
11 |
+
* Michael Minor <me@pixelbacon.com>
|
12 |
+
* Lorna Jane Mitchell, github.com/lornajane
|
13 |
+
*
|
14 |
+
* @author Drew McLellan <drew.mclellan@gmail.com>
|
15 |
+
* @version 1.1.1
|
16 |
+
*/
|
17 |
+
class MailChimp
|
18 |
+
{
|
19 |
+
private $api_key;
|
20 |
+
private $api_endpoint = 'https://<dc>.api.mailchimp.com/2.0';
|
21 |
+
private $verify_ssl = false;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Create a new instance
|
25 |
+
* @param string $api_key Your MailChimp API key
|
26 |
+
*/
|
27 |
+
function __construct($api_key)
|
28 |
+
{
|
29 |
+
$this->api_key = $api_key;
|
30 |
+
list(, $datacentre) = explode('-', $this->api_key);
|
31 |
+
$this->api_endpoint = str_replace('<dc>', $datacentre, $this->api_endpoint);
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Call an API method. Every request needs the API key, so that is added automatically -- you don't need to pass it in.
|
36 |
+
* @param string $method The API method to call, e.g. 'lists/list'
|
37 |
+
* @param array $args An array of arguments to pass to the method. Will be json-encoded for you.
|
38 |
+
* @return array Associative array of json decoded API response.
|
39 |
+
*/
|
40 |
+
public function call($method, $args=array())
|
41 |
+
{
|
42 |
+
return $this->makeRequest($method, $args);
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Performs the underlying HTTP request. Not very exciting
|
47 |
+
* @param string $method The API method to be called
|
48 |
+
* @param array $args Assoc array of parameters to be passed
|
49 |
+
* @return array Assoc array of decoded result
|
50 |
+
*/
|
51 |
+
private function makeRequest($method, $args=array())
|
52 |
+
{
|
53 |
+
$args['apikey'] = $this->api_key;
|
54 |
+
|
55 |
+
$url = $this->api_endpoint.'/'.$method.'.json';
|
56 |
+
|
57 |
+
if (function_exists('curl_init') && function_exists('curl_setopt')){
|
58 |
+
$ch = curl_init();
|
59 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
60 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
|
61 |
+
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
|
62 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
63 |
+
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
64 |
+
curl_setopt($ch, CURLOPT_POST, true);
|
65 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->verify_ssl);
|
66 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($args));
|
67 |
+
$result = curl_exec($ch);
|
68 |
+
curl_close($ch);
|
69 |
+
} else {
|
70 |
+
$json_data = json_encode($args);
|
71 |
+
$result = file_get_contents($url, null, stream_context_create(array(
|
72 |
+
'http' => array(
|
73 |
+
'protocol_version' => 1.1,
|
74 |
+
'user_agent' => 'PHP-MCAPI/2.0',
|
75 |
+
'method' => 'POST',
|
76 |
+
'header' => "Content-type: application/json\r\n".
|
77 |
+
"Connection: close\r\n" .
|
78 |
+
"Content-length: " . strlen($json_data) . "\r\n",
|
79 |
+
'content' => $json_data,
|
80 |
+
),
|
81 |
+
)));
|
82 |
+
}
|
83 |
+
|
84 |
+
return $result ? json_decode($result, true) : false;
|
85 |
+
}
|
86 |
+
}
|
trunk/power-ups/subscribe-widget.php
ADDED
@@ -0,0 +1,145 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Power-up Name: Subscribe Pop-up
|
4 |
+
* Power-up Class: WPLeadInSubscribe
|
5 |
+
* Power-up Menu Text:
|
6 |
+
* Power-up Slug: subscribe_widget
|
7 |
+
* Power-up Menu Link: settings
|
8 |
+
* Power-up URI: http://leadin.com/pop-subscribe-form-plugin-wordpress
|
9 |
+
* Power-up Description: Convert more email subscribers with our pop-up.
|
10 |
+
* Power-up Icon: powerup-icon-subscribe
|
11 |
+
* Power-up Icon Small: powerup-icon-subscribe
|
12 |
+
* First Introduced: 0.4.7
|
13 |
+
* Power-up Tags: Lead Generation
|
14 |
+
* Auto Activate: Yes
|
15 |
+
*/
|
16 |
+
|
17 |
+
//=============================================
|
18 |
+
// Define Constants
|
19 |
+
//=============================================
|
20 |
+
|
21 |
+
if ( !defined('LEADIN_SUBSCRIBE_WIDGET_PATH') )
|
22 |
+
define('LEADIN_SUBSCRIBE_WIDGET_PATH', LEADIN_PATH . '/power-ups/subscribe-widget');
|
23 |
+
|
24 |
+
if ( !defined('LEADIN_SUBSCRIBE_WIDGET_PLUGIN_DIR') )
|
25 |
+
define('LEADIN_SUBSCRIBE_WIDGET_PLUGIN_DIR', LEADIN_PLUGIN_DIR . '/power-ups/subscribe-widget');
|
26 |
+
|
27 |
+
if ( !defined('LEADIN_SUBSCRIBE_WIDGET_PLUGIN_SLUG') )
|
28 |
+
define('LEADIN_SUBSCRIBE_PLUGIN_SLUG', basename(dirname(__FILE__)));
|
29 |
+
|
30 |
+
//=============================================
|
31 |
+
// Include Needed Files
|
32 |
+
//=============================================
|
33 |
+
require_once(LEADIN_SUBSCRIBE_WIDGET_PLUGIN_DIR . '/admin/subscribe-widget-admin.php');
|
34 |
+
|
35 |
+
//=============================================
|
36 |
+
// WPLeadIn Class
|
37 |
+
//=============================================
|
38 |
+
class WPLeadInSubscribe extends WPLeadIn {
|
39 |
+
|
40 |
+
var $admin;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Class constructor
|
44 |
+
*/
|
45 |
+
function __construct ( $activated )
|
46 |
+
{
|
47 |
+
//=============================================
|
48 |
+
// Hooks & Filters
|
49 |
+
//=============================================
|
50 |
+
|
51 |
+
if ( ! $activated )
|
52 |
+
return false;
|
53 |
+
|
54 |
+
add_filter('init', array($this, 'add_leadin_subscribe_frontend_scripts_and_styles'));
|
55 |
+
|
56 |
+
add_action('get_footer', array(&$this, 'append_leadin_subscribe_settings'));
|
57 |
+
}
|
58 |
+
|
59 |
+
public function admin_init ( )
|
60 |
+
{
|
61 |
+
$admin_class = get_class($this) . 'Admin';
|
62 |
+
$this->admin = new $admin_class($this->icon);
|
63 |
+
}
|
64 |
+
|
65 |
+
function power_up_setup_callback ( )
|
66 |
+
{
|
67 |
+
$this->admin->power_up_setup_callback();
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Activate the power-up
|
72 |
+
*/
|
73 |
+
function add_leadin_subscribe_defaults ()
|
74 |
+
{
|
75 |
+
$lis_options = get_option('leadin_subscribe_options');
|
76 |
+
|
77 |
+
if ( ($lis_options['li_susbscibe_installed'] != 1) || (!is_array($lis_options)) )
|
78 |
+
{
|
79 |
+
$opt = array(
|
80 |
+
'li_susbscibe_installed' => '1',
|
81 |
+
'li_subscribe_vex_class' => 'vex-theme-bottom-right-corner',
|
82 |
+
'li_subscribe_heading' => 'Sign up for my newsletter to get new posts by email',
|
83 |
+
'li_subscribe_btn_label' => 'SUBSCRIBE'
|
84 |
+
|
85 |
+
);
|
86 |
+
|
87 |
+
update_option('leadin_subscribe_options', $opt);
|
88 |
+
}
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Adds a hidden input at the end of the content containing the ouput of the location, heading, and button text options
|
93 |
+
*
|
94 |
+
* @return
|
95 |
+
*/
|
96 |
+
function append_leadin_subscribe_settings ()
|
97 |
+
{
|
98 |
+
$lis_options = get_option('leadin_subscribe_options');
|
99 |
+
|
100 |
+
// Heading for the subscribe plugin
|
101 |
+
echo '<input id="leadin-subscribe-vex-class" value="' . ( isset($lis_options['li_subscribe_vex_class']) ? $lis_options['li_subscribe_vex_class'] : 'vex-theme-bottom-right-corner' ) . '" type="hidden"/>';
|
102 |
+
echo '<input id="leadin-subscribe-heading" value="' . ( isset($lis_options['li_subscribe_heading']) ? $lis_options['li_subscribe_heading'] : 'Sign up for my newsletter to get new posts by email' ) . '" type="hidden"/>';
|
103 |
+
echo '<input id="leadin-subscribe-btn-label" value="' . ( isset($lis_options['li_subscribe_btn_label']) ? $lis_options['li_subscribe_btn_label'] : 'SUBSCRIBE' ) . '" type="hidden"/>';
|
104 |
+
|
105 |
+
// Div checked by media query for mobile
|
106 |
+
echo '<span id="leadin-subscribe-mobile-check"></span>';
|
107 |
+
}
|
108 |
+
|
109 |
+
//=============================================
|
110 |
+
// Scripts & Styles
|
111 |
+
//=============================================
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Adds front end javascript + initializes ajax object
|
115 |
+
*/
|
116 |
+
function add_leadin_subscribe_frontend_scripts_and_styles ()
|
117 |
+
{
|
118 |
+
global $pagenow;
|
119 |
+
|
120 |
+
if ( !is_admin() && $pagenow != 'wp-login.php' )
|
121 |
+
{
|
122 |
+
wp_register_script('leadin-subscribe', LEADIN_SUBSCRIBE_WIDGET_PATH . '/frontend/js/leadin-subscribe.js', array ('jquery', 'leadin'), false, true);
|
123 |
+
wp_register_script('vex', LEADIN_SUBSCRIBE_WIDGET_PATH . '/frontend/js/vex.js', array ('jquery', 'leadin'), false, true);
|
124 |
+
wp_register_script('vex-dialog', LEADIN_SUBSCRIBE_WIDGET_PATH . '/frontend/js/vex.dialog.js', array ('jquery', 'leadin'), false, true);
|
125 |
+
|
126 |
+
wp_enqueue_script('leadin-subscribe');
|
127 |
+
wp_enqueue_script('vex');
|
128 |
+
wp_enqueue_script('vex-dialog');
|
129 |
+
|
130 |
+
wp_register_style('leadin-subscribe-vex-css', LEADIN_SUBSCRIBE_WIDGET_PATH . '/frontend/css/vex.css');
|
131 |
+
|
132 |
+
wp_enqueue_style('leadin-subscribe-vex-css');
|
133 |
+
|
134 |
+
//wp_localize_script('leadin', 'li_ajax', array('ajax_url' => admin_url('admin-ajax.php')));
|
135 |
+
}
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
//=============================================
|
140 |
+
// Subscribe Widget Init
|
141 |
+
//=============================================
|
142 |
+
|
143 |
+
global $leadin_subscribe_wp;
|
144 |
+
|
145 |
+
?>
|
trunk/power-ups/subscribe-widget/admin/subscribe-widget-admin.php
ADDED
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
//=============================================
|
4 |
+
// Include Needed Files
|
5 |
+
//=============================================
|
6 |
+
|
7 |
+
|
8 |
+
//=============================================
|
9 |
+
// WPLeadInAdmin Class
|
10 |
+
//=============================================
|
11 |
+
class WPLeadInSubscribeAdmin extends WPLeadInAdmin {
|
12 |
+
|
13 |
+
var $power_up_settings_section = 'leadin_subscribe_options_section';
|
14 |
+
var $power_up_icon;
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Class constructor
|
18 |
+
*/
|
19 |
+
function __construct ( $power_up_icon )
|
20 |
+
{
|
21 |
+
//=============================================
|
22 |
+
// Hooks & Filters
|
23 |
+
//=============================================
|
24 |
+
|
25 |
+
if ( is_admin() )
|
26 |
+
{
|
27 |
+
$this->power_up_icon = '<span class="dashicons dashicons-email-alt"></span>';
|
28 |
+
add_action('admin_init', array($this, 'leadin_subscribe_build_settings_page'));
|
29 |
+
}
|
30 |
+
}
|
31 |
+
|
32 |
+
//=============================================
|
33 |
+
// Settings Page
|
34 |
+
//=============================================
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Creates settings options
|
38 |
+
*/
|
39 |
+
function leadin_subscribe_build_settings_page ()
|
40 |
+
{
|
41 |
+
register_setting('leadin_settings_options', 'leadin_subscribe_options', array($this, 'sanitize'));
|
42 |
+
|
43 |
+
add_settings_section($this->power_up_settings_section, $this->power_up_icon . 'Subscribe Pop-up', '', LEADIN_ADMIN_PATH);
|
44 |
+
add_settings_field('li_subscribe_vex_class', 'Pop-up Location', array($this, 'li_subscribe_vex_class_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
45 |
+
add_settings_field('li_subscribe_heading', 'Pop-up header text', array($this, 'li_subscribe_heading_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
46 |
+
add_settings_field('li_subscribe_btn_label', 'Button text', array($this, 'li_subscribe_btn_label_callback'), LEADIN_ADMIN_PATH, $this->power_up_settings_section);
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Sanitize each setting field as needed
|
51 |
+
*
|
52 |
+
* @param array $input Contains all settings fields as array keys
|
53 |
+
*/
|
54 |
+
public function sanitize ( $input )
|
55 |
+
{
|
56 |
+
$new_input = array();
|
57 |
+
|
58 |
+
if( isset( $input['li_subscribe_vex_class'] ) )
|
59 |
+
$new_input['li_subscribe_vex_class'] = sanitize_text_field( $input['li_subscribe_vex_class'] );
|
60 |
+
|
61 |
+
if( isset( $input['li_subscribe_heading'] ) )
|
62 |
+
$new_input['li_subscribe_heading'] = sanitize_text_field( $input['li_subscribe_heading'] );
|
63 |
+
|
64 |
+
if( isset( $input['li_subscribe_btn_label'] ) )
|
65 |
+
$new_input['li_subscribe_btn_label'] = sanitize_text_field( $input['li_subscribe_btn_label'] );
|
66 |
+
|
67 |
+
return $new_input;
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Prints subscribe location input for settings page
|
72 |
+
*/
|
73 |
+
function li_subscribe_vex_class_callback ()
|
74 |
+
{
|
75 |
+
$options = get_option('leadin_subscribe_options');
|
76 |
+
$li_subscribe_vex_class = ( $options['li_subscribe_vex_class'] ? $options['li_subscribe_vex_class'] : 'vex-theme-bottom-right-corner' ); // Get class from options, or show default
|
77 |
+
|
78 |
+
echo '<select id="li_subscribe_vex_class" name="leadin_subscribe_options[li_subscribe_vex_class]">';
|
79 |
+
echo '<option value="vex-theme-bottom-right-corner"' . ( $li_subscribe_vex_class == 'vex-theme-bottom-right-corner' ? ' selected' : '' ) . '>Bottom right</option>';
|
80 |
+
echo '<option value="vex-theme-bottom-left-corner"' . ( $li_subscribe_vex_class == 'vex-theme-bottom-left-corner' ? ' selected' : '' ) . '>Bottom Left</option>';
|
81 |
+
echo '<option value="vex-theme-top"' . ( $li_subscribe_vex_class == 'vex-theme-top' ? ' selected' : '' ) . '>Top</option>';
|
82 |
+
echo '<option value="vex-theme-default"' . ( $li_subscribe_vex_class == 'vex-theme-default' ? ' selected' : '' ) . '>Pop-over content</option>';
|
83 |
+
echo '</select>';
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Prints subscribe heading input for settings page
|
88 |
+
*/
|
89 |
+
function li_subscribe_heading_callback ()
|
90 |
+
{
|
91 |
+
$options = get_option('leadin_subscribe_options');
|
92 |
+
$li_subscribe_heading = ( $options['li_subscribe_heading'] ? $options['li_subscribe_heading'] : 'Sign up for my newsletter to get new posts by email' ); // Get header from options, or show default
|
93 |
+
|
94 |
+
printf(
|
95 |
+
'<input id="li_subscribe_heading" type="text" id="title" name="leadin_subscribe_options[li_subscribe_heading]" value="%s" size="50"/>',
|
96 |
+
$li_subscribe_heading
|
97 |
+
);
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Prints subscribe heading text input for settings page
|
102 |
+
*/
|
103 |
+
function li_subscribe_btn_label_callback ()
|
104 |
+
{
|
105 |
+
$options = get_option('leadin_subscribe_options');
|
106 |
+
$li_subscribe_btn_label = ( $options['li_subscribe_btn_label'] ? $options['li_subscribe_btn_label'] : 'SUBSCRIBE' ); // Get button text from options, or show default
|
107 |
+
|
108 |
+
printf(
|
109 |
+
'<input id="li_subscribe_btn_label" type="text" id="title" name="leadin_subscribe_options[li_subscribe_btn_label]" value="%s" size="50"/>',
|
110 |
+
$li_subscribe_btn_label
|
111 |
+
);
|
112 |
+
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
?>
|
trunk/power-ups/subscribe-widget/frontend/css/leadin-subscribe.css
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.leadin-subscribe .vex-dialog-message{
|
2 |
+
font-weight: bold;
|
3 |
+
margin-bottom: 15px !important;
|
4 |
+
font-size: 18px !important;
|
5 |
+
}
|
6 |
+
|
7 |
+
.leadin-subscribe .vex-dialog-button{
|
8 |
+
background: #444444 !important;
|
9 |
+
margin-top: -10px !important;
|
10 |
+
}
|
11 |
+
|
12 |
+
.leadin-subscribe .vex-dialog-input input{
|
13 |
+
margin-bottom: 10px !important;
|
14 |
+
font-size: 18px !important;
|
15 |
+
}
|
16 |
+
|
17 |
+
.leadin-subscribe .vex-dialog-buttons input{
|
18 |
+
font-size: 14px !important;
|
19 |
+
color: #fff !important;
|
20 |
+
}
|
21 |
+
|
22 |
+
.leadin-subscribe .vex-close{
|
23 |
+
top: 5px !important;
|
24 |
+
right: 5px !important;
|
25 |
+
}
|
26 |
+
|
27 |
+
#leadin-subscribe-powered-by{
|
28 |
+
clear: both;
|
29 |
+
float: right;
|
30 |
+
font-size: 12px;
|
31 |
+
padding-top: 15px;
|
32 |
+
text-decoration: none;
|
33 |
+
font-weight: bold;
|
34 |
+
color: #3288e6;
|
35 |
+
}
|
36 |
+
|
37 |
+
#leadin-subscribe-powered-by:hover{
|
38 |
+
text-decoration: underline;
|
39 |
+
}
|
40 |
+
|
41 |
+
.leadin-subscribe .vex-content{
|
42 |
+
padding: 15px 15px 10px 15px !important;
|
43 |
+
}
|
44 |
+
|
45 |
+
@media only screen and (max-width: 760px) {
|
46 |
+
#leadin-subscribe-mobile-check { display: none; }
|
47 |
+
}
|
trunk/power-ups/subscribe-widget/frontend/css/vex.css
ADDED
@@ -0,0 +1,2230 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@keyframes vex-flyin {
|
2 |
+
/* line 25, ../sass/_keyframes.sass */
|
3 |
+
0% {
|
4 |
+
opacity: 0;
|
5 |
+
transform: translateY(-40px);
|
6 |
+
-webkit-transform: translateY(-40px);
|
7 |
+
-moz-transform: translateY(-40px);
|
8 |
+
-ms-transform: translateY(-40px);
|
9 |
+
-o-transform: translateY(-40px);
|
10 |
+
}
|
11 |
+
|
12 |
+
/* line 28, ../sass/_keyframes.sass */
|
13 |
+
100% {
|
14 |
+
opacity: 1;
|
15 |
+
transform: translateY(0);
|
16 |
+
-webkit-transform: translateY(0);
|
17 |
+
-moz-transform: translateY(0);
|
18 |
+
-ms-transform: translateY(0);
|
19 |
+
-o-transform: translateY(0);
|
20 |
+
}
|
21 |
+
}
|
22 |
+
|
23 |
+
@-webkit-keyframes vex-flyin {
|
24 |
+
/* line 25, ../sass/_keyframes.sass */
|
25 |
+
0% {
|
26 |
+
opacity: 0;
|
27 |
+
transform: translateY(-40px);
|
28 |
+
-webkit-transform: translateY(-40px);
|
29 |
+
-moz-transform: translateY(-40px);
|
30 |
+
-ms-transform: translateY(-40px);
|
31 |
+
-o-transform: translateY(-40px);
|
32 |
+
}
|
33 |
+
|
34 |
+
/* line 28, ../sass/_keyframes.sass */
|
35 |
+
100% {
|
36 |
+
opacity: 1;
|
37 |
+
transform: translateY(0);
|
38 |
+
-webkit-transform: translateY(0);
|
39 |
+
-moz-transform: translateY(0);
|
40 |
+
-ms-transform: translateY(0);
|
41 |
+
-o-transform: translateY(0);
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
@-moz-keyframes vex-flyin {
|
46 |
+
/* line 25, ../sass/_keyframes.sass */
|
47 |
+
0% {
|
48 |
+
opacity: 0;
|
49 |
+
transform: translateY(-40px);
|
50 |
+
-webkit-transform: translateY(-40px);
|
51 |
+
-moz-transform: translateY(-40px);
|
52 |
+
-ms-transform: translateY(-40px);
|
53 |
+
-o-transform: translateY(-40px);
|
54 |
+
}
|
55 |
+
|
56 |
+
/* line 28, ../sass/_keyframes.sass */
|
57 |
+
100% {
|
58 |
+
opacity: 1;
|
59 |
+
transform: translateY(0);
|
60 |
+
-webkit-transform: translateY(0);
|
61 |
+
-moz-transform: translateY(0);
|
62 |
+
-ms-transform: translateY(0);
|
63 |
+
-o-transform: translateY(0);
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
@-ms-keyframes vex-flyin {
|
68 |
+
/* line 25, ../sass/_keyframes.sass */
|
69 |
+
0% {
|
70 |
+
opacity: 0;
|
71 |
+
transform: translateY(-40px);
|
72 |
+
-webkit-transform: translateY(-40px);
|
73 |
+
-moz-transform: translateY(-40px);
|
74 |
+
-ms-transform: translateY(-40px);
|
75 |
+
-o-transform: translateY(-40px);
|
76 |
+
}
|
77 |
+
|
78 |
+
/* line 28, ../sass/_keyframes.sass */
|
79 |
+
100% {
|
80 |
+
opacity: 1;
|
81 |
+
transform: translateY(0);
|
82 |
+
-webkit-transform: translateY(0);
|
83 |
+
-moz-transform: translateY(0);
|
84 |
+
-ms-transform: translateY(0);
|
85 |
+
-o-transform: translateY(0);
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
@-o-keyframes vex-flyin {
|
90 |
+
/* line 25, ../sass/_keyframes.sass */
|
91 |
+
0% {
|
92 |
+
opacity: 0;
|
93 |
+
transform: translateY(-40px);
|
94 |
+
-webkit-transform: translateY(-40px);
|
95 |
+
-moz-transform: translateY(-40px);
|
96 |
+
-ms-transform: translateY(-40px);
|
97 |
+
-o-transform: translateY(-40px);
|
98 |
+
}
|
99 |
+
|
100 |
+
/* line 28, ../sass/_keyframes.sass */
|
101 |
+
100% {
|
102 |
+
opacity: 1;
|
103 |
+
transform: translateY(0);
|
104 |
+
-webkit-transform: translateY(0);
|
105 |
+
-moz-transform: translateY(0);
|
106 |
+
-ms-transform: translateY(0);
|
107 |
+
-o-transform: translateY(0);
|
108 |
+
}
|
109 |
+
}
|
110 |
+
|
111 |
+
@keyframes vex-flyout {
|
112 |
+
/* line 34, ../sass/_keyframes.sass */
|
113 |
+
0% {
|
114 |
+
opacity: 1;
|
115 |
+
transform: translateY(0);
|
116 |
+
-webkit-transform: translateY(0);
|
117 |
+
-moz-transform: translateY(0);
|
118 |
+
-ms-transform: translateY(0);
|
119 |
+
-o-transform: translateY(0);
|
120 |
+
}
|
121 |
+
|
122 |
+
/* line 37, ../sass/_keyframes.sass */
|
123 |
+
100% {
|
124 |
+
opacity: 0;
|
125 |
+
transform: translateY(-40px);
|
126 |
+
-webkit-transform: translateY(-40px);
|
127 |
+
-moz-transform: translateY(-40px);
|
128 |
+
-ms-transform: translateY(-40px);
|
129 |
+
-o-transform: translateY(-40px);
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
133 |
+
@-webkit-keyframes vex-flyout {
|
134 |
+
/* line 34, ../sass/_keyframes.sass */
|
135 |
+
0% {
|
136 |
+
opacity: 1;
|
137 |
+
transform: translateY(0);
|
138 |
+
-webkit-transform: translateY(0);
|
139 |
+
-moz-transform: translateY(0);
|
140 |
+
-ms-transform: translateY(0);
|
141 |
+
-o-transform: translateY(0);
|
142 |
+
}
|
143 |
+
|
144 |
+
/* line 37, ../sass/_keyframes.sass */
|
145 |
+
100% {
|
146 |
+
opacity: 0;
|
147 |
+
transform: translateY(-40px);
|
148 |
+
-webkit-transform: translateY(-40px);
|
149 |
+
-moz-transform: translateY(-40px);
|
150 |
+
-ms-transform: translateY(-40px);
|
151 |
+
-o-transform: translateY(-40px);
|
152 |
+
}
|
153 |
+
}
|
154 |
+
|
155 |
+
@-moz-keyframes vex-flyout {
|
156 |
+
/* line 34, ../sass/_keyframes.sass */
|
157 |
+
0% {
|
158 |
+
opacity: 1;
|
159 |
+
transform: translateY(0);
|
160 |
+
-webkit-transform: translateY(0);
|
161 |
+
-moz-transform: translateY(0);
|
162 |
+
-ms-transform: translateY(0);
|
163 |
+
-o-transform: translateY(0);
|
164 |
+
}
|
165 |
+
|
166 |
+
/* line 37, ../sass/_keyframes.sass */
|
167 |
+
100% {
|
168 |
+
opacity: 0;
|
169 |
+
transform: translateY(-40px);
|
170 |
+
-webkit-transform: translateY(-40px);
|
171 |
+
-moz-transform: translateY(-40px);
|
172 |
+
-ms-transform: translateY(-40px);
|
173 |
+
-o-transform: translateY(-40px);
|
174 |
+
}
|
175 |
+
}
|
176 |
+
|
177 |
+
@-ms-keyframes vex-flyout {
|
178 |
+
/* line 34, ../sass/_keyframes.sass */
|
179 |
+
0% {
|
180 |
+
opacity: 1;
|
181 |
+
transform: translateY(0);
|
182 |
+
-webkit-transform: translateY(0);
|
183 |
+
-moz-transform: translateY(0);
|
184 |
+
-ms-transform: translateY(0);
|
185 |
+
-o-transform: translateY(0);
|
186 |
+
}
|
187 |
+
|
188 |
+
/* line 37, ../sass/_keyframes.sass */
|
189 |
+
100% {
|
190 |
+
opacity: 0;
|
191 |
+
transform: translateY(-40px);
|
192 |
+
-webkit-transform: translateY(-40px);
|
193 |
+
-moz-transform: translateY(-40px);
|
194 |
+
-ms-transform: translateY(-40px);
|
195 |
+
-o-transform: translateY(-40px);
|
196 |
+
}
|
197 |
+
}
|
198 |
+
|
199 |
+
@-o-keyframes vex-flyout {
|
200 |
+
/* line 34, ../sass/_keyframes.sass */
|
201 |
+
0% {
|
202 |
+
opacity: 1;
|
203 |
+
transform: translateY(0);
|
204 |
+
-webkit-transform: translateY(0);
|
205 |
+
-moz-transform: translateY(0);
|
206 |
+
-ms-transform: translateY(0);
|
207 |
+
-o-transform: translateY(0);
|
208 |
+
}
|
209 |
+
|
210 |
+
/* line 37, ../sass/_keyframes.sass */
|
211 |
+
100% {
|
212 |
+
opacity: 0;
|
213 |
+
transform: translateY(-40px);
|
214 |
+
-webkit-transform: translateY(-40px);
|
215 |
+
-moz-transform: translateY(-40px);
|
216 |
+
-ms-transform: translateY(-40px);
|
217 |
+
-o-transform: translateY(-40px);
|
218 |
+
}
|
219 |
+
}
|
220 |
+
|
221 |
+
@keyframes vex-pulse {
|
222 |
+
/* line 136, ../sass/_keyframes.sass */
|
223 |
+
0% {
|
224 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
225 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
226 |
+
box-shadow: inset 0 0 0 300px transparent;
|
227 |
+
}
|
228 |
+
|
229 |
+
/* line 138, ../sass/_keyframes.sass */
|
230 |
+
70% {
|
231 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
232 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
233 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
234 |
+
}
|
235 |
+
|
236 |
+
/* line 140, ../sass/_keyframes.sass */
|
237 |
+
100% {
|
238 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
239 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
240 |
+
box-shadow: inset 0 0 0 300px transparent;
|
241 |
+
}
|
242 |
+
}
|
243 |
+
|
244 |
+
@-webkit-keyframes vex-pulse {
|
245 |
+
/* line 136, ../sass/_keyframes.sass */
|
246 |
+
0% {
|
247 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
248 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
249 |
+
box-shadow: inset 0 0 0 300px transparent;
|
250 |
+
}
|
251 |
+
|
252 |
+
/* line 138, ../sass/_keyframes.sass */
|
253 |
+
70% {
|
254 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
255 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
256 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
257 |
+
}
|
258 |
+
|
259 |
+
/* line 140, ../sass/_keyframes.sass */
|
260 |
+
100% {
|
261 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
262 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
263 |
+
box-shadow: inset 0 0 0 300px transparent;
|
264 |
+
}
|
265 |
+
}
|
266 |
+
|
267 |
+
@-moz-keyframes vex-pulse {
|
268 |
+
/* line 136, ../sass/_keyframes.sass */
|
269 |
+
0% {
|
270 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
271 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
272 |
+
box-shadow: inset 0 0 0 300px transparent;
|
273 |
+
}
|
274 |
+
|
275 |
+
/* line 138, ../sass/_keyframes.sass */
|
276 |
+
70% {
|
277 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
278 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
279 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
280 |
+
}
|
281 |
+
|
282 |
+
/* line 140, ../sass/_keyframes.sass */
|
283 |
+
100% {
|
284 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
285 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
286 |
+
box-shadow: inset 0 0 0 300px transparent;
|
287 |
+
}
|
288 |
+
}
|
289 |
+
|
290 |
+
@-ms-keyframes vex-pulse {
|
291 |
+
/* line 136, ../sass/_keyframes.sass */
|
292 |
+
0% {
|
293 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
294 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
295 |
+
box-shadow: inset 0 0 0 300px transparent;
|
296 |
+
}
|
297 |
+
|
298 |
+
/* line 138, ../sass/_keyframes.sass */
|
299 |
+
70% {
|
300 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
301 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
302 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
303 |
+
}
|
304 |
+
|
305 |
+
/* line 140, ../sass/_keyframes.sass */
|
306 |
+
100% {
|
307 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
308 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
309 |
+
box-shadow: inset 0 0 0 300px transparent;
|
310 |
+
}
|
311 |
+
}
|
312 |
+
|
313 |
+
@-o-keyframes vex-pulse {
|
314 |
+
/* line 136, ../sass/_keyframes.sass */
|
315 |
+
0% {
|
316 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
317 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
318 |
+
box-shadow: inset 0 0 0 300px transparent;
|
319 |
+
}
|
320 |
+
|
321 |
+
/* line 138, ../sass/_keyframes.sass */
|
322 |
+
70% {
|
323 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
324 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
325 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
326 |
+
}
|
327 |
+
|
328 |
+
/* line 140, ../sass/_keyframes.sass */
|
329 |
+
100% {
|
330 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
331 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
332 |
+
box-shadow: inset 0 0 0 300px transparent;
|
333 |
+
}
|
334 |
+
}
|
335 |
+
|
336 |
+
/* line 13, ../sass/_vex-theme-default.sass */
|
337 |
+
.vex.vex-theme-default {
|
338 |
+
padding-top: 160px;
|
339 |
+
padding-bottom: 160px;
|
340 |
+
}
|
341 |
+
/* line 17, ../sass/_vex-theme-default.sass */
|
342 |
+
.vex.vex-theme-default.vex-closing .vex-content {
|
343 |
+
animation: vex-flyout 0.5s;
|
344 |
+
-webkit-animation: vex-flyout 0.5s;
|
345 |
+
-moz-animation: vex-flyout 0.5s;
|
346 |
+
-ms-animation: vex-flyout 0.5s;
|
347 |
+
-o-animation: vex-flyout 0.5s;
|
348 |
+
-webkit-backface-visibility: hidden;
|
349 |
+
}
|
350 |
+
/* line 20, ../sass/_vex-theme-default.sass */
|
351 |
+
.vex.vex-theme-default .vex-content {
|
352 |
+
animation: vex-flyin 0.5s;
|
353 |
+
-webkit-animation: vex-flyin 0.5s;
|
354 |
+
-moz-animation: vex-flyin 0.5s;
|
355 |
+
-ms-animation: vex-flyin 0.5s;
|
356 |
+
-o-animation: vex-flyin 0.5s;
|
357 |
+
-webkit-backface-visibility: hidden;
|
358 |
+
}
|
359 |
+
/* line 23, ../sass/_vex-theme-default.sass */
|
360 |
+
.vex.vex-theme-default .vex-content {
|
361 |
+
-webkit-border-radius: 5px;
|
362 |
+
-moz-border-radius: 5px;
|
363 |
+
-ms-border-radius: 5px;
|
364 |
+
-o-border-radius: 5px;
|
365 |
+
border-radius: 5px;
|
366 |
+
font-family: "Helvetica Neue", sans-serif;
|
367 |
+
background: #f0f0f0;
|
368 |
+
color: #444444;
|
369 |
+
padding: 1em;
|
370 |
+
position: relative;
|
371 |
+
margin: 0 auto;
|
372 |
+
max-width: 100%;
|
373 |
+
width: 450px;
|
374 |
+
font-size: 1.1em;
|
375 |
+
line-height: 1.5em;
|
376 |
+
}
|
377 |
+
/* line 36, ../sass/_vex-theme-default.sass */
|
378 |
+
.vex.vex-theme-default .vex-content h1, .vex.vex-theme-default .vex-content h2, .vex.vex-theme-default .vex-content h3, .vex.vex-theme-default .vex-content h4, .vex.vex-theme-default .vex-content h5, .vex.vex-theme-default .vex-content h6, .vex.vex-theme-default .vex-content p, .vex.vex-theme-default .vex-content ul, .vex.vex-theme-default .vex-content li {
|
379 |
+
color: inherit;
|
380 |
+
}
|
381 |
+
/* line 39, ../sass/_vex-theme-default.sass */
|
382 |
+
.vex.vex-theme-default .vex-close {
|
383 |
+
-webkit-border-radius: 5px;
|
384 |
+
-moz-border-radius: 5px;
|
385 |
+
-ms-border-radius: 5px;
|
386 |
+
-o-border-radius: 5px;
|
387 |
+
border-radius: 5px;
|
388 |
+
position: absolute;
|
389 |
+
top: 0;
|
390 |
+
right: 0;
|
391 |
+
cursor: pointer;
|
392 |
+
}
|
393 |
+
/* line 46, ../sass/_vex-theme-default.sass */
|
394 |
+
.vex.vex-theme-default .vex-close:before {
|
395 |
+
-webkit-border-radius: 3px;
|
396 |
+
-moz-border-radius: 3px;
|
397 |
+
-ms-border-radius: 3px;
|
398 |
+
-o-border-radius: 3px;
|
399 |
+
border-radius: 3px;
|
400 |
+
position: absolute;
|
401 |
+
content: "\00D7";
|
402 |
+
font-size: 26px;
|
403 |
+
font-weight: normal;
|
404 |
+
line-height: 31px;
|
405 |
+
height: 30px;
|
406 |
+
width: 30px;
|
407 |
+
text-align: center;
|
408 |
+
top: 3px;
|
409 |
+
right: 3px;
|
410 |
+
color: #bbbbbb;
|
411 |
+
background: transparent;
|
412 |
+
}
|
413 |
+
/* line 61, ../sass/_vex-theme-default.sass */
|
414 |
+
.vex.vex-theme-default .vex-close:hover:before, .vex.vex-theme-default .vex-close:active:before {
|
415 |
+
color: #777777;
|
416 |
+
background: #e0e0e0;
|
417 |
+
}
|
418 |
+
/* line 67, ../sass/_vex-theme-default.sass */
|
419 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-message {
|
420 |
+
margin-bottom: 0.5em;
|
421 |
+
}
|
422 |
+
/* line 70, ../sass/_vex-theme-default.sass */
|
423 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input {
|
424 |
+
margin-bottom: 1em;
|
425 |
+
}
|
426 |
+
/* line 73, ../sass/_vex-theme-default.sass */
|
427 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"] {
|
428 |
+
-webkit-border-radius: 3px;
|
429 |
+
-moz-border-radius: 3px;
|
430 |
+
-ms-border-radius: 3px;
|
431 |
+
-o-border-radius: 3px;
|
432 |
+
border-radius: 3px;
|
433 |
+
background: white;
|
434 |
+
width: 100%;
|
435 |
+
padding: 0.25em 0.67em;
|
436 |
+
border: 0;
|
437 |
+
font-family: inherit;
|
438 |
+
font-weight: inherit;
|
439 |
+
font-size: inherit;
|
440 |
+
min-height: 2.5em;
|
441 |
+
margin: 0 0 0.25em;
|
442 |
+
}
|
443 |
+
/* line 85, ../sass/_vex-theme-default.sass */
|
444 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
|
445 |
+
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
|
446 |
+
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
|
447 |
+
box-shadow: inset 0 0 0 2px #8dbdf1;
|
448 |
+
outline: none;
|
449 |
+
}
|
450 |
+
/* line 89, ../sass/_vex-theme-default.sass */
|
451 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-buttons {
|
452 |
+
*zoom: 1;
|
453 |
+
}
|
454 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
455 |
+
.vex.vex-theme-default .vex-dialog-form .vex-dialog-buttons:after {
|
456 |
+
content: "";
|
457 |
+
display: table;
|
458 |
+
clear: both;
|
459 |
+
}
|
460 |
+
/* line 92, ../sass/_vex-theme-default.sass */
|
461 |
+
.vex.vex-theme-default .vex-dialog-button {
|
462 |
+
-webkit-border-radius: 3px;
|
463 |
+
-moz-border-radius: 3px;
|
464 |
+
-ms-border-radius: 3px;
|
465 |
+
-o-border-radius: 3px;
|
466 |
+
border-radius: 3px;
|
467 |
+
border: 0;
|
468 |
+
float: right;
|
469 |
+
margin: 0 0 0 0.5em;
|
470 |
+
font-family: inherit;
|
471 |
+
text-transform: uppercase;
|
472 |
+
letter-spacing: 0.1em;
|
473 |
+
font-size: 0.8em;
|
474 |
+
line-height: 1em;
|
475 |
+
padding: 0.75em 2em;
|
476 |
+
}
|
477 |
+
/* line 104, ../sass/_vex-theme-default.sass */
|
478 |
+
.vex.vex-theme-default .vex-dialog-button.vex-last {
|
479 |
+
margin-left: 0;
|
480 |
+
}
|
481 |
+
/* line 107, ../sass/_vex-theme-default.sass */
|
482 |
+
.vex.vex-theme-default .vex-dialog-button:focus {
|
483 |
+
animation: vex-pulse 1.1s infinite;
|
484 |
+
-webkit-animation: vex-pulse 1.1s infinite;
|
485 |
+
-moz-animation: vex-pulse 1.1s infinite;
|
486 |
+
-ms-animation: vex-pulse 1.1s infinite;
|
487 |
+
-o-animation: vex-pulse 1.1s infinite;
|
488 |
+
-webkit-backface-visibility: hidden;
|
489 |
+
outline: none;
|
490 |
+
}
|
491 |
+
@media (max-width: 568px) {
|
492 |
+
/* line 107, ../sass/_vex-theme-default.sass */
|
493 |
+
.vex.vex-theme-default .vex-dialog-button:focus {
|
494 |
+
animation: none;
|
495 |
+
-webkit-animation: none;
|
496 |
+
-moz-animation: none;
|
497 |
+
-ms-animation: none;
|
498 |
+
-o-animation: none;
|
499 |
+
-webkit-backface-visibility: hidden;
|
500 |
+
}
|
501 |
+
}
|
502 |
+
/* line 116, ../sass/_vex-theme-default.sass */
|
503 |
+
.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-primary {
|
504 |
+
background: #3288e6;
|
505 |
+
color: white;
|
506 |
+
}
|
507 |
+
/* line 120, ../sass/_vex-theme-default.sass */
|
508 |
+
.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-secondary {
|
509 |
+
background: #e0e0e0;
|
510 |
+
color: #777777;
|
511 |
+
}
|
512 |
+
|
513 |
+
/* line 124, ../sass/_vex-theme-default.sass */
|
514 |
+
.vex-loading-spinner.vex-theme-default {
|
515 |
+
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
516 |
+
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
517 |
+
box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
518 |
+
-webkit-border-radius: 100%;
|
519 |
+
-moz-border-radius: 100%;
|
520 |
+
-ms-border-radius: 100%;
|
521 |
+
-o-border-radius: 100%;
|
522 |
+
border-radius: 100%;
|
523 |
+
background: #f0f0f0;
|
524 |
+
border: 0.2em solid transparent;
|
525 |
+
border-top-color: #bbbbbb;
|
526 |
+
top: -1.1em;
|
527 |
+
bottom: auto;
|
528 |
+
}
|
529 |
+
|
530 |
+
@keyframes vex-slideup {
|
531 |
+
/* line 83, ../sass/_keyframes.sass */
|
532 |
+
0% {
|
533 |
+
transform: translateY(0);
|
534 |
+
-webkit-transform: translateY(0);
|
535 |
+
-moz-transform: translateY(0);
|
536 |
+
-ms-transform: translateY(0);
|
537 |
+
-o-transform: translateY(0);
|
538 |
+
opacity: 0;
|
539 |
+
}
|
540 |
+
|
541 |
+
/* line 86, ../sass/_keyframes.sass */
|
542 |
+
1% {
|
543 |
+
transform: translateY(800px);
|
544 |
+
-webkit-transform: translateY(800px);
|
545 |
+
-moz-transform: translateY(800px);
|
546 |
+
-ms-transform: translateY(800px);
|
547 |
+
-o-transform: translateY(800px);
|
548 |
+
opacity: 0;
|
549 |
+
}
|
550 |
+
|
551 |
+
/* line 91, ../sass/_keyframes.sass */
|
552 |
+
2% {
|
553 |
+
transform: translateY(800px);
|
554 |
+
-webkit-transform: translateY(800px);
|
555 |
+
-moz-transform: translateY(800px);
|
556 |
+
-ms-transform: translateY(800px);
|
557 |
+
-o-transform: translateY(800px);
|
558 |
+
opacity: 1;
|
559 |
+
}
|
560 |
+
|
561 |
+
/* line 94, ../sass/_keyframes.sass */
|
562 |
+
100% {
|
563 |
+
transform: translateY(0);
|
564 |
+
-webkit-transform: translateY(0);
|
565 |
+
-moz-transform: translateY(0);
|
566 |
+
-ms-transform: translateY(0);
|
567 |
+
-o-transform: translateY(0);
|
568 |
+
opacity: 1;
|
569 |
+
}
|
570 |
+
}
|
571 |
+
|
572 |
+
@-webkit-keyframes vex-slideup {
|
573 |
+
/* line 83, ../sass/_keyframes.sass */
|
574 |
+
0% {
|
575 |
+
transform: translateY(0);
|
576 |
+
-webkit-transform: translateY(0);
|
577 |
+
-moz-transform: translateY(0);
|
578 |
+
-ms-transform: translateY(0);
|
579 |
+
-o-transform: translateY(0);
|
580 |
+
opacity: 0;
|
581 |
+
}
|
582 |
+
|
583 |
+
/* line 86, ../sass/_keyframes.sass */
|
584 |
+
1% {
|
585 |
+
transform: translateY(800px);
|
586 |
+
-webkit-transform: translateY(800px);
|
587 |
+
-moz-transform: translateY(800px);
|
588 |
+
-ms-transform: translateY(800px);
|
589 |
+
-o-transform: translateY(800px);
|
590 |
+
opacity: 0;
|
591 |
+
}
|
592 |
+
|
593 |
+
/* line 91, ../sass/_keyframes.sass */
|
594 |
+
2% {
|
595 |
+
transform: translateY(800px);
|
596 |
+
-webkit-transform: translateY(800px);
|
597 |
+
-moz-transform: translateY(800px);
|
598 |
+
-ms-transform: translateY(800px);
|
599 |
+
-o-transform: translateY(800px);
|
600 |
+
opacity: 1;
|
601 |
+
}
|
602 |
+
|
603 |
+
/* line 94, ../sass/_keyframes.sass */
|
604 |
+
100% {
|
605 |
+
transform: translateY(0);
|
606 |
+
-webkit-transform: translateY(0);
|
607 |
+
-moz-transform: translateY(0);
|
608 |
+
-ms-transform: translateY(0);
|
609 |
+
-o-transform: translateY(0);
|
610 |
+
opacity: 1;
|
611 |
+
}
|
612 |
+
}
|
613 |
+
|
614 |
+
@-moz-keyframes vex-slideup {
|
615 |
+
/* line 83, ../sass/_keyframes.sass */
|
616 |
+
0% {
|
617 |
+
transform: translateY(0);
|
618 |
+
-webkit-transform: translateY(0);
|
619 |
+
-moz-transform: translateY(0);
|
620 |
+
-ms-transform: translateY(0);
|
621 |
+
-o-transform: translateY(0);
|
622 |
+
opacity: 0;
|
623 |
+
}
|
624 |
+
|
625 |
+
/* line 86, ../sass/_keyframes.sass */
|
626 |
+
1% {
|
627 |
+
transform: translateY(800px);
|
628 |
+
-webkit-transform: translateY(800px);
|
629 |
+
-moz-transform: translateY(800px);
|
630 |
+
-ms-transform: translateY(800px);
|
631 |
+
-o-transform: translateY(800px);
|
632 |
+
opacity: 0;
|
633 |
+
}
|
634 |
+
|
635 |
+
/* line 91, ../sass/_keyframes.sass */
|
636 |
+
2% {
|
637 |
+
transform: translateY(800px);
|
638 |
+
-webkit-transform: translateY(800px);
|
639 |
+
-moz-transform: translateY(800px);
|
640 |
+
-ms-transform: translateY(800px);
|
641 |
+
-o-transform: translateY(800px);
|
642 |
+
opacity: 1;
|
643 |
+
}
|
644 |
+
|
645 |
+
/* line 94, ../sass/_keyframes.sass */
|
646 |
+
100% {
|
647 |
+
transform: translateY(0);
|
648 |
+
-webkit-transform: translateY(0);
|
649 |
+
-moz-transform: translateY(0);
|
650 |
+
-ms-transform: translateY(0);
|
651 |
+
-o-transform: translateY(0);
|
652 |
+
opacity: 1;
|
653 |
+
}
|
654 |
+
}
|
655 |
+
|
656 |
+
@-ms-keyframes vex-slideup {
|
657 |
+
/* line 83, ../sass/_keyframes.sass */
|
658 |
+
0% {
|
659 |
+
transform: translateY(0);
|
660 |
+
-webkit-transform: translateY(0);
|
661 |
+
-moz-transform: translateY(0);
|
662 |
+
-ms-transform: translateY(0);
|
663 |
+
-o-transform: translateY(0);
|
664 |
+
opacity: 0;
|
665 |
+
}
|
666 |
+
|
667 |
+
/* line 86, ../sass/_keyframes.sass */
|
668 |
+
1% {
|
669 |
+
transform: translateY(800px);
|
670 |
+
-webkit-transform: translateY(800px);
|
671 |
+
-moz-transform: translateY(800px);
|
672 |
+
-ms-transform: translateY(800px);
|
673 |
+
-o-transform: translateY(800px);
|
674 |
+
opacity: 0;
|
675 |
+
}
|
676 |
+
|
677 |
+
/* line 91, ../sass/_keyframes.sass */
|
678 |
+
2% {
|
679 |
+
transform: translateY(800px);
|
680 |
+
-webkit-transform: translateY(800px);
|
681 |
+
-moz-transform: translateY(800px);
|
682 |
+
-ms-transform: translateY(800px);
|
683 |
+
-o-transform: translateY(800px);
|
684 |
+
opacity: 1;
|
685 |
+
}
|
686 |
+
|
687 |
+
/* line 94, ../sass/_keyframes.sass */
|
688 |
+
100% {
|
689 |
+
transform: translateY(0);
|
690 |
+
-webkit-transform: translateY(0);
|
691 |
+
-moz-transform: translateY(0);
|
692 |
+
-ms-transform: translateY(0);
|
693 |
+
-o-transform: translateY(0);
|
694 |
+
opacity: 1;
|
695 |
+
}
|
696 |
+
}
|
697 |
+
|
698 |
+
@-o-keyframes vex-slideup {
|
699 |
+
/* line 83, ../sass/_keyframes.sass */
|
700 |
+
0% {
|
701 |
+
transform: translateY(0);
|
702 |
+
-webkit-transform: translateY(0);
|
703 |
+
-moz-transform: translateY(0);
|
704 |
+
-ms-transform: translateY(0);
|
705 |
+
-o-transform: translateY(0);
|
706 |
+
opacity: 0;
|
707 |
+
}
|
708 |
+
|
709 |
+
/* line 86, ../sass/_keyframes.sass */
|
710 |
+
1% {
|
711 |
+
transform: translateY(800px);
|
712 |
+
-webkit-transform: translateY(800px);
|
713 |
+
-moz-transform: translateY(800px);
|
714 |
+
-ms-transform: translateY(800px);
|
715 |
+
-o-transform: translateY(800px);
|
716 |
+
opacity: 0;
|
717 |
+
}
|
718 |
+
|
719 |
+
/* line 91, ../sass/_keyframes.sass */
|
720 |
+
2% {
|
721 |
+
transform: translateY(800px);
|
722 |
+
-webkit-transform: translateY(800px);
|
723 |
+
-moz-transform: translateY(800px);
|
724 |
+
-ms-transform: translateY(800px);
|
725 |
+
-o-transform: translateY(800px);
|
726 |
+
opacity: 1;
|
727 |
+
}
|
728 |
+
|
729 |
+
/* line 94, ../sass/_keyframes.sass */
|
730 |
+
100% {
|
731 |
+
transform: translateY(0);
|
732 |
+
-webkit-transform: translateY(0);
|
733 |
+
-moz-transform: translateY(0);
|
734 |
+
-ms-transform: translateY(0);
|
735 |
+
-o-transform: translateY(0);
|
736 |
+
opacity: 1;
|
737 |
+
}
|
738 |
+
}
|
739 |
+
|
740 |
+
@keyframes vex-slidedown {
|
741 |
+
/* line 100, ../sass/_keyframes.sass */
|
742 |
+
0% {
|
743 |
+
transform: translateY(0);
|
744 |
+
-webkit-transform: translateY(0);
|
745 |
+
-moz-transform: translateY(0);
|
746 |
+
-ms-transform: translateY(0);
|
747 |
+
-o-transform: translateY(0);
|
748 |
+
}
|
749 |
+
|
750 |
+
/* line 102, ../sass/_keyframes.sass */
|
751 |
+
100% {
|
752 |
+
transform: translateY(800px);
|
753 |
+
-webkit-transform: translateY(800px);
|
754 |
+
-moz-transform: translateY(800px);
|
755 |
+
-ms-transform: translateY(800px);
|
756 |
+
-o-transform: translateY(800px);
|
757 |
+
}
|
758 |
+
}
|
759 |
+
|
760 |
+
@-webkit-keyframes vex-slidedown {
|
761 |
+
/* line 100, ../sass/_keyframes.sass */
|
762 |
+
0% {
|
763 |
+
transform: translateY(0);
|
764 |
+
-webkit-transform: translateY(0);
|
765 |
+
-moz-transform: translateY(0);
|
766 |
+
-ms-transform: translateY(0);
|
767 |
+
-o-transform: translateY(0);
|
768 |
+
}
|
769 |
+
|
770 |
+
/* line 102, ../sass/_keyframes.sass */
|
771 |
+
100% {
|
772 |
+
transform: translateY(800px);
|
773 |
+
-webkit-transform: translateY(800px);
|
774 |
+
-moz-transform: translateY(800px);
|
775 |
+
-ms-transform: translateY(800px);
|
776 |
+
-o-transform: translateY(800px);
|
777 |
+
}
|
778 |
+
}
|
779 |
+
|
780 |
+
@-moz-keyframes vex-slidedown {
|
781 |
+
/* line 100, ../sass/_keyframes.sass */
|
782 |
+
0% {
|
783 |
+
transform: translateY(0);
|
784 |
+
-webkit-transform: translateY(0);
|
785 |
+
-moz-transform: translateY(0);
|
786 |
+
-ms-transform: translateY(0);
|
787 |
+
-o-transform: translateY(0);
|
788 |
+
}
|
789 |
+
|
790 |
+
/* line 102, ../sass/_keyframes.sass */
|
791 |
+
100% {
|
792 |
+
transform: translateY(800px);
|
793 |
+
-webkit-transform: translateY(800px);
|
794 |
+
-moz-transform: translateY(800px);
|
795 |
+
-ms-transform: translateY(800px);
|
796 |
+
-o-transform: translateY(800px);
|
797 |
+
}
|
798 |
+
}
|
799 |
+
|
800 |
+
@-ms-keyframes vex-slidedown {
|
801 |
+
/* line 100, ../sass/_keyframes.sass */
|
802 |
+
0% {
|
803 |
+
transform: translateY(0);
|
804 |
+
-webkit-transform: translateY(0);
|
805 |
+
-moz-transform: translateY(0);
|
806 |
+
-ms-transform: translateY(0);
|
807 |
+
-o-transform: translateY(0);
|
808 |
+
}
|
809 |
+
|
810 |
+
/* line 102, ../sass/_keyframes.sass */
|
811 |
+
100% {
|
812 |
+
transform: translateY(800px);
|
813 |
+
-webkit-transform: translateY(800px);
|
814 |
+
-moz-transform: translateY(800px);
|
815 |
+
-ms-transform: translateY(800px);
|
816 |
+
-o-transform: translateY(800px);
|
817 |
+
}
|
818 |
+
}
|
819 |
+
|
820 |
+
@-o-keyframes vex-slidedown {
|
821 |
+
/* line 100, ../sass/_keyframes.sass */
|
822 |
+
0% {
|
823 |
+
transform: translateY(0);
|
824 |
+
-webkit-transform: translateY(0);
|
825 |
+
-moz-transform: translateY(0);
|
826 |
+
-ms-transform: translateY(0);
|
827 |
+
-o-transform: translateY(0);
|
828 |
+
}
|
829 |
+
|
830 |
+
/* line 102, ../sass/_keyframes.sass */
|
831 |
+
100% {
|
832 |
+
transform: translateY(800px);
|
833 |
+
-webkit-transform: translateY(800px);
|
834 |
+
-moz-transform: translateY(800px);
|
835 |
+
-ms-transform: translateY(800px);
|
836 |
+
-o-transform: translateY(800px);
|
837 |
+
}
|
838 |
+
}
|
839 |
+
|
840 |
+
@keyframes vex-pulse {
|
841 |
+
/* line 136, ../sass/_keyframes.sass */
|
842 |
+
0% {
|
843 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
844 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
845 |
+
box-shadow: inset 0 0 0 300px transparent;
|
846 |
+
}
|
847 |
+
|
848 |
+
/* line 138, ../sass/_keyframes.sass */
|
849 |
+
70% {
|
850 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
851 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
852 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
853 |
+
}
|
854 |
+
|
855 |
+
/* line 140, ../sass/_keyframes.sass */
|
856 |
+
100% {
|
857 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
858 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
859 |
+
box-shadow: inset 0 0 0 300px transparent;
|
860 |
+
}
|
861 |
+
}
|
862 |
+
|
863 |
+
@-webkit-keyframes vex-pulse {
|
864 |
+
/* line 136, ../sass/_keyframes.sass */
|
865 |
+
0% {
|
866 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
867 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
868 |
+
box-shadow: inset 0 0 0 300px transparent;
|
869 |
+
}
|
870 |
+
|
871 |
+
/* line 138, ../sass/_keyframes.sass */
|
872 |
+
70% {
|
873 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
874 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
875 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
876 |
+
}
|
877 |
+
|
878 |
+
/* line 140, ../sass/_keyframes.sass */
|
879 |
+
100% {
|
880 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
881 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
882 |
+
box-shadow: inset 0 0 0 300px transparent;
|
883 |
+
}
|
884 |
+
}
|
885 |
+
|
886 |
+
@-moz-keyframes vex-pulse {
|
887 |
+
/* line 136, ../sass/_keyframes.sass */
|
888 |
+
0% {
|
889 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
890 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
891 |
+
box-shadow: inset 0 0 0 300px transparent;
|
892 |
+
}
|
893 |
+
|
894 |
+
/* line 138, ../sass/_keyframes.sass */
|
895 |
+
70% {
|
896 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
897 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
898 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
899 |
+
}
|
900 |
+
|
901 |
+
/* line 140, ../sass/_keyframes.sass */
|
902 |
+
100% {
|
903 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
904 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
905 |
+
box-shadow: inset 0 0 0 300px transparent;
|
906 |
+
}
|
907 |
+
}
|
908 |
+
|
909 |
+
@-ms-keyframes vex-pulse {
|
910 |
+
/* line 136, ../sass/_keyframes.sass */
|
911 |
+
0% {
|
912 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
913 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
914 |
+
box-shadow: inset 0 0 0 300px transparent;
|
915 |
+
}
|
916 |
+
|
917 |
+
/* line 138, ../sass/_keyframes.sass */
|
918 |
+
70% {
|
919 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
920 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
921 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
922 |
+
}
|
923 |
+
|
924 |
+
/* line 140, ../sass/_keyframes.sass */
|
925 |
+
100% {
|
926 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
927 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
928 |
+
box-shadow: inset 0 0 0 300px transparent;
|
929 |
+
}
|
930 |
+
}
|
931 |
+
|
932 |
+
@-o-keyframes vex-pulse {
|
933 |
+
/* line 136, ../sass/_keyframes.sass */
|
934 |
+
0% {
|
935 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
936 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
937 |
+
box-shadow: inset 0 0 0 300px transparent;
|
938 |
+
}
|
939 |
+
|
940 |
+
/* line 138, ../sass/_keyframes.sass */
|
941 |
+
70% {
|
942 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
943 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
944 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
945 |
+
}
|
946 |
+
|
947 |
+
/* line 140, ../sass/_keyframes.sass */
|
948 |
+
100% {
|
949 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
950 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
951 |
+
box-shadow: inset 0 0 0 300px transparent;
|
952 |
+
}
|
953 |
+
}
|
954 |
+
|
955 |
+
/* line 13, ../sass/_vex-theme-bottom-right-corner.sass */
|
956 |
+
.vex.vex-theme-bottom-right-corner,
|
957 |
+
.vex.vex-theme-bottom-left-corner {
|
958 |
+
top: auto;
|
959 |
+
bottom: 0;
|
960 |
+
right: 0;
|
961 |
+
overflow: visible;
|
962 |
+
}
|
963 |
+
/* line 20, ../sass/_vex-theme-bottom-right-corner.sass */
|
964 |
+
.vex.vex-theme-bottom-right-corner .vex-overlay,
|
965 |
+
.vex.vex-theme-bottom-left-corner .vex-overlay {
|
966 |
+
display: none;
|
967 |
+
}
|
968 |
+
/* line 23, ../sass/_vex-theme-bottom-right-corner.sass */
|
969 |
+
.vex.vex-theme-bottom-right-corner.vex-closing .vex-content,
|
970 |
+
.vex.vex-theme-bottom-left-corner.vex-closing .vex-content {
|
971 |
+
animation: vex-slidedown 0.5s;
|
972 |
+
-webkit-animation: vex-slidedown 0.5s;
|
973 |
+
-moz-animation: vex-slidedown 0.5s;
|
974 |
+
-ms-animation: vex-slidedown 0.5s;
|
975 |
+
-o-animation: vex-slidedown 0.5s;
|
976 |
+
-webkit-backface-visibility: hidden;
|
977 |
+
}
|
978 |
+
/* line 26, ../sass/_vex-theme-bottom-right-corner.sass */
|
979 |
+
.vex.vex-theme-bottom-right-corner .vex-content,
|
980 |
+
.vex.vex-theme-bottom-left-corner .vex-content {
|
981 |
+
animation: vex-slideup 0.5s;
|
982 |
+
-webkit-animation: vex-slideup 0.5s;
|
983 |
+
-moz-animation: vex-slideup 0.5s;
|
984 |
+
-ms-animation: vex-slideup 0.5s;
|
985 |
+
-o-animation: vex-slideup 0.5s;
|
986 |
+
-webkit-backface-visibility: hidden;
|
987 |
+
}
|
988 |
+
/* line 29, ../sass/_vex-theme-bottom-right-corner.sass */
|
989 |
+
.vex.vex-theme-bottom-right-corner .vex-content,
|
990 |
+
.vex.vex-theme-bottom-left-corner .vex-content {
|
991 |
+
font-family: "Helvetica Neue", sans-serif;
|
992 |
+
background: #f0f0f0;
|
993 |
+
color: #444444;
|
994 |
+
padding: 1em;
|
995 |
+
max-width: 100%;
|
996 |
+
width: 450px;
|
997 |
+
font-size: 1.1em;
|
998 |
+
line-height: 1.5em;
|
999 |
+
position: fixed;
|
1000 |
+
bottom: 0;
|
1001 |
+
}
|
1002 |
+
/* line 41, ../sass/_vex-theme-bottom-right-corner.sass */
|
1003 |
+
.vex.vex-theme-bottom-right-corner .vex-content h1, .vex.vex-theme-bottom-right-corner .vex-content h2, .vex.vex-theme-bottom-right-corner .vex-content h3, .vex.vex-theme-bottom-right-corner .vex-content h4, .vex.vex-theme-bottom-right-corner .vex-content h5, .vex.vex-theme-bottom-right-corner .vex-content h6, .vex.vex-theme-bottom-right-corner .vex-content p, .vex.vex-theme-bottom-right-corner .vex-content ul, .vex.vex-theme-bottom-right-corner .vex-content li,
|
1004 |
+
.vex.vex-theme-bottom-left-corner .vex-content h1,
|
1005 |
+
.vex.vex-theme-bottom-left-corner .vex-content h2,
|
1006 |
+
.vex.vex-theme-bottom-left-corner .vex-content h3,
|
1007 |
+
.vex.vex-theme-bottom-left-corner .vex-content h4,
|
1008 |
+
.vex.vex-theme-bottom-left-corner .vex-content h5,
|
1009 |
+
.vex.vex-theme-bottom-left-corner .vex-content h6,
|
1010 |
+
.vex.vex-theme-bottom-left-corner .vex-content p,
|
1011 |
+
.vex.vex-theme-bottom-left-corner .vex-content ul,
|
1012 |
+
.vex.vex-theme-bottom-left-corner .vex-content li {
|
1013 |
+
color: inherit;
|
1014 |
+
}
|
1015 |
+
/* line 44, ../sass/_vex-theme-bottom-right-corner.sass */
|
1016 |
+
.vex.vex-theme-bottom-right-corner .vex-close,
|
1017 |
+
.vex.vex-theme-bottom-left-corner .vex-close {
|
1018 |
+
-webkit-border-radius: 5px;
|
1019 |
+
-moz-border-radius: 5px;
|
1020 |
+
-ms-border-radius: 5px;
|
1021 |
+
-o-border-radius: 5px;
|
1022 |
+
border-radius: 5px;
|
1023 |
+
position: absolute;
|
1024 |
+
top: 0;
|
1025 |
+
right: 0;
|
1026 |
+
cursor: pointer;
|
1027 |
+
}
|
1028 |
+
/* line 51, ../sass/_vex-theme-bottom-right-corner.sass */
|
1029 |
+
.vex.vex-theme-bottom-right-corner .vex-close:before,
|
1030 |
+
.vex.vex-theme-bottom-left-corner .vex-close:before {
|
1031 |
+
-webkit-border-radius: 3px;
|
1032 |
+
-moz-border-radius: 3px;
|
1033 |
+
-ms-border-radius: 3px;
|
1034 |
+
-o-border-radius: 3px;
|
1035 |
+
border-radius: 3px;
|
1036 |
+
position: absolute;
|
1037 |
+
content: "\00D7";
|
1038 |
+
font-size: 26px;
|
1039 |
+
font-weight: normal;
|
1040 |
+
line-height: 31px;
|
1041 |
+
height: 30px;
|
1042 |
+
width: 30px;
|
1043 |
+
text-align: center;
|
1044 |
+
top: 3px;
|
1045 |
+
right: 3px;
|
1046 |
+
color: #bbbbbb;
|
1047 |
+
background: transparent;
|
1048 |
+
}
|
1049 |
+
/* line 66, ../sass/_vex-theme-bottom-right-corner.sass */
|
1050 |
+
.vex.vex-theme-bottom-right-corner .vex-close:hover:before, .vex.vex-theme-bottom-right-corner .vex-close:active:before,
|
1051 |
+
.vex.vex-theme-bottom-left-corner .vex-close:hover:before,
|
1052 |
+
.vex.vex-theme-bottom-left-corner .vex-close:active:before {
|
1053 |
+
color: #777777;
|
1054 |
+
background: #e0e0e0;
|
1055 |
+
}
|
1056 |
+
/* line 72, ../sass/_vex-theme-bottom-right-corner.sass */
|
1057 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-message,
|
1058 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-message {
|
1059 |
+
margin-bottom: 0.5em;
|
1060 |
+
}
|
1061 |
+
/* line 75, ../sass/_vex-theme-bottom-right-corner.sass */
|
1062 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input,
|
1063 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input {
|
1064 |
+
margin-bottom: 1em;
|
1065 |
+
}
|
1066 |
+
/* line 78, ../sass/_vex-theme-bottom-right-corner.sass */
|
1067 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="week"],
|
1068 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input textarea,
|
1069 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="date"],
|
1070 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime"],
|
1071 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"],
|
1072 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="email"],
|
1073 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="month"],
|
1074 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="number"],
|
1075 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="password"],
|
1076 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="search"],
|
1077 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="tel"],
|
1078 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="text"],
|
1079 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="time"],
|
1080 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="url"],
|
1081 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="week"] {
|
1082 |
+
-webkit-border-radius: 3px;
|
1083 |
+
-moz-border-radius: 3px;
|
1084 |
+
-ms-border-radius: 3px;
|
1085 |
+
-o-border-radius: 3px;
|
1086 |
+
border-radius: 3px;
|
1087 |
+
background: white;
|
1088 |
+
width: 100%;
|
1089 |
+
padding: 0.25em 0.67em;
|
1090 |
+
border: 0;
|
1091 |
+
font-family: inherit;
|
1092 |
+
font-weight: inherit;
|
1093 |
+
font-size: inherit;
|
1094 |
+
min-height: 2.5em;
|
1095 |
+
margin: 0 0 0.25em;
|
1096 |
+
}
|
1097 |
+
/* line 90, ../sass/_vex-theme-bottom-right-corner.sass */
|
1098 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type="week"]:focus,
|
1099 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input textarea:focus,
|
1100 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="date"]:focus,
|
1101 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus,
|
1102 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus,
|
1103 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="email"]:focus,
|
1104 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="month"]:focus,
|
1105 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="number"]:focus,
|
1106 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="password"]:focus,
|
1107 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="search"]:focus,
|
1108 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="tel"]:focus,
|
1109 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="text"]:focus,
|
1110 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="time"]:focus,
|
1111 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="url"]:focus,
|
1112 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
|
1113 |
+
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1114 |
+
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1115 |
+
box-shadow: inset 0 0 0 2px #8dbdf1;
|
1116 |
+
outline: none;
|
1117 |
+
}
|
1118 |
+
/* line 94, ../sass/_vex-theme-bottom-right-corner.sass */
|
1119 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-buttons,
|
1120 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-buttons {
|
1121 |
+
*zoom: 1;
|
1122 |
+
}
|
1123 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
1124 |
+
.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-buttons:after,
|
1125 |
+
.vex.vex-theme-bottom-left-corner .vex-dialog-form .vex-dialog-buttons:after {
|
1126 |
+
content: "";
|
1127 |
+
display: table;
|
1128 |
+
clear: both;
|
1129 |
+
}
|
1130 |
+
|
1131 |
+
/* line 99, ../sass/_vex-theme-bottom-right-corner.sass */
|
1132 |
+
.vex.vex-theme-bottom-right-corner .vex-content {
|
1133 |
+
-webkit-border-radius: 5px 0 0 0;
|
1134 |
+
-moz-border-radius: 5px 0 0 0;
|
1135 |
+
-ms-border-radius: 5px 0 0 0;
|
1136 |
+
-o-border-radius: 5px 0 0 0;
|
1137 |
+
border-radius: 5px 0 0 0;
|
1138 |
+
right: 0;
|
1139 |
+
left: auto;
|
1140 |
+
}
|
1141 |
+
|
1142 |
+
/* line 106, ../sass/_vex-theme-bottom-right-corner.sass */
|
1143 |
+
.vex.vex-theme-bottom-left-corner .vex-content {
|
1144 |
+
-webkit-border-radius: 0 5px 0 0;
|
1145 |
+
-moz-border-radius: 0 5px 0 0;
|
1146 |
+
-ms-border-radius: 0 5px 0 0;
|
1147 |
+
-o-border-radius: 0 5px 0 0;
|
1148 |
+
border-radius: 0 5px 0 0;
|
1149 |
+
left: 0;
|
1150 |
+
right: auto;
|
1151 |
+
}
|
1152 |
+
|
1153 |
+
/* line 111, ../sass/_vex-theme-bottom-right-corner.sass */
|
1154 |
+
.vex-loading-spinner.vex-theme-bottom-right-corner {
|
1155 |
+
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1156 |
+
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1157 |
+
box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1158 |
+
-webkit-border-radius: 100%;
|
1159 |
+
-moz-border-radius: 100%;
|
1160 |
+
-ms-border-radius: 100%;
|
1161 |
+
-o-border-radius: 100%;
|
1162 |
+
border-radius: 100%;
|
1163 |
+
background: #f0f0f0;
|
1164 |
+
border: 0.2em solid transparent;
|
1165 |
+
border-top-color: #bbbbbb;
|
1166 |
+
top: -1.1em;
|
1167 |
+
bottom: auto;
|
1168 |
+
}
|
1169 |
+
|
1170 |
+
@keyframes vex-dropin {
|
1171 |
+
/* line 51, ../sass/_keyframes.sass */
|
1172 |
+
0% {
|
1173 |
+
transform: translateY(0);
|
1174 |
+
-webkit-transform: translateY(0);
|
1175 |
+
-moz-transform: translateY(0);
|
1176 |
+
-ms-transform: translateY(0);
|
1177 |
+
-o-transform: translateY(0);
|
1178 |
+
opacity: 0;
|
1179 |
+
}
|
1180 |
+
|
1181 |
+
/* line 54, ../sass/_keyframes.sass */
|
1182 |
+
1% {
|
1183 |
+
transform: translateY(-800px);
|
1184 |
+
-webkit-transform: translateY(-800px);
|
1185 |
+
-moz-transform: translateY(-800px);
|
1186 |
+
-ms-transform: translateY(-800px);
|
1187 |
+
-o-transform: translateY(-800px);
|
1188 |
+
opacity: 0;
|
1189 |
+
}
|
1190 |
+
|
1191 |
+
/* line 59, ../sass/_keyframes.sass */
|
1192 |
+
2% {
|
1193 |
+
transform: translateY(-800px);
|
1194 |
+
-webkit-transform: translateY(-800px);
|
1195 |
+
-moz-transform: translateY(-800px);
|
1196 |
+
-ms-transform: translateY(-800px);
|
1197 |
+
-o-transform: translateY(-800px);
|
1198 |
+
opacity: 1;
|
1199 |
+
}
|
1200 |
+
|
1201 |
+
/* line 62, ../sass/_keyframes.sass */
|
1202 |
+
100% {
|
1203 |
+
transform: translateY(0);
|
1204 |
+
-webkit-transform: translateY(0);
|
1205 |
+
-moz-transform: translateY(0);
|
1206 |
+
-ms-transform: translateY(0);
|
1207 |
+
-o-transform: translateY(0);
|
1208 |
+
opacity: 1;
|
1209 |
+
}
|
1210 |
+
}
|
1211 |
+
|
1212 |
+
@-webkit-keyframes vex-dropin {
|
1213 |
+
/* line 51, ../sass/_keyframes.sass */
|
1214 |
+
0% {
|
1215 |
+
transform: translateY(0);
|
1216 |
+
-webkit-transform: translateY(0);
|
1217 |
+
-moz-transform: translateY(0);
|
1218 |
+
-ms-transform: translateY(0);
|
1219 |
+
-o-transform: translateY(0);
|
1220 |
+
opacity: 0;
|
1221 |
+
}
|
1222 |
+
|
1223 |
+
/* line 54, ../sass/_keyframes.sass */
|
1224 |
+
1% {
|
1225 |
+
transform: translateY(-800px);
|
1226 |
+
-webkit-transform: translateY(-800px);
|
1227 |
+
-moz-transform: translateY(-800px);
|
1228 |
+
-ms-transform: translateY(-800px);
|
1229 |
+
-o-transform: translateY(-800px);
|
1230 |
+
opacity: 0;
|
1231 |
+
}
|
1232 |
+
|
1233 |
+
/* line 59, ../sass/_keyframes.sass */
|
1234 |
+
2% {
|
1235 |
+
transform: translateY(-800px);
|
1236 |
+
-webkit-transform: translateY(-800px);
|
1237 |
+
-moz-transform: translateY(-800px);
|
1238 |
+
-ms-transform: translateY(-800px);
|
1239 |
+
-o-transform: translateY(-800px);
|
1240 |
+
opacity: 1;
|
1241 |
+
}
|
1242 |
+
|
1243 |
+
/* line 62, ../sass/_keyframes.sass */
|
1244 |
+
100% {
|
1245 |
+
transform: translateY(0);
|
1246 |
+
-webkit-transform: translateY(0);
|
1247 |
+
-moz-transform: translateY(0);
|
1248 |
+
-ms-transform: translateY(0);
|
1249 |
+
-o-transform: translateY(0);
|
1250 |
+
opacity: 1;
|
1251 |
+
}
|
1252 |
+
}
|
1253 |
+
|
1254 |
+
@-moz-keyframes vex-dropin {
|
1255 |
+
/* line 51, ../sass/_keyframes.sass */
|
1256 |
+
0% {
|
1257 |
+
transform: translateY(0);
|
1258 |
+
-webkit-transform: translateY(0);
|
1259 |
+
-moz-transform: translateY(0);
|
1260 |
+
-ms-transform: translateY(0);
|
1261 |
+
-o-transform: translateY(0);
|
1262 |
+
opacity: 0;
|
1263 |
+
}
|
1264 |
+
|
1265 |
+
/* line 54, ../sass/_keyframes.sass */
|
1266 |
+
1% {
|
1267 |
+
transform: translateY(-800px);
|
1268 |
+
-webkit-transform: translateY(-800px);
|
1269 |
+
-moz-transform: translateY(-800px);
|
1270 |
+
-ms-transform: translateY(-800px);
|
1271 |
+
-o-transform: translateY(-800px);
|
1272 |
+
opacity: 0;
|
1273 |
+
}
|
1274 |
+
|
1275 |
+
/* line 59, ../sass/_keyframes.sass */
|
1276 |
+
2% {
|
1277 |
+
transform: translateY(-800px);
|
1278 |
+
-webkit-transform: translateY(-800px);
|
1279 |
+
-moz-transform: translateY(-800px);
|
1280 |
+
-ms-transform: translateY(-800px);
|
1281 |
+
-o-transform: translateY(-800px);
|
1282 |
+
opacity: 1;
|
1283 |
+
}
|
1284 |
+
|
1285 |
+
/* line 62, ../sass/_keyframes.sass */
|
1286 |
+
100% {
|
1287 |
+
transform: translateY(0);
|
1288 |
+
-webkit-transform: translateY(0);
|
1289 |
+
-moz-transform: translateY(0);
|
1290 |
+
-ms-transform: translateY(0);
|
1291 |
+
-o-transform: translateY(0);
|
1292 |
+
opacity: 1;
|
1293 |
+
}
|
1294 |
+
}
|
1295 |
+
|
1296 |
+
@-ms-keyframes vex-dropin {
|
1297 |
+
/* line 51, ../sass/_keyframes.sass */
|
1298 |
+
0% {
|
1299 |
+
transform: translateY(0);
|
1300 |
+
-webkit-transform: translateY(0);
|
1301 |
+
-moz-transform: translateY(0);
|
1302 |
+
-ms-transform: translateY(0);
|
1303 |
+
-o-transform: translateY(0);
|
1304 |
+
opacity: 0;
|
1305 |
+
}
|
1306 |
+
|
1307 |
+
/* line 54, ../sass/_keyframes.sass */
|
1308 |
+
1% {
|
1309 |
+
transform: translateY(-800px);
|
1310 |
+
-webkit-transform: translateY(-800px);
|
1311 |
+
-moz-transform: translateY(-800px);
|
1312 |
+
-ms-transform: translateY(-800px);
|
1313 |
+
-o-transform: translateY(-800px);
|
1314 |
+
opacity: 0;
|
1315 |
+
}
|
1316 |
+
|
1317 |
+
/* line 59, ../sass/_keyframes.sass */
|
1318 |
+
2% {
|
1319 |
+
transform: translateY(-800px);
|
1320 |
+
-webkit-transform: translateY(-800px);
|
1321 |
+
-moz-transform: translateY(-800px);
|
1322 |
+
-ms-transform: translateY(-800px);
|
1323 |
+
-o-transform: translateY(-800px);
|
1324 |
+
opacity: 1;
|
1325 |
+
}
|
1326 |
+
|
1327 |
+
/* line 62, ../sass/_keyframes.sass */
|
1328 |
+
100% {
|
1329 |
+
transform: translateY(0);
|
1330 |
+
-webkit-transform: translateY(0);
|
1331 |
+
-moz-transform: translateY(0);
|
1332 |
+
-ms-transform: translateY(0);
|
1333 |
+
-o-transform: translateY(0);
|
1334 |
+
opacity: 1;
|
1335 |
+
}
|
1336 |
+
}
|
1337 |
+
|
1338 |
+
@-o-keyframes vex-dropin {
|
1339 |
+
/* line 51, ../sass/_keyframes.sass */
|
1340 |
+
0% {
|
1341 |
+
transform: translateY(0);
|
1342 |
+
-webkit-transform: translateY(0);
|
1343 |
+
-moz-transform: translateY(0);
|
1344 |
+
-ms-transform: translateY(0);
|
1345 |
+
-o-transform: translateY(0);
|
1346 |
+
opacity: 0;
|
1347 |
+
}
|
1348 |
+
|
1349 |
+
/* line 54, ../sass/_keyframes.sass */
|
1350 |
+
1% {
|
1351 |
+
transform: translateY(-800px);
|
1352 |
+
-webkit-transform: translateY(-800px);
|
1353 |
+
-moz-transform: translateY(-800px);
|
1354 |
+
-ms-transform: translateY(-800px);
|
1355 |
+
-o-transform: translateY(-800px);
|
1356 |
+
opacity: 0;
|
1357 |
+
}
|
1358 |
+
|
1359 |
+
/* line 59, ../sass/_keyframes.sass */
|
1360 |
+
2% {
|
1361 |
+
transform: translateY(-800px);
|
1362 |
+
-webkit-transform: translateY(-800px);
|
1363 |
+
-moz-transform: translateY(-800px);
|
1364 |
+
-ms-transform: translateY(-800px);
|
1365 |
+
-o-transform: translateY(-800px);
|
1366 |
+
opacity: 1;
|
1367 |
+
}
|
1368 |
+
|
1369 |
+
/* line 62, ../sass/_keyframes.sass */
|
1370 |
+
100% {
|
1371 |
+
transform: translateY(0);
|
1372 |
+
-webkit-transform: translateY(0);
|
1373 |
+
-moz-transform: translateY(0);
|
1374 |
+
-ms-transform: translateY(0);
|
1375 |
+
-o-transform: translateY(0);
|
1376 |
+
opacity: 1;
|
1377 |
+
}
|
1378 |
+
}
|
1379 |
+
|
1380 |
+
@keyframes vex-dropout {
|
1381 |
+
/* line 68, ../sass/_keyframes.sass */
|
1382 |
+
0% {
|
1383 |
+
transform: translateY(0);
|
1384 |
+
-webkit-transform: translateY(0);
|
1385 |
+
-moz-transform: translateY(0);
|
1386 |
+
-ms-transform: translateY(0);
|
1387 |
+
-o-transform: translateY(0);
|
1388 |
+
}
|
1389 |
+
|
1390 |
+
/* line 70, ../sass/_keyframes.sass */
|
1391 |
+
100% {
|
1392 |
+
transform: translateY(-800px);
|
1393 |
+
-webkit-transform: translateY(-800px);
|
1394 |
+
-moz-transform: translateY(-800px);
|
1395 |
+
-ms-transform: translateY(-800px);
|
1396 |
+
-o-transform: translateY(-800px);
|
1397 |
+
}
|
1398 |
+
}
|
1399 |
+
|
1400 |
+
@-webkit-keyframes vex-dropout {
|
1401 |
+
/* line 68, ../sass/_keyframes.sass */
|
1402 |
+
0% {
|
1403 |
+
transform: translateY(0);
|
1404 |
+
-webkit-transform: translateY(0);
|
1405 |
+
-moz-transform: translateY(0);
|
1406 |
+
-ms-transform: translateY(0);
|
1407 |
+
-o-transform: translateY(0);
|
1408 |
+
}
|
1409 |
+
|
1410 |
+
/* line 70, ../sass/_keyframes.sass */
|
1411 |
+
100% {
|
1412 |
+
transform: translateY(-800px);
|
1413 |
+
-webkit-transform: translateY(-800px);
|
1414 |
+
-moz-transform: translateY(-800px);
|
1415 |
+
-ms-transform: translateY(-800px);
|
1416 |
+
-o-transform: translateY(-800px);
|
1417 |
+
}
|
1418 |
+
}
|
1419 |
+
|
1420 |
+
@-moz-keyframes vex-dropout {
|
1421 |
+
/* line 68, ../sass/_keyframes.sass */
|
1422 |
+
0% {
|
1423 |
+
transform: translateY(0);
|
1424 |
+
-webkit-transform: translateY(0);
|
1425 |
+
-moz-transform: translateY(0);
|
1426 |
+
-ms-transform: translateY(0);
|
1427 |
+
-o-transform: translateY(0);
|
1428 |
+
}
|
1429 |
+
|
1430 |
+
/* line 70, ../sass/_keyframes.sass */
|
1431 |
+
100% {
|
1432 |
+
transform: translateY(-800px);
|
1433 |
+
-webkit-transform: translateY(-800px);
|
1434 |
+
-moz-transform: translateY(-800px);
|
1435 |
+
-ms-transform: translateY(-800px);
|
1436 |
+
-o-transform: translateY(-800px);
|
1437 |
+
}
|
1438 |
+
}
|
1439 |
+
|
1440 |
+
@-ms-keyframes vex-dropout {
|
1441 |
+
/* line 68, ../sass/_keyframes.sass */
|
1442 |
+
0% {
|
1443 |
+
transform: translateY(0);
|
1444 |
+
-webkit-transform: translateY(0);
|
1445 |
+
-moz-transform: translateY(0);
|
1446 |
+
-ms-transform: translateY(0);
|
1447 |
+
-o-transform: translateY(0);
|
1448 |
+
}
|
1449 |
+
|
1450 |
+
/* line 70, ../sass/_keyframes.sass */
|
1451 |
+
100% {
|
1452 |
+
transform: translateY(-800px);
|
1453 |
+
-webkit-transform: translateY(-800px);
|
1454 |
+
-moz-transform: translateY(-800px);
|
1455 |
+
-ms-transform: translateY(-800px);
|
1456 |
+
-o-transform: translateY(-800px);
|
1457 |
+
}
|
1458 |
+
}
|
1459 |
+
|
1460 |
+
@-o-keyframes vex-dropout {
|
1461 |
+
/* line 68, ../sass/_keyframes.sass */
|
1462 |
+
0% {
|
1463 |
+
transform: translateY(0);
|
1464 |
+
-webkit-transform: translateY(0);
|
1465 |
+
-moz-transform: translateY(0);
|
1466 |
+
-ms-transform: translateY(0);
|
1467 |
+
-o-transform: translateY(0);
|
1468 |
+
}
|
1469 |
+
|
1470 |
+
/* line 70, ../sass/_keyframes.sass */
|
1471 |
+
100% {
|
1472 |
+
transform: translateY(-800px);
|
1473 |
+
-webkit-transform: translateY(-800px);
|
1474 |
+
-moz-transform: translateY(-800px);
|
1475 |
+
-ms-transform: translateY(-800px);
|
1476 |
+
-o-transform: translateY(-800px);
|
1477 |
+
}
|
1478 |
+
}
|
1479 |
+
|
1480 |
+
@keyframes vex-pulse {
|
1481 |
+
/* line 136, ../sass/_keyframes.sass */
|
1482 |
+
0% {
|
1483 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1484 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1485 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1486 |
+
}
|
1487 |
+
|
1488 |
+
/* line 138, ../sass/_keyframes.sass */
|
1489 |
+
70% {
|
1490 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1491 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1492 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1493 |
+
}
|
1494 |
+
|
1495 |
+
/* line 140, ../sass/_keyframes.sass */
|
1496 |
+
100% {
|
1497 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1498 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1499 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1500 |
+
}
|
1501 |
+
}
|
1502 |
+
|
1503 |
+
@-webkit-keyframes vex-pulse {
|
1504 |
+
/* line 136, ../sass/_keyframes.sass */
|
1505 |
+
0% {
|
1506 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1507 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1508 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1509 |
+
}
|
1510 |
+
|
1511 |
+
/* line 138, ../sass/_keyframes.sass */
|
1512 |
+
70% {
|
1513 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1514 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1515 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1516 |
+
}
|
1517 |
+
|
1518 |
+
/* line 140, ../sass/_keyframes.sass */
|
1519 |
+
100% {
|
1520 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1521 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1522 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1523 |
+
}
|
1524 |
+
}
|
1525 |
+
|
1526 |
+
@-moz-keyframes vex-pulse {
|
1527 |
+
/* line 136, ../sass/_keyframes.sass */
|
1528 |
+
0% {
|
1529 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1530 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1531 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1532 |
+
}
|
1533 |
+
|
1534 |
+
/* line 138, ../sass/_keyframes.sass */
|
1535 |
+
70% {
|
1536 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1537 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1538 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1539 |
+
}
|
1540 |
+
|
1541 |
+
/* line 140, ../sass/_keyframes.sass */
|
1542 |
+
100% {
|
1543 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1544 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1545 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1546 |
+
}
|
1547 |
+
}
|
1548 |
+
|
1549 |
+
@-ms-keyframes vex-pulse {
|
1550 |
+
/* line 136, ../sass/_keyframes.sass */
|
1551 |
+
0% {
|
1552 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1553 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1554 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1555 |
+
}
|
1556 |
+
|
1557 |
+
/* line 138, ../sass/_keyframes.sass */
|
1558 |
+
70% {
|
1559 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1560 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1561 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1562 |
+
}
|
1563 |
+
|
1564 |
+
/* line 140, ../sass/_keyframes.sass */
|
1565 |
+
100% {
|
1566 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1567 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1568 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1569 |
+
}
|
1570 |
+
}
|
1571 |
+
|
1572 |
+
@-o-keyframes vex-pulse {
|
1573 |
+
/* line 136, ../sass/_keyframes.sass */
|
1574 |
+
0% {
|
1575 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1576 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1577 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1578 |
+
}
|
1579 |
+
|
1580 |
+
/* line 138, ../sass/_keyframes.sass */
|
1581 |
+
70% {
|
1582 |
+
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1583 |
+
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1584 |
+
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
1585 |
+
}
|
1586 |
+
|
1587 |
+
/* line 140, ../sass/_keyframes.sass */
|
1588 |
+
100% {
|
1589 |
+
-webkit-box-shadow: inset 0 0 0 300px transparent;
|
1590 |
+
-moz-box-shadow: inset 0 0 0 300px transparent;
|
1591 |
+
box-shadow: inset 0 0 0 300px transparent;
|
1592 |
+
}
|
1593 |
+
}
|
1594 |
+
|
1595 |
+
/* line 13, ../sass/_vex-theme-top.sass */
|
1596 |
+
.vex.vex-theme-top {
|
1597 |
+
bottom: inherit;
|
1598 |
+
}
|
1599 |
+
/* line 16, ../sass/_vex-theme-top.sass */
|
1600 |
+
.vex.vex-theme-top .vex-overlay {
|
1601 |
+
display: none;
|
1602 |
+
}
|
1603 |
+
/* line 19, ../sass/_vex-theme-top.sass */
|
1604 |
+
.vex.vex-theme-top.vex-closing .vex-content {
|
1605 |
+
animation: vex-dropout 0.5s;
|
1606 |
+
-webkit-animation: vex-dropout 0.5s;
|
1607 |
+
-moz-animation: vex-dropout 0.5s;
|
1608 |
+
-ms-animation: vex-dropout 0.5s;
|
1609 |
+
-o-animation: vex-dropout 0.5s;
|
1610 |
+
-webkit-backface-visibility: hidden;
|
1611 |
+
}
|
1612 |
+
/* line 22, ../sass/_vex-theme-top.sass */
|
1613 |
+
.vex.vex-theme-top .vex-content {
|
1614 |
+
animation: vex-dropin 0.5s;
|
1615 |
+
-webkit-animation: vex-dropin 0.5s;
|
1616 |
+
-moz-animation: vex-dropin 0.5s;
|
1617 |
+
-ms-animation: vex-dropin 0.5s;
|
1618 |
+
-o-animation: vex-dropin 0.5s;
|
1619 |
+
-webkit-backface-visibility: hidden;
|
1620 |
+
*zoom: 1;
|
1621 |
+
font-family: "Helvetica Neue", sans-serif;
|
1622 |
+
background: #f0f0f0;
|
1623 |
+
color: #444444;
|
1624 |
+
padding: 0.5em 0.5em 0.25em;
|
1625 |
+
position: relative;
|
1626 |
+
margin: 0 auto;
|
1627 |
+
max-width: 100%;
|
1628 |
+
font-size: 1.1em;
|
1629 |
+
line-height: 1.5em;
|
1630 |
+
}
|
1631 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
1632 |
+
.vex.vex-theme-top .vex-content:after {
|
1633 |
+
content: "";
|
1634 |
+
display: table;
|
1635 |
+
clear: both;
|
1636 |
+
}
|
1637 |
+
/* line 35, ../sass/_vex-theme-top.sass */
|
1638 |
+
.vex.vex-theme-top .vex-content h1, .vex.vex-theme-top .vex-content h2, .vex.vex-theme-top .vex-content h3, .vex.vex-theme-top .vex-content h4, .vex.vex-theme-top .vex-content h5, .vex.vex-theme-top .vex-content h6, .vex.vex-theme-top .vex-content p, .vex.vex-theme-top .vex-content ul, .vex.vex-theme-top .vex-content li {
|
1639 |
+
color: inherit;
|
1640 |
+
}
|
1641 |
+
/* line 38, ../sass/_vex-theme-top.sass */
|
1642 |
+
.vex.vex-theme-top .vex-close {
|
1643 |
+
-webkit-border-radius: 5px;
|
1644 |
+
-moz-border-radius: 5px;
|
1645 |
+
-ms-border-radius: 5px;
|
1646 |
+
-o-border-radius: 5px;
|
1647 |
+
border-radius: 5px;
|
1648 |
+
position: absolute;
|
1649 |
+
top: 0;
|
1650 |
+
right: 0;
|
1651 |
+
cursor: pointer;
|
1652 |
+
}
|
1653 |
+
/* line 45, ../sass/_vex-theme-top.sass */
|
1654 |
+
.vex.vex-theme-top .vex-close:before {
|
1655 |
+
-webkit-border-radius: 3px;
|
1656 |
+
-moz-border-radius: 3px;
|
1657 |
+
-ms-border-radius: 3px;
|
1658 |
+
-o-border-radius: 3px;
|
1659 |
+
border-radius: 3px;
|
1660 |
+
position: absolute;
|
1661 |
+
content: "\00D7";
|
1662 |
+
font-size: 26px;
|
1663 |
+
font-weight: normal;
|
1664 |
+
line-height: 31px;
|
1665 |
+
height: 30px;
|
1666 |
+
width: 30px;
|
1667 |
+
text-align: center;
|
1668 |
+
top: 3px;
|
1669 |
+
right: 3px;
|
1670 |
+
color: #bbbbbb;
|
1671 |
+
background: transparent;
|
1672 |
+
}
|
1673 |
+
/* line 60, ../sass/_vex-theme-top.sass */
|
1674 |
+
.vex.vex-theme-top .vex-close:hover:before, .vex.vex-theme-top .vex-close:active:before {
|
1675 |
+
color: #777777;
|
1676 |
+
background: #e0e0e0;
|
1677 |
+
}
|
1678 |
+
/* line 64, ../sass/_vex-theme-top.sass */
|
1679 |
+
.vex.vex-theme-top .vex-dialog-form {
|
1680 |
+
text-align: center;
|
1681 |
+
margin: 0 90px;
|
1682 |
+
}
|
1683 |
+
@media only screen and (max-width: 760px) {
|
1684 |
+
/* line 64, ../sass/_vex-theme-top.sass */
|
1685 |
+
.vex.vex-theme-top .vex-dialog-form {
|
1686 |
+
margin: 0 auto;
|
1687 |
+
}
|
1688 |
+
}
|
1689 |
+
/* line 71, ../sass/_vex-theme-top.sass */
|
1690 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-message, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input, .vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons {
|
1691 |
+
display: inline-block;
|
1692 |
+
}
|
1693 |
+
/* line 74, ../sass/_vex-theme-top.sass */
|
1694 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-input {
|
1695 |
+
min-width: 200px;
|
1696 |
+
margin: 0 1em;
|
1697 |
+
}
|
1698 |
+
/* line 78, ../sass/_vex-theme-top.sass */
|
1699 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="week"] {
|
1700 |
+
-webkit-border-radius: 3px;
|
1701 |
+
-moz-border-radius: 3px;
|
1702 |
+
-ms-border-radius: 3px;
|
1703 |
+
-o-border-radius: 3px;
|
1704 |
+
border-radius: 3px;
|
1705 |
+
background: white;
|
1706 |
+
width: 100%;
|
1707 |
+
padding: 0.25em 0.67em;
|
1708 |
+
border: 0;
|
1709 |
+
font-family: inherit;
|
1710 |
+
font-weight: inherit;
|
1711 |
+
font-size: inherit;
|
1712 |
+
min-height: 2.5em;
|
1713 |
+
margin: 0 0 0 0;
|
1714 |
+
}
|
1715 |
+
/* line 90, ../sass/_vex-theme-top.sass */
|
1716 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
|
1717 |
+
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1718 |
+
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
|
1719 |
+
box-shadow: inset 0 0 0 2px #8dbdf1;
|
1720 |
+
outline: none;
|
1721 |
+
}
|
1722 |
+
/* line 94, ../sass/_vex-theme-top.sass */
|
1723 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons {
|
1724 |
+
*zoom: 1;
|
1725 |
+
}
|
1726 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
1727 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons:after {
|
1728 |
+
content: "";
|
1729 |
+
display: table;
|
1730 |
+
clear: both;
|
1731 |
+
}
|
1732 |
+
/* line 97, ../sass/_vex-theme-top.sass */
|
1733 |
+
.vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons input {
|
1734 |
+
float: none;
|
1735 |
+
}
|
1736 |
+
/* line 100, ../sass/_vex-theme-top.sass */
|
1737 |
+
.vex.vex-theme-top .leadin-subscribe-powered-by {
|
1738 |
+
position: absolute;
|
1739 |
+
bottom: 0.5em;
|
1740 |
+
right: 0.5em;
|
1741 |
+
}
|
1742 |
+
/* line 105, ../sass/_vex-theme-top.sass */
|
1743 |
+
.vex.vex-theme-top .vex-dialog-button {
|
1744 |
+
-webkit-border-radius: 3px;
|
1745 |
+
-moz-border-radius: 3px;
|
1746 |
+
-ms-border-radius: 3px;
|
1747 |
+
-o-border-radius: 3px;
|
1748 |
+
border-radius: 3px;
|
1749 |
+
border: 0;
|
1750 |
+
float: right;
|
1751 |
+
margin: 0 0 0 0.5em;
|
1752 |
+
font-family: inherit;
|
1753 |
+
text-transform: uppercase;
|
1754 |
+
letter-spacing: 0.1em;
|
1755 |
+
font-size: 0.8em;
|
1756 |
+
line-height: 1em;
|
1757 |
+
padding: 0.75em 2em;
|
1758 |
+
}
|
1759 |
+
/* line 117, ../sass/_vex-theme-top.sass */
|
1760 |
+
.vex.vex-theme-top .vex-dialog-button.vex-last {
|
1761 |
+
margin-left: 0;
|
1762 |
+
}
|
1763 |
+
/* line 120, ../sass/_vex-theme-top.sass */
|
1764 |
+
.vex.vex-theme-top .vex-dialog-button:focus {
|
1765 |
+
animation: vex-pulse 1.1s infinite;
|
1766 |
+
-webkit-animation: vex-pulse 1.1s infinite;
|
1767 |
+
-moz-animation: vex-pulse 1.1s infinite;
|
1768 |
+
-ms-animation: vex-pulse 1.1s infinite;
|
1769 |
+
-o-animation: vex-pulse 1.1s infinite;
|
1770 |
+
-webkit-backface-visibility: hidden;
|
1771 |
+
outline: none;
|
1772 |
+
}
|
1773 |
+
@media (max-width: 568px) {
|
1774 |
+
/* line 120, ../sass/_vex-theme-top.sass */
|
1775 |
+
.vex.vex-theme-top .vex-dialog-button:focus {
|
1776 |
+
animation: none;
|
1777 |
+
-webkit-animation: none;
|
1778 |
+
-moz-animation: none;
|
1779 |
+
-ms-animation: none;
|
1780 |
+
-o-animation: none;
|
1781 |
+
-webkit-backface-visibility: hidden;
|
1782 |
+
}
|
1783 |
+
}
|
1784 |
+
/* line 129, ../sass/_vex-theme-top.sass */
|
1785 |
+
.vex.vex-theme-top .vex-dialog-button.vex-dialog-button-primary {
|
1786 |
+
background: #3288e6;
|
1787 |
+
color: white;
|
1788 |
+
}
|
1789 |
+
/* line 133, ../sass/_vex-theme-top.sass */
|
1790 |
+
.vex.vex-theme-top .vex-dialog-button.vex-dialog-button-secondary {
|
1791 |
+
background: #e0e0e0;
|
1792 |
+
color: #777777;
|
1793 |
+
}
|
1794 |
+
|
1795 |
+
/* line 137, ../sass/_vex-theme-top.sass */
|
1796 |
+
.vex-loading-spinner.vex-theme-top {
|
1797 |
+
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1798 |
+
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1799 |
+
box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
1800 |
+
-webkit-border-radius: 100%;
|
1801 |
+
-moz-border-radius: 100%;
|
1802 |
+
-ms-border-radius: 100%;
|
1803 |
+
-o-border-radius: 100%;
|
1804 |
+
border-radius: 100%;
|
1805 |
+
background: #f0f0f0;
|
1806 |
+
border: 0.2em solid transparent;
|
1807 |
+
border-top-color: #bbbbbb;
|
1808 |
+
top: -1.1em;
|
1809 |
+
bottom: auto;
|
1810 |
+
}
|
1811 |
+
|
1812 |
+
@keyframes vex-fadein {
|
1813 |
+
/* line 9, ../sass/_keyframes.sass */
|
1814 |
+
0% {
|
1815 |
+
opacity: 0;
|
1816 |
+
}
|
1817 |
+
|
1818 |
+
/* line 11, ../sass/_keyframes.sass */
|
1819 |
+
100% {
|
1820 |
+
opacity: 1;
|
1821 |
+
}
|
1822 |
+
}
|
1823 |
+
|
1824 |
+
@-webkit-keyframes vex-fadein {
|
1825 |
+
/* line 9, ../sass/_keyframes.sass */
|
1826 |
+
0% {
|
1827 |
+
opacity: 0;
|
1828 |
+
}
|
1829 |
+
|
1830 |
+
/* line 11, ../sass/_keyframes.sass */
|
1831 |
+
100% {
|
1832 |
+
opacity: 1;
|
1833 |
+
}
|
1834 |
+
}
|
1835 |
+
|
1836 |
+
@-moz-keyframes vex-fadein {
|
1837 |
+
/* line 9, ../sass/_keyframes.sass */
|
1838 |
+
0% {
|
1839 |
+
opacity: 0;
|
1840 |
+
}
|
1841 |
+
|
1842 |
+
/* line 11, ../sass/_keyframes.sass */
|
1843 |
+
100% {
|
1844 |
+
opacity: 1;
|
1845 |
+
}
|
1846 |
+
}
|
1847 |
+
|
1848 |
+
@-ms-keyframes vex-fadein {
|
1849 |
+
/* line 9, ../sass/_keyframes.sass */
|
1850 |
+
0% {
|
1851 |
+
opacity: 0;
|
1852 |
+
}
|
1853 |
+
|
1854 |
+
/* line 11, ../sass/_keyframes.sass */
|
1855 |
+
100% {
|
1856 |
+
opacity: 1;
|
1857 |
+
}
|
1858 |
+
}
|
1859 |
+
|
1860 |
+
@-o-keyframes vex-fadein {
|
1861 |
+
/* line 9, ../sass/_keyframes.sass */
|
1862 |
+
0% {
|
1863 |
+
opacity: 0;
|
1864 |
+
}
|
1865 |
+
|
1866 |
+
/* line 11, ../sass/_keyframes.sass */
|
1867 |
+
100% {
|
1868 |
+
opacity: 1;
|
1869 |
+
}
|
1870 |
+
}
|
1871 |
+
|
1872 |
+
@keyframes vex-fadeout {
|
1873 |
+
/* line 16, ../sass/_keyframes.sass */
|
1874 |
+
0% {
|
1875 |
+
opacity: 1;
|
1876 |
+
}
|
1877 |
+
|
1878 |
+
/* line 18, ../sass/_keyframes.sass */
|
1879 |
+
100% {
|
1880 |
+
opacity: 0;
|
1881 |
+
}
|
1882 |
+
}
|
1883 |
+
|
1884 |
+
@-webkit-keyframes vex-fadeout {
|
1885 |
+
/* line 16, ../sass/_keyframes.sass */
|
1886 |
+
0% {
|
1887 |
+
opacity: 1;
|
1888 |
+
}
|
1889 |
+
|
1890 |
+
/* line 18, ../sass/_keyframes.sass */
|
1891 |
+
100% {
|
1892 |
+
opacity: 0;
|
1893 |
+
}
|
1894 |
+
}
|
1895 |
+
|
1896 |
+
@-moz-keyframes vex-fadeout {
|
1897 |
+
/* line 16, ../sass/_keyframes.sass */
|
1898 |
+
0% {
|
1899 |
+
opacity: 1;
|
1900 |
+
}
|
1901 |
+
|
1902 |
+
/* line 18, ../sass/_keyframes.sass */
|
1903 |
+
100% {
|
1904 |
+
opacity: 0;
|
1905 |
+
}
|
1906 |
+
}
|
1907 |
+
|
1908 |
+
@-ms-keyframes vex-fadeout {
|
1909 |
+
/* line 16, ../sass/_keyframes.sass */
|
1910 |
+
0% {
|
1911 |
+
opacity: 1;
|
1912 |
+
}
|
1913 |
+
|
1914 |
+
/* line 18, ../sass/_keyframes.sass */
|
1915 |
+
100% {
|
1916 |
+
opacity: 0;
|
1917 |
+
}
|
1918 |
+
}
|
1919 |
+
|
1920 |
+
@-o-keyframes vex-fadeout {
|
1921 |
+
/* line 16, ../sass/_keyframes.sass */
|
1922 |
+
0% {
|
1923 |
+
opacity: 1;
|
1924 |
+
}
|
1925 |
+
|
1926 |
+
/* line 18, ../sass/_keyframes.sass */
|
1927 |
+
100% {
|
1928 |
+
opacity: 0;
|
1929 |
+
}
|
1930 |
+
}
|
1931 |
+
|
1932 |
+
@keyframes vex-rotation {
|
1933 |
+
/* line 127, ../sass/_keyframes.sass */
|
1934 |
+
0% {
|
1935 |
+
transform: rotate(0deg);
|
1936 |
+
-webkit-transform: rotate(0deg);
|
1937 |
+
-moz-transform: rotate(0deg);
|
1938 |
+
-ms-transform: rotate(0deg);
|
1939 |
+
-o-transform: rotate(0deg);
|
1940 |
+
}
|
1941 |
+
|
1942 |
+
/* line 129, ../sass/_keyframes.sass */
|
1943 |
+
100% {
|
1944 |
+
transform: rotate(359deg);
|
1945 |
+
-webkit-transform: rotate(359deg);
|
1946 |
+
-moz-transform: rotate(359deg);
|
1947 |
+
-ms-transform: rotate(359deg);
|
1948 |
+
-o-transform: rotate(359deg);
|
1949 |
+
}
|
1950 |
+
}
|
1951 |
+
|
1952 |
+
@-webkit-keyframes vex-rotation {
|
1953 |
+
/* line 127, ../sass/_keyframes.sass */
|
1954 |
+
0% {
|
1955 |
+
transform: rotate(0deg);
|
1956 |
+
-webkit-transform: rotate(0deg);
|
1957 |
+
-moz-transform: rotate(0deg);
|
1958 |
+
-ms-transform: rotate(0deg);
|
1959 |
+
-o-transform: rotate(0deg);
|
1960 |
+
}
|
1961 |
+
|
1962 |
+
/* line 129, ../sass/_keyframes.sass */
|
1963 |
+
100% {
|
1964 |
+
transform: rotate(359deg);
|
1965 |
+
-webkit-transform: rotate(359deg);
|
1966 |
+
-moz-transform: rotate(359deg);
|
1967 |
+
-ms-transform: rotate(359deg);
|
1968 |
+
-o-transform: rotate(359deg);
|
1969 |
+
}
|
1970 |
+
}
|
1971 |
+
|
1972 |
+
@-moz-keyframes vex-rotation {
|
1973 |
+
/* line 127, ../sass/_keyframes.sass */
|
1974 |
+
0% {
|
1975 |
+
transform: rotate(0deg);
|
1976 |
+
-webkit-transform: rotate(0deg);
|
1977 |
+
-moz-transform: rotate(0deg);
|
1978 |
+
-ms-transform: rotate(0deg);
|
1979 |
+
-o-transform: rotate(0deg);
|
1980 |
+
}
|
1981 |
+
|
1982 |
+
/* line 129, ../sass/_keyframes.sass */
|
1983 |
+
100% {
|
1984 |
+
transform: rotate(359deg);
|
1985 |
+
-webkit-transform: rotate(359deg);
|
1986 |
+
-moz-transform: rotate(359deg);
|
1987 |
+
-ms-transform: rotate(359deg);
|
1988 |
+
-o-transform: rotate(359deg);
|
1989 |
+
}
|
1990 |
+
}
|
1991 |
+
|
1992 |
+
@-ms-keyframes vex-rotation {
|
1993 |
+
/* line 127, ../sass/_keyframes.sass */
|
1994 |
+
0% {
|
1995 |
+
transform: rotate(0deg);
|
1996 |
+
-webkit-transform: rotate(0deg);
|
1997 |
+
-moz-transform: rotate(0deg);
|
1998 |
+
-ms-transform: rotate(0deg);
|
1999 |
+
-o-transform: rotate(0deg);
|
2000 |
+
}
|
2001 |
+
|
2002 |
+
/* line 129, ../sass/_keyframes.sass */
|
2003 |
+
100% {
|
2004 |
+
transform: rotate(359deg);
|
2005 |
+
-webkit-transform: rotate(359deg);
|
2006 |
+
-moz-transform: rotate(359deg);
|
2007 |
+
-ms-transform: rotate(359deg);
|
2008 |
+
-o-transform: rotate(359deg);
|
2009 |
+
}
|
2010 |
+
}
|
2011 |
+
|
2012 |
+
@-o-keyframes vex-rotation {
|
2013 |
+
/* line 127, ../sass/_keyframes.sass */
|
2014 |
+
0% {
|
2015 |
+
transform: rotate(0deg);
|
2016 |
+
-webkit-transform: rotate(0deg);
|
2017 |
+
-moz-transform: rotate(0deg);
|
2018 |
+
-ms-transform: rotate(0deg);
|
2019 |
+
-o-transform: rotate(0deg);
|
2020 |
+
}
|
2021 |
+
|
2022 |
+
/* line 129, ../sass/_keyframes.sass */
|
2023 |
+
100% {
|
2024 |
+
transform: rotate(359deg);
|
2025 |
+
-webkit-transform: rotate(359deg);
|
2026 |
+
-moz-transform: rotate(359deg);
|
2027 |
+
-ms-transform: rotate(359deg);
|
2028 |
+
-o-transform: rotate(359deg);
|
2029 |
+
}
|
2030 |
+
}
|
2031 |
+
|
2032 |
+
/* line 16, ../sass/vex.sass */
|
2033 |
+
.vex, .vex *, .vex *:before, .vex *:after {
|
2034 |
+
-webkit-box-sizing: border-box;
|
2035 |
+
-moz-box-sizing: border-box;
|
2036 |
+
box-sizing: border-box;
|
2037 |
+
}
|
2038 |
+
|
2039 |
+
/* line 19, ../sass/vex.sass */
|
2040 |
+
.vex {
|
2041 |
+
position: fixed;
|
2042 |
+
overflow: visible;
|
2043 |
+
-webkit-overflow-scrolling: touch;
|
2044 |
+
z-index: 1111;
|
2045 |
+
top: 0;
|
2046 |
+
right: 0;
|
2047 |
+
bottom: 0;
|
2048 |
+
left: 0;
|
2049 |
+
}
|
2050 |
+
|
2051 |
+
/* line 30, ../sass/vex.sass */
|
2052 |
+
.vex-overlay {
|
2053 |
+
background: black;
|
2054 |
+
filter: alpha(opacity=40);
|
2055 |
+
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)";
|
2056 |
+
}
|
2057 |
+
|
2058 |
+
/* line 35, ../sass/vex.sass */
|
2059 |
+
.vex-overlay {
|
2060 |
+
animation: vex-fadein 0.5s;
|
2061 |
+
-webkit-animation: vex-fadein 0.5s;
|
2062 |
+
-moz-animation: vex-fadein 0.5s;
|
2063 |
+
-ms-animation: vex-fadein 0.5s;
|
2064 |
+
-o-animation: vex-fadein 0.5s;
|
2065 |
+
-webkit-backface-visibility: hidden;
|
2066 |
+
position: fixed;
|
2067 |
+
background: rgba(0, 0, 0, 0.4);
|
2068 |
+
top: 0;
|
2069 |
+
right: 0;
|
2070 |
+
bottom: 0;
|
2071 |
+
left: 0;
|
2072 |
+
}
|
2073 |
+
/* line 44, ../sass/vex.sass */
|
2074 |
+
.vex.vex-closing .vex-overlay {
|
2075 |
+
animation: vex-fadeout 0.5s;
|
2076 |
+
-webkit-animation: vex-fadeout 0.5s;
|
2077 |
+
-moz-animation: vex-fadeout 0.5s;
|
2078 |
+
-ms-animation: vex-fadeout 0.5s;
|
2079 |
+
-o-animation: vex-fadeout 0.5s;
|
2080 |
+
-webkit-backface-visibility: hidden;
|
2081 |
+
}
|
2082 |
+
|
2083 |
+
/* line 47, ../sass/vex.sass */
|
2084 |
+
.vex-content {
|
2085 |
+
*zoom: 1;
|
2086 |
+
animation: vex-fadein 0.5s;
|
2087 |
+
-webkit-animation: vex-fadein 0.5s;
|
2088 |
+
-moz-animation: vex-fadein 0.5s;
|
2089 |
+
-ms-animation: vex-fadein 0.5s;
|
2090 |
+
-o-animation: vex-fadein 0.5s;
|
2091 |
+
-webkit-backface-visibility: hidden;
|
2092 |
+
-webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
2093 |
+
-moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
2094 |
+
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
2095 |
+
background: white;
|
2096 |
+
}
|
2097 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
2098 |
+
.vex-content:after {
|
2099 |
+
content: "";
|
2100 |
+
display: table;
|
2101 |
+
clear: both;
|
2102 |
+
}
|
2103 |
+
/* line 53, ../sass/vex.sass */
|
2104 |
+
.vex.vex-closing .vex-content {
|
2105 |
+
animation: vex-fadeout 0.5s;
|
2106 |
+
-webkit-animation: vex-fadeout 0.5s;
|
2107 |
+
-moz-animation: vex-fadeout 0.5s;
|
2108 |
+
-ms-animation: vex-fadeout 0.5s;
|
2109 |
+
-o-animation: vex-fadeout 0.5s;
|
2110 |
+
-webkit-backface-visibility: hidden;
|
2111 |
+
}
|
2112 |
+
/* line 56, ../sass/vex.sass */
|
2113 |
+
.vex-content .powered-by {
|
2114 |
+
display: block;
|
2115 |
+
font-size: 11px;
|
2116 |
+
color: #888888;
|
2117 |
+
padding: 10px 0 0 0;
|
2118 |
+
}
|
2119 |
+
/* line 62, ../sass/vex.sass */
|
2120 |
+
.vex-content .vex-dialog-message, .vex-content .vex-dialog-input, .vex-content .vex-dialog-buttons {
|
2121 |
+
*zoom: 1;
|
2122 |
+
font-size: 16px;
|
2123 |
+
}
|
2124 |
+
/* line 38, ../../../../../../../../../.rvm/gems/ruby-1.9.3-p194/gems/compass-0.12.2/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss */
|
2125 |
+
.vex-content .vex-dialog-message:after, .vex-content .vex-dialog-input:after, .vex-content .vex-dialog-buttons:after {
|
2126 |
+
content: "";
|
2127 |
+
display: table;
|
2128 |
+
clear: both;
|
2129 |
+
}
|
2130 |
+
/* line 66, ../sass/vex.sass */
|
2131 |
+
.vex-content .leadin-subscribe-powered-by {
|
2132 |
+
float: right;
|
2133 |
+
font-size: 12px;
|
2134 |
+
font-weight: bold;
|
2135 |
+
color: #3288e6;
|
2136 |
+
}
|
2137 |
+
|
2138 |
+
/* line 72, ../sass/vex.sass */
|
2139 |
+
.vex-close:before {
|
2140 |
+
font-family: Arial, sans-serif;
|
2141 |
+
content: "\00D7";
|
2142 |
+
}
|
2143 |
+
|
2144 |
+
/* line 76, ../sass/vex.sass */
|
2145 |
+
.vex-dialog-form {
|
2146 |
+
margin: 0;
|
2147 |
+
}
|
2148 |
+
/* line 79, ../sass/vex.sass */
|
2149 |
+
.vex-dialog-form .vex-dialog-message {
|
2150 |
+
font-weight: bold;
|
2151 |
+
}
|
2152 |
+
|
2153 |
+
/* line 82, ../sass/vex.sass */
|
2154 |
+
.vex-dialog-button {
|
2155 |
+
-webkit-appearance: none;
|
2156 |
+
cursor: pointer;
|
2157 |
+
-webkit-border-radius: 3px;
|
2158 |
+
-moz-border-radius: 3px;
|
2159 |
+
-ms-border-radius: 3px;
|
2160 |
+
-o-border-radius: 3px;
|
2161 |
+
border-radius: 3px;
|
2162 |
+
float: right;
|
2163 |
+
margin: 0 0 0 0.5em;
|
2164 |
+
font-family: inherit;
|
2165 |
+
text-transform: uppercase;
|
2166 |
+
letter-spacing: 0.1em;
|
2167 |
+
font-size: 0.8em;
|
2168 |
+
line-height: 1em;
|
2169 |
+
padding: 0.75em 2em;
|
2170 |
+
}
|
2171 |
+
/* line 95, ../sass/vex.sass */
|
2172 |
+
.vex-dialog-button.vex-last {
|
2173 |
+
margin-left: 0;
|
2174 |
+
}
|
2175 |
+
/* line 98, ../sass/vex.sass */
|
2176 |
+
.vex-dialog-button:focus, .vex-dialog-button:hover {
|
2177 |
+
outline: none;
|
2178 |
+
}
|
2179 |
+
/* line 101, ../sass/vex.sass */
|
2180 |
+
.vex-dialog-button.vex-dialog-button-primary {
|
2181 |
+
-webkit-box-shadow: none;
|
2182 |
+
-moz-box-shadow: none;
|
2183 |
+
box-shadow: none;
|
2184 |
+
border: 0;
|
2185 |
+
background: #3288e6;
|
2186 |
+
color: white;
|
2187 |
+
}
|
2188 |
+
/* line 107, ../sass/vex.sass */
|
2189 |
+
.vex-dialog-button.vex-dialog-button-primary:hover {
|
2190 |
+
background: #5fa2ec;
|
2191 |
+
}
|
2192 |
+
/* line 110, ../sass/vex.sass */
|
2193 |
+
.vex-dialog-button.vex-dialog-button-secondary {
|
2194 |
+
-webkit-box-shadow: none;
|
2195 |
+
-moz-box-shadow: none;
|
2196 |
+
box-shadow: none;
|
2197 |
+
border: 0;
|
2198 |
+
background: #e0e0e0;
|
2199 |
+
color: #777777;
|
2200 |
+
}
|
2201 |
+
|
2202 |
+
/* line 116, ../sass/vex.sass */
|
2203 |
+
.vex-loading-spinner {
|
2204 |
+
animation: vex-rotation 0.7s linear infinite;
|
2205 |
+
-webkit-animation: vex-rotation 0.7s linear infinite;
|
2206 |
+
-moz-animation: vex-rotation 0.7s linear infinite;
|
2207 |
+
-ms-animation: vex-rotation 0.7s linear infinite;
|
2208 |
+
-o-animation: vex-rotation 0.7s linear infinite;
|
2209 |
+
-webkit-backface-visibility: hidden;
|
2210 |
+
-webkit-box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
|
2211 |
+
-moz-box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
|
2212 |
+
box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
|
2213 |
+
position: fixed;
|
2214 |
+
z-index: 1112;
|
2215 |
+
margin: auto;
|
2216 |
+
top: 0;
|
2217 |
+
right: 0;
|
2218 |
+
bottom: 0;
|
2219 |
+
left: 0;
|
2220 |
+
height: 2em;
|
2221 |
+
width: 2em;
|
2222 |
+
background: white;
|
2223 |
+
}
|
2224 |
+
|
2225 |
+
@media only screen and (max-width: 760px) {
|
2226 |
+
/* line 132, ../sass/vex.sass */
|
2227 |
+
#leadin-subscribe-mobile-check, .leadin-subscribe-powered-by {
|
2228 |
+
display: none;
|
2229 |
+
}
|
2230 |
+
}
|
trunk/power-ups/subscribe-widget/frontend/js/leadin-subscribe.js
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
jQuery(document).ready( function ( $ ) {
|
2 |
+
var li_subscribe_flag = $.cookie('li_subscribe');
|
3 |
+
|
4 |
+
if ( !leadin_subscribe_check_mobile($) )
|
5 |
+
{
|
6 |
+
if ( !li_subscribe_flag )
|
7 |
+
{
|
8 |
+
leadin_check_visitor_status($.cookie("li_hash"), function ( data ) {
|
9 |
+
if ( data != 'subscribe' )
|
10 |
+
{
|
11 |
+
$.cookie("li_subscribe", 'show', {path: "/", domain: ""});
|
12 |
+
bind_leadin_subscribe_widget();
|
13 |
+
}
|
14 |
+
else
|
15 |
+
{
|
16 |
+
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
17 |
+
}
|
18 |
+
});
|
19 |
+
}
|
20 |
+
else
|
21 |
+
{
|
22 |
+
if ( li_subscribe_flag == 'show' )
|
23 |
+
bind_leadin_subscribe_widget();
|
24 |
+
}
|
25 |
+
}
|
26 |
+
});
|
27 |
+
|
28 |
+
function bind_leadin_subscribe_widget ()
|
29 |
+
{
|
30 |
+
(function(){
|
31 |
+
var $ = jQuery;
|
32 |
+
var subscribe = {};
|
33 |
+
|
34 |
+
subscribe.vex = undefined;
|
35 |
+
|
36 |
+
subscribe.init = function() {
|
37 |
+
$(window).scroll(function() {
|
38 |
+
if ($(window).scrollTop() + $(window).height() > $(document).height() / 2) {
|
39 |
+
subscribe.open();
|
40 |
+
} else {
|
41 |
+
subscribe.close();
|
42 |
+
}
|
43 |
+
});
|
44 |
+
};
|
45 |
+
|
46 |
+
subscribe.open = function() {
|
47 |
+
if (subscribe.vex) {
|
48 |
+
return subscribe._open();
|
49 |
+
}
|
50 |
+
|
51 |
+
subscribe.vex = vex.dialog.open({
|
52 |
+
showCloseButton: true,
|
53 |
+
className: 'leadin-subscribe ' + $('#leadin-subscribe-vex-class').val(),
|
54 |
+
message: $('#leadin-subscribe-heading').val(),
|
55 |
+
input: '' +
|
56 |
+
'<input id="leadin-subscribe-email" name="email" type="email" placeholder="Email address" required />',
|
57 |
+
buttons: [$.extend({}, vex.dialog.buttons.YES, { text: ( $('#leadin-subscribe-btn-label').val() ? $('#leadin-subscribe-btn-label').val() : 'SUBSCRIBE' ) })],
|
58 |
+
onSubmit: function ( data )
|
59 |
+
{
|
60 |
+
$('.vex-dialog-form').fadeOut(300, function ( e ) {
|
61 |
+
$('.vex-dialog-form').html(
|
62 |
+
'<div class="vex-close"></div>' +
|
63 |
+
'<h3>Thanks for Subscribing</h3>You should receive a confirmation email in your inbox shortly.' +
|
64 |
+
'<div>' +
|
65 |
+
'<span class="powered-by">Powered by LeadIn</span>' +
|
66 |
+
'<a href="http://leadin.com/wordpress-subscribe-widget/?utm_campaign=subscribe_widget&utm_medium=email&utm_source=' + window.location.host + '"><img alt="LeadIn" height="20px" width="99px" src="http://leadin.com/wp-content/themes/LeadIn-WP-Theme/library/images/logos/Leadin_logo@2x.png" alt="leadin.com"/></a>' +
|
67 |
+
'</div>'
|
68 |
+
).css('text-align', 'center').fadeIn(250);
|
69 |
+
});
|
70 |
+
|
71 |
+
leadin_submit_form($('.leadin-subscribe form'), $, 'subscribe');
|
72 |
+
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
73 |
+
return false;
|
74 |
+
},
|
75 |
+
callback: function(data) {
|
76 |
+
if (data === false) {
|
77 |
+
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
78 |
+
}
|
79 |
+
|
80 |
+
$.cookie("li_subscribe", 'ignore', {path: "/", domain: ""});
|
81 |
+
}
|
82 |
+
});
|
83 |
+
|
84 |
+
leadin_subscribe_show();
|
85 |
+
|
86 |
+
$('.leadin-subscribe form.vex-dialog-form').append('<a href="http://leadin.com/pop-subscribe-form-plugin-wordpress/?utm_campaign=subscribe_widget&utm_medium=widget&utm_source=' + document.URL + '" id="leadin-subscribe-powered-by" class="leadin-subscribe-powered-by">Powered by LeadIn</a>');
|
87 |
+
};
|
88 |
+
|
89 |
+
subscribe._open = function() {
|
90 |
+
subscribe.vex.parent().removeClass('vex-closing');
|
91 |
+
}
|
92 |
+
|
93 |
+
subscribe.close = function() {
|
94 |
+
|
95 |
+
if (!subscribe.vex) {
|
96 |
+
return;
|
97 |
+
}
|
98 |
+
subscribe.vex.parent().addClass('vex-closing');
|
99 |
+
}
|
100 |
+
|
101 |
+
subscribe.init();
|
102 |
+
window.subscribe = subscribe;
|
103 |
+
})();
|
104 |
+
}
|
105 |
+
|
106 |
+
function leadin_subscribe_check_mobile( $ )
|
107 |
+
{
|
108 |
+
var is_mobile = false;
|
109 |
+
|
110 |
+
if ( $('#leadin-subscribe-mobile-check').css('display')=='none' )
|
111 |
+
is_mobile = true;
|
112 |
+
|
113 |
+
return is_mobile;
|
114 |
+
}
|
115 |
+
|
116 |
+
function leadin_subscribe_show ()
|
117 |
+
{
|
118 |
+
jQuery.ajax({
|
119 |
+
type: 'POST',
|
120 |
+
url: li_ajax.ajax_url,
|
121 |
+
data: {
|
122 |
+
"action": "leadin_subscribe_show"
|
123 |
+
},
|
124 |
+
success: function(data){
|
125 |
+
},
|
126 |
+
error: function ( error_data ) {
|
127 |
+
//alert(error_data);
|
128 |
+
}
|
129 |
+
});
|
130 |
+
}
|
trunk/power-ups/subscribe-widget/frontend/js/vex.dialog.js
ADDED
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function() {
|
2 |
+
var vexDialogFactory;
|
3 |
+
|
4 |
+
vexDialogFactory = function($, vex) {
|
5 |
+
var $formToObject, dialog;
|
6 |
+
if (vex == null) {
|
7 |
+
return $.error('Vex is required to use vex.dialog');
|
8 |
+
}
|
9 |
+
$formToObject = function($form) {
|
10 |
+
var object;
|
11 |
+
object = {};
|
12 |
+
$.each($form.serializeArray(), function() {
|
13 |
+
if (object[this.name]) {
|
14 |
+
if (!object[this.name].push) {
|
15 |
+
object[this.name] = [object[this.name]];
|
16 |
+
}
|
17 |
+
return object[this.name].push(this.value || '');
|
18 |
+
} else {
|
19 |
+
return object[this.name] = this.value || '';
|
20 |
+
}
|
21 |
+
});
|
22 |
+
return object;
|
23 |
+
};
|
24 |
+
dialog = {};
|
25 |
+
dialog.buttons = {
|
26 |
+
YES: {
|
27 |
+
text: 'OK',
|
28 |
+
type: 'submit',
|
29 |
+
className: 'vex-dialog-button-primary'
|
30 |
+
},
|
31 |
+
NO: {
|
32 |
+
text: 'Cancel',
|
33 |
+
type: 'button',
|
34 |
+
className: 'vex-dialog-button-secondary',
|
35 |
+
click: function($vexContent, event) {
|
36 |
+
$vexContent.data().vex.value = false;
|
37 |
+
return vex.close($vexContent.data().vex.id);
|
38 |
+
}
|
39 |
+
}
|
40 |
+
};
|
41 |
+
dialog.defaultOptions = {
|
42 |
+
callback: function(value) {},
|
43 |
+
afterOpen: function() {},
|
44 |
+
message: 'Message',
|
45 |
+
input: "<input name=\"vex\" type=\"hidden\" value=\"_vex-empty-value\" />",
|
46 |
+
value: false,
|
47 |
+
buttons: [dialog.buttons.YES, dialog.buttons.NO],
|
48 |
+
showCloseButton: false,
|
49 |
+
onSubmit: function(event) {
|
50 |
+
var $form, $vexContent;
|
51 |
+
$form = $(this);
|
52 |
+
$vexContent = $form.parent();
|
53 |
+
event.preventDefault();
|
54 |
+
event.stopPropagation();
|
55 |
+
$vexContent.data().vex.value = dialog.getFormValueOnSubmit($formToObject($form));
|
56 |
+
return vex.close($vexContent.data().vex.id);
|
57 |
+
},
|
58 |
+
focusFirstInput: true
|
59 |
+
};
|
60 |
+
dialog.defaultAlertOptions = {
|
61 |
+
message: 'Alert',
|
62 |
+
buttons: [dialog.buttons.YES]
|
63 |
+
};
|
64 |
+
dialog.defaultConfirmOptions = {
|
65 |
+
message: 'Confirm'
|
66 |
+
};
|
67 |
+
dialog.open = function(options) {
|
68 |
+
var $vexContent;
|
69 |
+
options = $.extend({}, vex.defaultOptions, dialog.defaultOptions, options);
|
70 |
+
options.content = dialog.buildDialogForm(options);
|
71 |
+
options.beforeClose = function($vexContent) {
|
72 |
+
return options.callback($vexContent.data().vex.value);
|
73 |
+
};
|
74 |
+
$vexContent = vex.open(options);
|
75 |
+
if (options.focusFirstInput) {
|
76 |
+
$vexContent.find('input[type="submit"], textarea, input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]').first().focus();
|
77 |
+
}
|
78 |
+
return $vexContent;
|
79 |
+
};
|
80 |
+
dialog.alert = function(options) {
|
81 |
+
if (typeof options === 'string') {
|
82 |
+
options = {
|
83 |
+
message: options
|
84 |
+
};
|
85 |
+
}
|
86 |
+
options = $.extend({}, dialog.defaultAlertOptions, options);
|
87 |
+
return dialog.open(options);
|
88 |
+
};
|
89 |
+
dialog.confirm = function(options) {
|
90 |
+
if (typeof options === 'string') {
|
91 |
+
return $.error('dialog.confirm(options) requires options.callback.');
|
92 |
+
}
|
93 |
+
options = $.extend({}, dialog.defaultConfirmOptions, options);
|
94 |
+
return dialog.open(options);
|
95 |
+
};
|
96 |
+
dialog.prompt = function(options) {
|
97 |
+
var defaultPromptOptions;
|
98 |
+
if (typeof options === 'string') {
|
99 |
+
return $.error('dialog.prompt(options) requires options.callback.');
|
100 |
+
}
|
101 |
+
defaultPromptOptions = {
|
102 |
+
message: "<label for=\"vex\">" + (options.label || 'Prompt:') + "</label>",
|
103 |
+
input: "<input name=\"vex\" type=\"text\" class=\"vex-dialog-prompt-input\" placeholder=\"" + (options.placeholder || '') + "\" value=\"" + (options.value || '') + "\" />"
|
104 |
+
};
|
105 |
+
options = $.extend({}, defaultPromptOptions, options);
|
106 |
+
return dialog.open(options);
|
107 |
+
};
|
108 |
+
dialog.buildDialogForm = function(options) {
|
109 |
+
var $form, $input, $message;
|
110 |
+
$form = $('<form class="vex-dialog-form" />');
|
111 |
+
$message = $('<div class="vex-dialog-message" />');
|
112 |
+
$input = $('<div class="vex-dialog-input" />');
|
113 |
+
$form.append($message.append(options.message)).append($input.append(options.input)).append(dialog.buttonsToDOM(options.buttons)).bind('submit.vex', options.onSubmit);
|
114 |
+
return $form;
|
115 |
+
};
|
116 |
+
dialog.getFormValueOnSubmit = function(formData) {
|
117 |
+
if (formData.vex || formData.vex === '') {
|
118 |
+
if (formData.vex === '_vex-empty-value') {
|
119 |
+
return true;
|
120 |
+
}
|
121 |
+
return formData.vex;
|
122 |
+
} else {
|
123 |
+
return formData;
|
124 |
+
}
|
125 |
+
};
|
126 |
+
dialog.buttonsToDOM = function(buttons) {
|
127 |
+
var $buttons;
|
128 |
+
$buttons = $('<div class="vex-dialog-buttons" />');
|
129 |
+
$.each(buttons, function(index, button) {
|
130 |
+
return $buttons.append($("<input type=\"" + button.type + "\" />").val(button.text).addClass(button.className + ' vex-dialog-button ' + (index === 0 ? 'vex-first ' : '') + (index === buttons.length - 1 ? 'vex-last ' : '')).bind('click.vex', function(e) {
|
131 |
+
if (button.click) {
|
132 |
+
return button.click($(this).parents("." + vex.baseClassNames.content), e);
|
133 |
+
}
|
134 |
+
}));
|
135 |
+
});
|
136 |
+
return $buttons;
|
137 |
+
};
|
138 |
+
return dialog;
|
139 |
+
};
|
140 |
+
|
141 |
+
if (typeof define === 'function' && define.amd) {
|
142 |
+
define(['jquery', 'vex'], vexDialogFactory);
|
143 |
+
} else if (typeof exports === 'object') {
|
144 |
+
module.exports = vexDialogFactory(require('jquery'), require('vex'));
|
145 |
+
} else {
|
146 |
+
window.vex.dialog = vexDialogFactory(window.jQuery, window.vex);
|
147 |
+
}
|
148 |
+
|
149 |
+
}).call(this);
|
trunk/power-ups/subscribe-widget/frontend/js/vex.js
ADDED
@@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function() {
|
2 |
+
var vexFactory;
|
3 |
+
|
4 |
+
vexFactory = function($) {
|
5 |
+
var animationEndSupport, vex;
|
6 |
+
animationEndSupport = false;
|
7 |
+
$(function() {
|
8 |
+
var s;
|
9 |
+
s = (document.body || document.documentElement).style;
|
10 |
+
animationEndSupport = s.animation !== void 0 || s.WebkitAnimation !== void 0 || s.MozAnimation !== void 0 || s.MsAnimation !== void 0 || s.OAnimation !== void 0;
|
11 |
+
return $(window).bind('keyup.vex', function(event) {
|
12 |
+
if (event.keyCode === 27) {
|
13 |
+
return vex.closeByEscape();
|
14 |
+
}
|
15 |
+
});
|
16 |
+
});
|
17 |
+
return vex = {
|
18 |
+
globalID: 1,
|
19 |
+
animationEndEvent: 'animationend webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend',
|
20 |
+
baseClassNames: {
|
21 |
+
vex: 'vex',
|
22 |
+
content: 'vex-content',
|
23 |
+
overlay: 'vex-overlay',
|
24 |
+
close: 'vex-close',
|
25 |
+
closing: 'vex-closing',
|
26 |
+
open: 'vex-open'
|
27 |
+
},
|
28 |
+
defaultOptions: {
|
29 |
+
content: '',
|
30 |
+
showCloseButton: true,
|
31 |
+
escapeButtonCloses: true,
|
32 |
+
overlayClosesOnClick: true,
|
33 |
+
appendLocation: 'body',
|
34 |
+
className: '',
|
35 |
+
css: {},
|
36 |
+
overlayClassName: '',
|
37 |
+
overlayCSS: {},
|
38 |
+
contentClassName: '',
|
39 |
+
contentCSS: {},
|
40 |
+
closeClassName: '',
|
41 |
+
closeCSS: {}
|
42 |
+
},
|
43 |
+
open: function(options) {
|
44 |
+
options = $.extend({}, vex.defaultOptions, options);
|
45 |
+
options.id = vex.globalID;
|
46 |
+
vex.globalID += 1;
|
47 |
+
options.$vex = $('<div>').addClass(vex.baseClassNames.vex).addClass(options.className).css(options.css).data({
|
48 |
+
vex: options
|
49 |
+
});
|
50 |
+
options.$vexOverlay = $('<div>').addClass(vex.baseClassNames.overlay).addClass(options.overlayClassName).css(options.overlayCSS).data({
|
51 |
+
vex: options
|
52 |
+
});
|
53 |
+
if (options.overlayClosesOnClick) {
|
54 |
+
options.$vexOverlay.bind('click.vex', function(e) {
|
55 |
+
if (e.target !== this) {
|
56 |
+
return;
|
57 |
+
}
|
58 |
+
return vex.close($(this).data().vex.id);
|
59 |
+
});
|
60 |
+
}
|
61 |
+
options.$vex.append(options.$vexOverlay);
|
62 |
+
options.$vexContent = $('<div>').addClass(vex.baseClassNames.content).addClass(options.contentClassName).css(options.contentCSS).append(options.content).data({
|
63 |
+
vex: options
|
64 |
+
});
|
65 |
+
options.$vex.append(options.$vexContent);
|
66 |
+
if (options.showCloseButton) {
|
67 |
+
options.$closeButton = $('<div>').addClass(vex.baseClassNames.close).addClass(options.closeClassName).css(options.closeCSS).data({
|
68 |
+
vex: options
|
69 |
+
}).bind('click.vex', function() {
|
70 |
+
return vex.close($(this).data().vex.id);
|
71 |
+
});
|
72 |
+
options.$vexContent.append(options.$closeButton);
|
73 |
+
}
|
74 |
+
$(options.appendLocation).append(options.$vex);
|
75 |
+
vex.setupBodyClassName(options.$vex);
|
76 |
+
if (options.afterOpen) {
|
77 |
+
options.afterOpen(options.$vexContent, options);
|
78 |
+
}
|
79 |
+
setTimeout((function() {
|
80 |
+
return options.$vexContent.trigger('vexOpen', options);
|
81 |
+
}), 0);
|
82 |
+
return options.$vexContent;
|
83 |
+
},
|
84 |
+
getAllVexes: function() {
|
85 |
+
return $("." + vex.baseClassNames.vex + ":not(\"." + vex.baseClassNames.closing + "\") ." + vex.baseClassNames.content);
|
86 |
+
},
|
87 |
+
getVexByID: function(id) {
|
88 |
+
return vex.getAllVexes().filter(function() {
|
89 |
+
return $(this).data().vex.id === id;
|
90 |
+
});
|
91 |
+
},
|
92 |
+
close: function(id) {
|
93 |
+
var $lastVex;
|
94 |
+
if (!id) {
|
95 |
+
$lastVex = vex.getAllVexes().last();
|
96 |
+
if (!$lastVex.length) {
|
97 |
+
return false;
|
98 |
+
}
|
99 |
+
id = $lastVex.data().vex.id;
|
100 |
+
}
|
101 |
+
return vex.closeByID(id);
|
102 |
+
},
|
103 |
+
closeAll: function() {
|
104 |
+
var ids;
|
105 |
+
ids = vex.getAllVexes().map(function() {
|
106 |
+
return $(this).data().vex.id;
|
107 |
+
}).toArray();
|
108 |
+
if (!(ids != null ? ids.length : void 0)) {
|
109 |
+
return false;
|
110 |
+
}
|
111 |
+
$.each(ids.reverse(), function(index, id) {
|
112 |
+
return vex.closeByID(id);
|
113 |
+
});
|
114 |
+
return true;
|
115 |
+
},
|
116 |
+
closeByID: function(id) {
|
117 |
+
var $vex, $vexContent, beforeClose, close, options;
|
118 |
+
$vexContent = vex.getVexByID(id);
|
119 |
+
if (!$vexContent.length) {
|
120 |
+
return;
|
121 |
+
}
|
122 |
+
$vex = $vexContent.data().vex.$vex;
|
123 |
+
options = $.extend({}, $vexContent.data().vex);
|
124 |
+
beforeClose = function() {
|
125 |
+
if (options.beforeClose) {
|
126 |
+
return options.beforeClose($vexContent, options);
|
127 |
+
}
|
128 |
+
};
|
129 |
+
close = function() {
|
130 |
+
$vexContent.trigger('vexClose', options);
|
131 |
+
$vex.remove();
|
132 |
+
if (options.afterClose) {
|
133 |
+
return options.afterClose($vexContent, options);
|
134 |
+
}
|
135 |
+
};
|
136 |
+
if (animationEndSupport) {
|
137 |
+
beforeClose();
|
138 |
+
$vex.unbind(vex.animationEndEvent).bind(vex.animationEndEvent, function() {
|
139 |
+
return close();
|
140 |
+
}).addClass(vex.baseClassNames.closing);
|
141 |
+
} else {
|
142 |
+
beforeClose();
|
143 |
+
close();
|
144 |
+
}
|
145 |
+
return true;
|
146 |
+
},
|
147 |
+
closeByEscape: function() {
|
148 |
+
var $lastVex, id, ids;
|
149 |
+
ids = vex.getAllVexes().map(function() {
|
150 |
+
return $(this).data().vex.id;
|
151 |
+
}).toArray();
|
152 |
+
if (!(ids != null ? ids.length : void 0)) {
|
153 |
+
return false;
|
154 |
+
}
|
155 |
+
id = Math.max.apply(Math, ids);
|
156 |
+
$lastVex = vex.getVexByID(id);
|
157 |
+
if ($lastVex.data().vex.escapeButtonCloses !== true) {
|
158 |
+
return false;
|
159 |
+
}
|
160 |
+
return vex.closeByID(id);
|
161 |
+
},
|
162 |
+
setupBodyClassName: function($vex) {
|
163 |
+
return $vex.bind('vexOpen.vex', function() {
|
164 |
+
return $('body').addClass(vex.baseClassNames.open);
|
165 |
+
}).bind('vexClose.vex', function() {
|
166 |
+
if (!vex.getAllVexes().length) {
|
167 |
+
return $('body').removeClass(vex.baseClassNames.open);
|
168 |
+
}
|
169 |
+
});
|
170 |
+
},
|
171 |
+
hideLoading: function() {
|
172 |
+
return $('.vex-loading-spinner').remove();
|
173 |
+
},
|
174 |
+
showLoading: function() {
|
175 |
+
vex.hideLoading();
|
176 |
+
return $('body').append("<div class=\"vex-loading-spinner " + vex.defaultOptions.className + "\"></div>");
|
177 |
+
}
|
178 |
+
};
|
179 |
+
};
|
180 |
+
|
181 |
+
if (typeof define === 'function' && define.amd) {
|
182 |
+
define(['jquery'], vexFactory);
|
183 |
+
} else if (typeof exports === 'object') {
|
184 |
+
module.exports = vexFactory(require('jquery'));
|
185 |
+
} else {
|
186 |
+
window.vex = vexFactory(jQuery);
|
187 |
+
}
|
188 |
+
|
189 |
+
}).call(this);
|
trunk/power-ups/subscribe-widget/frontend/sass/_keyframes.sass
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
|
3 |
+
@import mixins
|
4 |
+
|
5 |
+
// Overlay/content animations
|
6 |
+
|
7 |
+
=keyframes-vex-fadein
|
8 |
+
+vex-keyframes("vex-fadein")
|
9 |
+
0%
|
10 |
+
opacity: 0
|
11 |
+
100%
|
12 |
+
opacity: 1
|
13 |
+
|
14 |
+
=keyframes-vex-fadeout
|
15 |
+
+vex-keyframes("vex-fadeout")
|
16 |
+
0%
|
17 |
+
opacity: 1
|
18 |
+
100%
|
19 |
+
opacity: 0
|
20 |
+
|
21 |
+
// Content animations
|
22 |
+
|
23 |
+
=keyframes-vex-flyin
|
24 |
+
+vex-keyframes("vex-flyin")
|
25 |
+
0%
|
26 |
+
opacity: 0
|
27 |
+
+vex-transform(translateY(-40px))
|
28 |
+
100%
|
29 |
+
opacity: 1
|
30 |
+
+vex-transform(translateY(0))
|
31 |
+
|
32 |
+
=keyframes-vex-flyout
|
33 |
+
+vex-keyframes("vex-flyout")
|
34 |
+
0%
|
35 |
+
opacity: 1
|
36 |
+
+vex-transform(translateY(0))
|
37 |
+
100%
|
38 |
+
opacity: 0
|
39 |
+
+vex-transform(translateY(-40px))
|
40 |
+
|
41 |
+
=keyframes-vex-dropin
|
42 |
+
+vex-keyframes("vex-dropin")
|
43 |
+
// We start at 0 first and, while hidden
|
44 |
+
// move to -800px, where the animation
|
45 |
+
// really begins. This was necessary because
|
46 |
+
// otherwise, when starting the animation
|
47 |
+
// at -800px, the browser scrolls up 800px
|
48 |
+
// to try to display this object positioned
|
49 |
+
// above the page.
|
50 |
+
// https://github.com/HubSpot/vex/issues/21
|
51 |
+
0%
|
52 |
+
+vex-transform(translateY(0))
|
53 |
+
opacity: 0
|
54 |
+
1%
|
55 |
+
+vex-transform(translateY(-800px))
|
56 |
+
opacity: 0
|
57 |
+
|
58 |
+
// Real animation begins here
|
59 |
+
2%
|
60 |
+
+vex-transform(translateY(-800px))
|
61 |
+
opacity: 1
|
62 |
+
100%
|
63 |
+
+vex-transform(translateY(0))
|
64 |
+
opacity: 1
|
65 |
+
|
66 |
+
=keyframes-vex-dropout
|
67 |
+
+vex-keyframes("vex-dropout")
|
68 |
+
0%
|
69 |
+
+vex-transform(translateY(0))
|
70 |
+
100%
|
71 |
+
+vex-transform(translateY(-800px))
|
72 |
+
|
73 |
+
=keyframes-vex-slideup
|
74 |
+
+vex-keyframes("vex-slideup")
|
75 |
+
// We start at 0 first and, while hidden
|
76 |
+
// move to -800px, where the animation
|
77 |
+
// really begins. This was necessary because
|
78 |
+
// otherwise, when starting the animation
|
79 |
+
// at -800px, the browser scrolls up 800px
|
80 |
+
// to try to display this object positioned
|
81 |
+
// above the page.
|
82 |
+
// https://github.com/HubSpot/vex/issues/21
|
83 |
+
0%
|
84 |
+
+vex-transform(translateY(0))
|
85 |
+
opacity: 0
|
86 |
+
1%
|
87 |
+
+vex-transform(translateY(800px))
|
88 |
+
opacity: 0
|
89 |
+
|
90 |
+
// Real animation begins here
|
91 |
+
2%
|
92 |
+
+vex-transform(translateY(800px))
|
93 |
+
opacity: 1
|
94 |
+
100%
|
95 |
+
+vex-transform(translateY(0))
|
96 |
+
opacity: 1
|
97 |
+
|
98 |
+
=keyframes-vex-slidedown
|
99 |
+
+vex-keyframes("vex-slidedown")
|
100 |
+
0%
|
101 |
+
+vex-transform(translateY(0))
|
102 |
+
100%
|
103 |
+
+vex-transform(translateY(800px))
|
104 |
+
|
105 |
+
=keyframes-vex-flipin-horizontal
|
106 |
+
+vex-keyframes("vex-flipin-horizontal")
|
107 |
+
0%
|
108 |
+
opacity: 0
|
109 |
+
+vex-transform(rotateY(-90deg))
|
110 |
+
100%
|
111 |
+
opacity: 1
|
112 |
+
+vex-transform(rotateY(0deg))
|
113 |
+
|
114 |
+
=keyframes-vex-flipout-horizontal
|
115 |
+
+vex-keyframes("vex-flipout-horizontal")
|
116 |
+
0%
|
117 |
+
opacity: 1
|
118 |
+
+vex-transform(rotateY(0deg))
|
119 |
+
100%
|
120 |
+
opacity: 0
|
121 |
+
+vex-transform(rotateY(90deg))
|
122 |
+
|
123 |
+
// Spinner animations
|
124 |
+
|
125 |
+
=keyframes-vex-rotation
|
126 |
+
+vex-keyframes("vex-rotation")
|
127 |
+
0%
|
128 |
+
+vex-transform(rotate(0deg))
|
129 |
+
100%
|
130 |
+
+vex-transform(rotate(359deg))
|
131 |
+
|
132 |
+
// Button animations
|
133 |
+
|
134 |
+
=keyframes-vex-pulse
|
135 |
+
+vex-keyframes("vex-pulse")
|
136 |
+
0%
|
137 |
+
+box-shadow(inset 0 0 0 300px transparent)
|
138 |
+
70%
|
139 |
+
+box-shadow(inset 0 0 0 300px rgba(255, 255, 255, .25))
|
140 |
+
100%
|
141 |
+
+box-shadow(inset 0 0 0 300px transparent)
|
trunk/power-ups/subscribe-widget/frontend/sass/_mixins.sass
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=vex-keyframes($name)
|
2 |
+
@keyframes #{$name}
|
3 |
+
@content
|
4 |
+
@-webkit-keyframes #{$name}
|
5 |
+
@content
|
6 |
+
@-moz-keyframes #{$name}
|
7 |
+
@content
|
8 |
+
@-ms-keyframes #{$name}
|
9 |
+
@content
|
10 |
+
@-o-keyframes #{$name}
|
11 |
+
@content
|
12 |
+
|
13 |
+
=vex-animation($animation)
|
14 |
+
animation: $animation
|
15 |
+
-webkit-animation: $animation
|
16 |
+
-moz-animation: $animation
|
17 |
+
-ms-animation: $animation
|
18 |
+
-o-animation: $animation
|
19 |
+
-webkit-backface-visibility: hidden
|
20 |
+
|
21 |
+
=vex-transform($transform)
|
22 |
+
transform: $transform
|
23 |
+
-webkit-transform: $transform
|
24 |
+
-moz-transform: $transform
|
25 |
+
-ms-transform: $transform
|
26 |
+
-o-transform: $transform
|
27 |
+
|
28 |
+
=vex-preserve-3d
|
29 |
+
-webkit-transform-style: preserve-3d
|
30 |
+
-moz-transform-style: preserve-3d
|
31 |
+
transform-style: preserve-3d
|
trunk/power-ups/subscribe-widget/frontend/sass/_vex-theme-bottom-right-corner.sass
ADDED
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
@import compass/utilities/general/clearfix
|
3 |
+
|
4 |
+
@import mixins
|
5 |
+
@import keyframes
|
6 |
+
|
7 |
+
+keyframes-vex-slideup
|
8 |
+
+keyframes-vex-slidedown
|
9 |
+
+keyframes-vex-pulse
|
10 |
+
|
11 |
+
$blue: #3288e6
|
12 |
+
|
13 |
+
.vex.vex-theme-bottom-right-corner,
|
14 |
+
.vex.vex-theme-bottom-left-corner
|
15 |
+
top: auto
|
16 |
+
bottom: 0
|
17 |
+
right: 0
|
18 |
+
overflow: visible
|
19 |
+
|
20 |
+
.vex-overlay
|
21 |
+
display: none
|
22 |
+
|
23 |
+
&.vex-closing .vex-content
|
24 |
+
+vex-animation(vex-slidedown .5s)
|
25 |
+
|
26 |
+
.vex-content
|
27 |
+
+vex-animation(vex-slideup .5s)
|
28 |
+
|
29 |
+
.vex-content
|
30 |
+
font-family: "Helvetica Neue", sans-serif
|
31 |
+
background: #f0f0f0
|
32 |
+
color: #444
|
33 |
+
padding: 1em
|
34 |
+
max-width: 100%
|
35 |
+
width: 450px
|
36 |
+
font-size: 1.1em
|
37 |
+
line-height: 1.5em
|
38 |
+
position: fixed
|
39 |
+
bottom: 0
|
40 |
+
|
41 |
+
h1, h2, h3, h4, h5, h6, p, ul, li
|
42 |
+
color: inherit
|
43 |
+
|
44 |
+
.vex-close
|
45 |
+
+border-radius(5px)
|
46 |
+
position: absolute
|
47 |
+
top: 0
|
48 |
+
right: 0
|
49 |
+
cursor: pointer
|
50 |
+
|
51 |
+
&:before
|
52 |
+
+border-radius(3px)
|
53 |
+
position: absolute
|
54 |
+
content: "\00D7"
|
55 |
+
font-size: 26px
|
56 |
+
font-weight: normal
|
57 |
+
line-height: 31px
|
58 |
+
height: 30px
|
59 |
+
width: 30px
|
60 |
+
text-align: center
|
61 |
+
top: 3px
|
62 |
+
right: 3px
|
63 |
+
color: #bbb
|
64 |
+
background: transparent
|
65 |
+
|
66 |
+
&:hover:before, &:active:before
|
67 |
+
color: #777
|
68 |
+
background: #e0e0e0
|
69 |
+
|
70 |
+
.vex-dialog-form
|
71 |
+
|
72 |
+
.vex-dialog-message
|
73 |
+
margin-bottom: .5em
|
74 |
+
|
75 |
+
.vex-dialog-input
|
76 |
+
margin-bottom: 1em
|
77 |
+
|
78 |
+
textarea, input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]
|
79 |
+
+border-radius(3px)
|
80 |
+
background: #fff
|
81 |
+
width: 100%
|
82 |
+
padding: .25em .67em
|
83 |
+
border: 0
|
84 |
+
font-family: inherit
|
85 |
+
font-weight: inherit
|
86 |
+
font-size: inherit
|
87 |
+
min-height: 2.5em
|
88 |
+
margin: 0 0 .25em
|
89 |
+
|
90 |
+
&:focus
|
91 |
+
+box-shadow(inset 0 0 0 2px lighten($blue, 20%))
|
92 |
+
outline: none
|
93 |
+
|
94 |
+
.vex-dialog-buttons
|
95 |
+
+pie-clearfix()
|
96 |
+
|
97 |
+
.vex.vex-theme-bottom-right-corner
|
98 |
+
|
99 |
+
.vex-content
|
100 |
+
+border-radius(5px 0 0 0)
|
101 |
+
right: 0
|
102 |
+
left: auto
|
103 |
+
|
104 |
+
.vex.vex-theme-bottom-left-corner
|
105 |
+
|
106 |
+
.vex-content
|
107 |
+
+border-radius(0 5px 0 0)
|
108 |
+
left: 0
|
109 |
+
right: auto
|
110 |
+
|
111 |
+
.vex-loading-spinner.vex-theme-bottom-right-corner
|
112 |
+
+box-shadow(0 0 0 .5em #f0f0f0, 0 0 1px .5em rgba(0, 0, 0, 0.3))
|
113 |
+
+border-radius(100%)
|
114 |
+
background: #f0f0f0
|
115 |
+
border: .2em solid transparent
|
116 |
+
border-top-color: #bbb
|
117 |
+
top: -1.1em
|
118 |
+
bottom: auto
|
trunk/power-ups/subscribe-widget/frontend/sass/_vex-theme-default.sass
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
@import compass/utilities/general/clearfix
|
3 |
+
|
4 |
+
@import mixins
|
5 |
+
@import keyframes
|
6 |
+
|
7 |
+
+keyframes-vex-flyin
|
8 |
+
+keyframes-vex-flyout
|
9 |
+
+keyframes-vex-pulse
|
10 |
+
|
11 |
+
$blue: #3288e6
|
12 |
+
|
13 |
+
.vex.vex-theme-default
|
14 |
+
padding-top: 160px
|
15 |
+
padding-bottom: 160px
|
16 |
+
|
17 |
+
&.vex-closing .vex-content
|
18 |
+
+vex-animation(vex-flyout .5s)
|
19 |
+
|
20 |
+
.vex-content
|
21 |
+
+vex-animation(vex-flyin .5s)
|
22 |
+
|
23 |
+
.vex-content
|
24 |
+
+border-radius(5px)
|
25 |
+
font-family: "Helvetica Neue", sans-serif
|
26 |
+
background: #f0f0f0
|
27 |
+
color: #444
|
28 |
+
padding: 1em
|
29 |
+
position: relative
|
30 |
+
margin: 0 auto
|
31 |
+
max-width: 100%
|
32 |
+
width: 450px
|
33 |
+
font-size: 1.1em
|
34 |
+
line-height: 1.5em
|
35 |
+
|
36 |
+
h1, h2, h3, h4, h5, h6, p, ul, li
|
37 |
+
color: inherit
|
38 |
+
|
39 |
+
.vex-close
|
40 |
+
+border-radius(5px)
|
41 |
+
position: absolute
|
42 |
+
top: 0
|
43 |
+
right: 0
|
44 |
+
cursor: pointer
|
45 |
+
|
46 |
+
&:before
|
47 |
+
+border-radius(3px)
|
48 |
+
position: absolute
|
49 |
+
content: "\00D7"
|
50 |
+
font-size: 26px
|
51 |
+
font-weight: normal
|
52 |
+
line-height: 31px
|
53 |
+
height: 30px
|
54 |
+
width: 30px
|
55 |
+
text-align: center
|
56 |
+
top: 3px
|
57 |
+
right: 3px
|
58 |
+
color: #bbb
|
59 |
+
background: transparent
|
60 |
+
|
61 |
+
&:hover:before, &:active:before
|
62 |
+
color: #777
|
63 |
+
background: #e0e0e0
|
64 |
+
|
65 |
+
.vex-dialog-form
|
66 |
+
|
67 |
+
.vex-dialog-message
|
68 |
+
margin-bottom: .5em
|
69 |
+
|
70 |
+
.vex-dialog-input
|
71 |
+
margin-bottom: 1em
|
72 |
+
|
73 |
+
textarea, input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]
|
74 |
+
+border-radius(3px)
|
75 |
+
background: #fff
|
76 |
+
width: 100%
|
77 |
+
padding: .25em .67em
|
78 |
+
border: 0
|
79 |
+
font-family: inherit
|
80 |
+
font-weight: inherit
|
81 |
+
font-size: inherit
|
82 |
+
min-height: 2.5em
|
83 |
+
margin: 0 0 .25em
|
84 |
+
|
85 |
+
&:focus
|
86 |
+
+box-shadow(inset 0 0 0 2px lighten($blue, 20%))
|
87 |
+
outline: none
|
88 |
+
|
89 |
+
.vex-dialog-buttons
|
90 |
+
+pie-clearfix()
|
91 |
+
|
92 |
+
.vex-dialog-button
|
93 |
+
+border-radius(3px)
|
94 |
+
border: 0
|
95 |
+
float: right
|
96 |
+
margin: 0 0 0 .5em
|
97 |
+
font-family: inherit
|
98 |
+
text-transform: uppercase
|
99 |
+
letter-spacing: .1em
|
100 |
+
font-size: .8em
|
101 |
+
line-height: 1em
|
102 |
+
padding: .75em 2em
|
103 |
+
|
104 |
+
&.vex-last
|
105 |
+
margin-left: 0
|
106 |
+
|
107 |
+
&:focus
|
108 |
+
+vex-animation(vex-pulse 1.1s infinite)
|
109 |
+
outline: none
|
110 |
+
|
111 |
+
// vex-pulse uses -webkit-filter which
|
112 |
+
// doesn't play so nice in mobile webkit
|
113 |
+
@media (max-width: 568px)
|
114 |
+
+vex-animation(none)
|
115 |
+
|
116 |
+
&.vex-dialog-button-primary
|
117 |
+
background: $blue
|
118 |
+
color: #fff
|
119 |
+
|
120 |
+
&.vex-dialog-button-secondary
|
121 |
+
background: #e0e0e0
|
122 |
+
color: #777
|
123 |
+
|
124 |
+
.vex-loading-spinner.vex-theme-default
|
125 |
+
+box-shadow(0 0 0 .5em #f0f0f0, 0 0 1px .5em rgba(0, 0, 0, 0.3))
|
126 |
+
+border-radius(100%)
|
127 |
+
background: #f0f0f0
|
128 |
+
border: .2em solid transparent
|
129 |
+
border-top-color: #bbb
|
130 |
+
top: -1.1em
|
131 |
+
bottom: auto
|
trunk/power-ups/subscribe-widget/frontend/sass/_vex-theme-top.sass
ADDED
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
@import compass/utilities/general/clearfix
|
3 |
+
|
4 |
+
@import mixins
|
5 |
+
@import keyframes
|
6 |
+
|
7 |
+
+keyframes-vex-dropin
|
8 |
+
+keyframes-vex-dropout
|
9 |
+
+keyframes-vex-pulse
|
10 |
+
|
11 |
+
$blue: #3288e6
|
12 |
+
|
13 |
+
.vex.vex-theme-top
|
14 |
+
bottom: inherit
|
15 |
+
|
16 |
+
.vex-overlay
|
17 |
+
display: none
|
18 |
+
|
19 |
+
&.vex-closing .vex-content
|
20 |
+
+vex-animation(vex-dropout .5s)
|
21 |
+
|
22 |
+
.vex-content
|
23 |
+
+vex-animation(vex-dropin .5s)
|
24 |
+
+pie-clearfix()
|
25 |
+
font-family: "Helvetica Neue", sans-serif
|
26 |
+
background: #f0f0f0
|
27 |
+
color: #444
|
28 |
+
padding: 0.5em 0.5em 0.25em
|
29 |
+
position: relative
|
30 |
+
margin: 0 auto
|
31 |
+
max-width: 100%
|
32 |
+
font-size: 1.1em
|
33 |
+
line-height: 1.5em
|
34 |
+
|
35 |
+
h1, h2, h3, h4, h5, h6, p, ul, li
|
36 |
+
color: inherit
|
37 |
+
|
38 |
+
.vex-close
|
39 |
+
+border-radius(5px)
|
40 |
+
position: absolute
|
41 |
+
top: 0
|
42 |
+
right: 0
|
43 |
+
cursor: pointer
|
44 |
+
|
45 |
+
&:before
|
46 |
+
+border-radius(3px)
|
47 |
+
position: absolute
|
48 |
+
content: "\00D7"
|
49 |
+
font-size: 26px
|
50 |
+
font-weight: normal
|
51 |
+
line-height: 31px
|
52 |
+
height: 30px
|
53 |
+
width: 30px
|
54 |
+
text-align: center
|
55 |
+
top: 3px
|
56 |
+
right: 3px
|
57 |
+
color: #bbb
|
58 |
+
background: transparent
|
59 |
+
|
60 |
+
&:hover:before, &:active:before
|
61 |
+
color: #777
|
62 |
+
background: #e0e0e0
|
63 |
+
|
64 |
+
.vex-dialog-form
|
65 |
+
text-align: center
|
66 |
+
margin: 0 90px
|
67 |
+
|
68 |
+
@media only screen and (max-width: 760px)
|
69 |
+
margin: 0 auto
|
70 |
+
|
71 |
+
.vex-dialog-message, .vex-dialog-input, .vex-dialog-buttons
|
72 |
+
display: inline-block
|
73 |
+
|
74 |
+
.vex-dialog-input
|
75 |
+
min-width: 200px
|
76 |
+
margin: 0 1em
|
77 |
+
|
78 |
+
textarea, input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="month"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="time"], input[type="url"], input[type="week"]
|
79 |
+
+border-radius(3px)
|
80 |
+
background: #fff
|
81 |
+
width: 100%
|
82 |
+
padding: .25em .67em
|
83 |
+
border: 0
|
84 |
+
font-family: inherit
|
85 |
+
font-weight: inherit
|
86 |
+
font-size: inherit
|
87 |
+
min-height: 2.5em
|
88 |
+
margin: 0 0 0 0
|
89 |
+
|
90 |
+
&:focus
|
91 |
+
+box-shadow(inset 0 0 0 2px lighten($blue, 20%))
|
92 |
+
outline: none
|
93 |
+
|
94 |
+
.vex-dialog-buttons
|
95 |
+
+pie-clearfix()
|
96 |
+
|
97 |
+
input
|
98 |
+
float: none
|
99 |
+
|
100 |
+
.leadin-subscribe-powered-by
|
101 |
+
position: absolute
|
102 |
+
bottom: 0.5em
|
103 |
+
right: 0.5em
|
104 |
+
|
105 |
+
.vex-dialog-button
|
106 |
+
+border-radius(3px)
|
107 |
+
border: 0
|
108 |
+
float: right
|
109 |
+
margin: 0 0 0 .5em
|
110 |
+
font-family: inherit
|
111 |
+
text-transform: uppercase
|
112 |
+
letter-spacing: .1em
|
113 |
+
font-size: .8em
|
114 |
+
line-height: 1em
|
115 |
+
padding: .75em 2em
|
116 |
+
|
117 |
+
&.vex-last
|
118 |
+
margin-left: 0
|
119 |
+
|
120 |
+
&:focus
|
121 |
+
+vex-animation(vex-pulse 1.1s infinite)
|
122 |
+
outline: none
|
123 |
+
|
124 |
+
// vex-pulse uses -webkit-filter which
|
125 |
+
// doesn't play so nice in mobile webkit
|
126 |
+
@media (max-width: 568px)
|
127 |
+
+vex-animation(none)
|
128 |
+
|
129 |
+
&.vex-dialog-button-primary
|
130 |
+
background: $blue
|
131 |
+
color: #fff
|
132 |
+
|
133 |
+
&.vex-dialog-button-secondary
|
134 |
+
background: #e0e0e0
|
135 |
+
color: #777
|
136 |
+
|
137 |
+
.vex-loading-spinner.vex-theme-top
|
138 |
+
+box-shadow(0 0 0 .5em #f0f0f0, 0 0 1px .5em rgba(0, 0, 0, 0.3))
|
139 |
+
+border-radius(100%)
|
140 |
+
background: #f0f0f0
|
141 |
+
border: .2em solid transparent
|
142 |
+
border-top-color: #bbb
|
143 |
+
top: -1.1em
|
144 |
+
bottom: auto
|
trunk/power-ups/subscribe-widget/frontend/sass/config.rb
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Compass is a great cross-platform tool for compiling SASS.
|
2 |
+
# This compass config file will allow you to
|
3 |
+
# quickly dive right in.
|
4 |
+
# For more info about compass + SASS: http://net.tutsplus.com/tutorials/html-css-techniques/using-compass-and-sass-for-css-in-your-next-project/
|
5 |
+
|
6 |
+
require 'susy'
|
7 |
+
|
8 |
+
#########
|
9 |
+
# 1. Set this to the root of your project when deployed:
|
10 |
+
http_path = "/"
|
11 |
+
|
12 |
+
# 2. probably don't need to touch these
|
13 |
+
css_dir = "../css"
|
14 |
+
sass_dir = "./"
|
15 |
+
images_dir = "../../images"
|
16 |
+
environment = :development
|
17 |
+
relative_assets = true
|
18 |
+
|
19 |
+
|
20 |
+
# 3. You can select your preferred output style here (can be overridden via the command line):
|
21 |
+
output_style = :expanded
|
22 |
+
|
23 |
+
# 4. When you are ready to launch your WP theme comment out (3) and uncomment the line below
|
24 |
+
# output_style = :compressed
|
25 |
+
|
26 |
+
# To disable debugging comments that display the original location of your selectors. Uncomment:
|
27 |
+
# line_comments = false
|
28 |
+
|
29 |
+
# don't touch this
|
30 |
+
preferred_syntax = :sass
|
trunk/power-ups/subscribe-widget/frontend/sass/vex.sass
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import compass/css3
|
2 |
+
|
3 |
+
@import mixins
|
4 |
+
@import keyframes
|
5 |
+
|
6 |
+
@import vex-theme-default
|
7 |
+
@import vex-theme-bottom-right-corner
|
8 |
+
@import vex-theme-top
|
9 |
+
|
10 |
+
|
11 |
+
+keyframes-vex-fadein
|
12 |
+
+keyframes-vex-fadeout
|
13 |
+
|
14 |
+
+keyframes-vex-rotation
|
15 |
+
|
16 |
+
.vex, .vex *, .vex *:before, .vex *:after
|
17 |
+
+box-sizing(border-box)
|
18 |
+
|
19 |
+
.vex
|
20 |
+
position: fixed
|
21 |
+
overflow: visible
|
22 |
+
-webkit-overflow-scrolling: touch
|
23 |
+
z-index: 1111
|
24 |
+
top: 0
|
25 |
+
right: 0
|
26 |
+
bottom: 0
|
27 |
+
left: 0
|
28 |
+
|
29 |
+
// IE
|
30 |
+
.vex-overlay
|
31 |
+
background: #000
|
32 |
+
filter: alpha(opacity=40) /* IE 5–7 */
|
33 |
+
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)" /* IE 8 */
|
34 |
+
|
35 |
+
.vex-overlay
|
36 |
+
+vex-animation(vex-fadein .5s)
|
37 |
+
position: fixed
|
38 |
+
background: rgba(0, 0, 0, .4)
|
39 |
+
top: 0
|
40 |
+
right: 0
|
41 |
+
bottom: 0
|
42 |
+
left: 0
|
43 |
+
|
44 |
+
.vex.vex-closing &
|
45 |
+
+vex-animation(vex-fadeout .5s)
|
46 |
+
|
47 |
+
.vex-content
|
48 |
+
+pie-clearfix()
|
49 |
+
+vex-animation(vex-fadein .5s)
|
50 |
+
+box-shadow(0px 1px 2px rgba(0,0,0,.15))
|
51 |
+
background: #fff
|
52 |
+
|
53 |
+
.vex.vex-closing &
|
54 |
+
+vex-animation(vex-fadeout .5s)
|
55 |
+
|
56 |
+
.powered-by
|
57 |
+
display: block
|
58 |
+
font-size: 11px
|
59 |
+
color: #888
|
60 |
+
padding: 10px 0 0 0
|
61 |
+
|
62 |
+
.vex-dialog-message, .vex-dialog-input, .vex-dialog-buttons
|
63 |
+
+pie-clearfix()
|
64 |
+
font-size: 16px
|
65 |
+
|
66 |
+
.leadin-subscribe-powered-by
|
67 |
+
float: right
|
68 |
+
font-size: 12px
|
69 |
+
font-weight: bold
|
70 |
+
color: #3288e6
|
71 |
+
|
72 |
+
.vex-close:before
|
73 |
+
font-family: Arial, sans-serif
|
74 |
+
content: "\00D7"
|
75 |
+
|
76 |
+
.vex-dialog-form
|
77 |
+
margin: 0 // Browser reset
|
78 |
+
|
79 |
+
.vex-dialog-message
|
80 |
+
font-weight: bold
|
81 |
+
|
82 |
+
.vex-dialog-button
|
83 |
+
-webkit-appearance: none
|
84 |
+
cursor: pointer
|
85 |
+
+border-radius(3px)
|
86 |
+
float: right
|
87 |
+
margin: 0 0 0 .5em
|
88 |
+
font-family: inherit
|
89 |
+
text-transform: uppercase
|
90 |
+
letter-spacing: .1em
|
91 |
+
font-size: .8em
|
92 |
+
line-height: 1em
|
93 |
+
padding: .75em 2em
|
94 |
+
|
95 |
+
&.vex-last
|
96 |
+
margin-left: 0
|
97 |
+
|
98 |
+
&:focus, &:hover
|
99 |
+
outline: none
|
100 |
+
|
101 |
+
&.vex-dialog-button-primary
|
102 |
+
+box-shadow(none)
|
103 |
+
border: 0
|
104 |
+
background: $blue
|
105 |
+
color: #fff
|
106 |
+
|
107 |
+
&:hover
|
108 |
+
background: lighten($blue, 10%)
|
109 |
+
|
110 |
+
&.vex-dialog-button-secondary
|
111 |
+
+box-shadow(none)
|
112 |
+
border: 0
|
113 |
+
background: #e0e0e0
|
114 |
+
color: #777
|
115 |
+
|
116 |
+
.vex-loading-spinner
|
117 |
+
+vex-animation(vex-rotation .7s linear infinite)
|
118 |
+
+box-shadow(0 0 1em rgba(0, 0, 0, 0.1))
|
119 |
+
position: fixed
|
120 |
+
z-index: 1112
|
121 |
+
margin: auto
|
122 |
+
top: 0
|
123 |
+
right: 0
|
124 |
+
bottom: 0
|
125 |
+
left: 0
|
126 |
+
height: 2em
|
127 |
+
width: 2em
|
128 |
+
background: #fff
|
129 |
+
|
130 |
+
|
131 |
+
@media only screen and (max-width: 760px)
|
132 |
+
#leadin-subscribe-mobile-check, .leadin-subscribe-powered-by
|
133 |
+
display: none
|
trunk/readme.txt
ADDED
@@ -0,0 +1,253 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=== LeadIn ===
|
2 |
+
Contributors: andygcook, nelsonjoyce
|
3 |
+
Tags: lead tracking, visitor tracking, analytics, crm, marketing automation, inbound marketing, subscription, marketing, lead generation, mailchimp
|
4 |
+
Requires at least: 3.7
|
5 |
+
Tested up to: 3.8.2
|
6 |
+
Stable tag: 0.7.1
|
7 |
+
|
8 |
+
LeadIn is an easy-to-use marketing automation and lead tracking plugin for WordPress that helps you better understand your web site visitors.
|
9 |
+
|
10 |
+
== Description ==
|
11 |
+
|
12 |
+
= Get personal with your leads =
|
13 |
+
|
14 |
+
<a href="http://leadin.com" alt="WordPress marketing automation and lead tracking plugin">LeadIn</a> is an easy-to-use marketing automation and lead tracking plugin for WordPress that helps you better understand your web site visitors.
|
15 |
+
|
16 |
+
When a person submits a form on your WordPress site, you want to know more about them. What pages they've visited, when they return, and what social networks they’re on. Our WordPress marketing automation and lead tracking plugin gives you the details you need to make your next move. Because business isn’t business unless it’s personal.
|
17 |
+
|
18 |
+
= How does it work? =
|
19 |
+
|
20 |
+
1. When you activate the WordPress plugin, LeadIn will track each anonymous visitor to your site with a cookie. If someone closes the pop-up or subscribes, we won't show them the pop-up again.
|
21 |
+
2. Once someone fills out the subscribe form or any other other form on your site, LeadIn will identify that person with their email address.
|
22 |
+
3. You'll receive an email with a link to the new contact record with all of their visit history.
|
23 |
+
|
24 |
+
= Who's using LeadIn? =
|
25 |
+
|
26 |
+
|
27 |
+
**Alan Perlman**: *“I can use LeadIn to get a sense of how engaged certain contacts are, and I can learn more about their behavior on my website to better drive the conversation and understand what they’re interested in or looking for.”*
|
28 |
+
|
29 |
+
<a href="http://www.extremeinbound.com/leadin-wordpress-crm-inbound-plugin/">Read more from Alan</a>
|
30 |
+
|
31 |
+
|
32 |
+
**Adam W. Warner**: *“…the LeadIn plugin has been very useful so far in giving us an idea of the actual visitor paths to our contact forms vs. the paths we’ve intended.”*
|
33 |
+
|
34 |
+
<a href="http://thewpvalet.com/wordpress-lead-tracking/">Read more from Adam</a>
|
35 |
+
|
36 |
+
|
37 |
+
= Note: =
|
38 |
+
|
39 |
+
LeadIn collects usage information about this plugin so that we can better serve our customers and know what features to add. By installing and activating the LeadIn for WordPress plugin you agree to these terms.
|
40 |
+
|
41 |
+
== Installation ==
|
42 |
+
|
43 |
+
1. Upload the 'leadin' folder to the '/wp-content/plugins/' directory
|
44 |
+
2. Activate the plugin through the 'Plugins' menu in WordPress
|
45 |
+
3. Add an email address under 'LeadIn' in your settings panel
|
46 |
+
|
47 |
+
== Frequently Asked Questions ==
|
48 |
+
|
49 |
+
= How does LeadIn integrate with my forms? =
|
50 |
+
|
51 |
+
LeadIn automatically integrates with your contact and comment forms that contain an email address field on your web site. There's no setup required.
|
52 |
+
|
53 |
+
= Where are my contact submission stored? =
|
54 |
+
|
55 |
+
LeadIn creates a new contact in your Contacts Tabke whenever an email address is detected in your visitor's form submission.
|
56 |
+
|
57 |
+
There is no limit to the number of contacts you can store in your Contacts Table.
|
58 |
+
|
59 |
+
= Which contact form building plugins are supported? =
|
60 |
+
|
61 |
+
LeadIn is intended to work with any HTML form out of the box, but does not support forms created by Javascript or loaded through an iFrame.
|
62 |
+
|
63 |
+
To ensure quality we've tested the most popular WordPress form builder plugins.
|
64 |
+
|
65 |
+
= Tested + supported: =
|
66 |
+
|
67 |
+
- Contact Form 7
|
68 |
+
- JetPack
|
69 |
+
- Fast Secure Contact Form
|
70 |
+
- Contact Form
|
71 |
+
- Gravity Forms
|
72 |
+
- Formidable
|
73 |
+
- Ninja Forms
|
74 |
+
- Contact Form Clean and Simple
|
75 |
+
|
76 |
+
= Tested + unsupported: =
|
77 |
+
|
78 |
+
- Wufoo
|
79 |
+
- HubSpot
|
80 |
+
- Easy Contact Forms
|
81 |
+
- Disqus comments
|
82 |
+
|
83 |
+
== Screenshots ==
|
84 |
+
|
85 |
+
1. Individual contact history
|
86 |
+
2. Contacts list
|
87 |
+
3. Sample email report
|
88 |
+
|
89 |
+
== Changelog ==
|
90 |
+
|
91 |
+
Current version: 0.7.1
|
92 |
+
Current version release: 2014-04-11
|
93 |
+
|
94 |
+
= 0.7.1 (2014.04.11) =
|
95 |
+
-Bug fixes
|
96 |
+
- SVN bug fix that did not add the MailChimp List sync power-up
|
97 |
+
|
98 |
+
= 0.7.0 (2014.04.10) =
|
99 |
+
|
100 |
+
= Enhancements =
|
101 |
+
- MailChimp List Sync power-up
|
102 |
+
- Added new themes (bottom right, bottom left, top and pop-up) to the WordPress Subscribe Widget power-up
|
103 |
+
|
104 |
+
= 0.6.2 (2014.04.07) =
|
105 |
+
- Bug fixes
|
106 |
+
- Fixed activation error for some installs by removing error ouput
|
107 |
+
- MySQL query optimizations
|
108 |
+
- Fixed bug with MySQL V5.0+ by adding default NULL values for insert statements on contacts table
|
109 |
+
- Changed title for returning lead email notifications
|
110 |
+
- Setting to change button label on
|
111 |
+
|
112 |
+
= Enhancements =
|
113 |
+
- Added ability to change button label on subscribe widget
|
114 |
+
|
115 |
+
= 0.6.1 (2014.03.12) =
|
116 |
+
- Bug fixes
|
117 |
+
- Updated read me.txt file
|
118 |
+
- Updated screenshots
|
119 |
+
|
120 |
+
= 0.6.0 (2014.03.07) =
|
121 |
+
- Bug fixes
|
122 |
+
- Remove in-house plugin updating functionality
|
123 |
+
- Original referrer is always the server url, not the HTTP referrer
|
124 |
+
- Strip slashes from title tags
|
125 |
+
- Number of contacts does not equal leads + commenters + subscribers
|
126 |
+
- Modals aren't bound to forms after page load
|
127 |
+
- Fix bug with activating + reactivating the plugin overwriting the saved settings
|
128 |
+
- Override button styles for Subscribe Pop-up widget
|
129 |
+
|
130 |
+
= Enhancements =
|
131 |
+
- Improved readability on new lead notification emails
|
132 |
+
- Confirmation email added for new subscribers to the LeadIn Subscribe Pop-up
|
133 |
+
- Updated screenshots
|
134 |
+
- Improved onboarding flow
|
135 |
+
- Deleted unused and deprecated files
|
136 |
+
|
137 |
+
= 0.5.1 (2014.03.03) =
|
138 |
+
- Bug fixes
|
139 |
+
- Fixed Subscribe Pop-up automatically enabling itself
|
140 |
+
|
141 |
+
= 0.5.0 (2014.02.25) =
|
142 |
+
- Bug fixes
|
143 |
+
- Add (blank page title tag) to emails and contact timeline for blank page titles
|
144 |
+
- Fix link on admin nav menu bar to link to contact list
|
145 |
+
- Ignore lead notifications and subscribe popup on login page
|
146 |
+
- Saving an email no longer overwrites all the LeadIn options
|
147 |
+
- Added live chat support
|
148 |
+
|
149 |
+
= Enhancements =
|
150 |
+
- New power-ups page
|
151 |
+
- LeadIn Subscribe integrated into plugin as a power-up
|
152 |
+
- Improved contact history styling + interface
|
153 |
+
- Added visit, pageview and submission stats to the contact view
|
154 |
+
- Added Live Chat into the LeadIn WordPress admin screens
|
155 |
+
- New LeadIn icons for WordPres sidebar and admin nav menu
|
156 |
+
|
157 |
+
= 0.4.6 (2013.02.11) =
|
158 |
+
- Bug fixes
|
159 |
+
- Fix table sorting for integers
|
160 |
+
- Bug fixes to contact type headings
|
161 |
+
- Bug fix "Select All" export
|
162 |
+
- Bug fix for CSS "page views" hover triangle breaking to next line
|
163 |
+
- Backwards compability for < jQuery 1.7.0
|
164 |
+
- Add LeadIn link to admin bar
|
165 |
+
|
166 |
+
= Enhancements =
|
167 |
+
- New onboarding flow
|
168 |
+
|
169 |
+
= 0.4.5 (2013.01.30) =
|
170 |
+
= Enhancements =
|
171 |
+
- Integration with LeadIn Subscribe
|
172 |
+
|
173 |
+
= 0.4.4 (2013.01.24) =
|
174 |
+
- Bug fixes
|
175 |
+
- Bind submission tracking on buttons and images inside of forms instead of just submit input types
|
176 |
+
|
177 |
+
= Enhancements =
|
178 |
+
- Change out screenshots to obfiscate personal information
|
179 |
+
|
180 |
+
= 0.4.3 (2013.01.13) =
|
181 |
+
- Bug fixes
|
182 |
+
- Fixed LeadIn form submission inserts for comments
|
183 |
+
- Resolved various silent PHP warnings in administrative dashboard
|
184 |
+
- Fixed LeadIn updater class to be compatible with WP3.8
|
185 |
+
- Improved contact merging logic to be more reliable
|
186 |
+
|
187 |
+
= Enhancements =
|
188 |
+
- Improved onboarding flow
|
189 |
+
- Optimized form submission catching + improved performance
|
190 |
+
|
191 |
+
= 0.4.2 (2013.12.30) =
|
192 |
+
- Bug fixes
|
193 |
+
- Change 'contact' to 'lead' in the contacts table
|
194 |
+
- Fixed emails always sending to the admin_email
|
195 |
+
- Tie historical events to new lead when an email is submitted multiple times with different tracking codes
|
196 |
+
- Select leads, commenters and subscribers on distinct email addresses
|
197 |
+
- Fixed timeline order to show visit, then a form submission, then subsequent visits
|
198 |
+
|
199 |
+
= Enhancements =
|
200 |
+
- Added url for each page views in the contact timeline
|
201 |
+
- Added source for each visit event
|
202 |
+
- Tweak colors for contact timeline
|
203 |
+
- Default the LeadIn menu to the contacts page
|
204 |
+
|
205 |
+
= 0.4.1 (2013.12.18) =
|
206 |
+
- Bug fixes
|
207 |
+
- Removed LeadIn header from the contact timeline view
|
208 |
+
- Updated the wording on the menu view picker above contacts list
|
209 |
+
- Remove pre-mp6 styles if MP6 plugin is activated
|
210 |
+
- Default totals leads/comments = 0 when leads table is empty instead of printing blank integer
|
211 |
+
- Legacy visitors in table have 0 visits because session support did not exist. Default to 1
|
212 |
+
- Update ouput for the number of comments to be equal to total_comments, not total_leads
|
213 |
+
- Added border to pre-mp6 timeline events
|
214 |
+
|
215 |
+
= 0.4.0 (2013.12.16) =
|
216 |
+
- Bug fixes
|
217 |
+
- Block admin comment replies from creating a contact
|
218 |
+
- Fixed faulty sorting by Last visit + Created on dates in contacts list
|
219 |
+
|
220 |
+
= Enhancements =
|
221 |
+
- Timeline view of a contact history
|
222 |
+
- New CSS styles for contacts table
|
223 |
+
- Multiple email address support for new lead/comment emails
|
224 |
+
- Integration + testing for popular WordPress form builder plugins
|
225 |
+
- One click updates for manually hosted plugin
|
226 |
+
|
227 |
+
= 0.3.0 (2013.12.09) =
|
228 |
+
- Bug fixes
|
229 |
+
- HTML encoded page titles to fix broken HTML characters
|
230 |
+
- Strip slashes from page titles in emails
|
231 |
+
|
232 |
+
= Enhancements =
|
233 |
+
- Created separate LeadIn menu in WordPress admin
|
234 |
+
- CRM list of all contacts
|
235 |
+
- Added ability to export list of contacts
|
236 |
+
- LeadIn now distinguishes between a contact requests and comment submissions
|
237 |
+
- Added link to CRM list inside each contact/comment email
|
238 |
+
|
239 |
+
= 0.2.0 (2013.11.26) =
|
240 |
+
- Bug fixes
|
241 |
+
- Broke up page view history by session instead of days
|
242 |
+
- Fixed truncated form submission titles
|
243 |
+
- Updated email headers
|
244 |
+
|
245 |
+
= Enhancements =
|
246 |
+
- Plugin now updates upon activation and keeps record of version
|
247 |
+
- Added referral source to each session
|
248 |
+
- Added link to page for form submissions
|
249 |
+
- Updated email subject line
|
250 |
+
- Added social media avatars to emails
|
251 |
+
|
252 |
+
= 0.1.0 (2013.11.22) =
|
253 |
+
- Plugin released
|
trunk/screenshot-1.png
ADDED
Binary file
|
trunk/screenshot-2.png
ADDED
Binary file
|
trunk/screenshot-3.png
ADDED
Binary file
|